在自动化测试当中,我们会以各种形式去存储测试用例数据。
比如 excel
比如 yaml ,
或者是一个 py 文件:
test_info = {
"case_id": 1,
"username": "yuz",
"password": "123"
}
不管是通过什么格式得到数据,最终都会被转成一个编程语言能够识别的对象。 比如在 python 当中进行接口测试,上面的数据最终可以转换成 python 的字典对象。
import requests
resp = requests.post('http://..', test_info)
同时,在其他数据转成 python 对象的时候,我们还可能对数据进行校验,比如不能有其他的字段传入,如果传入其他的字段,就要在数据传入之前过滤掉。
使用 marshmallow 序列化和数据校验
marshmallow 是一个非常优秀的 python 序列化工具,也能进行数据校验。 marshmallow 吸收了 django rest framework, flask restful 等优秀框架的思想,api 简单易用,不和任何平台或框架绑定。
只要是在 python 当中进行序列化或者数据校验,都可以考虑 marshmallow。
序列化(Serialization)
序列化是指把编程语言的对象转化成通用的数据,比如把对象转化成二进制流,或者在web 应用中把对象转化成 json 等通用格式,在 marshmallow 中用 dump 进行序列化。
使用 marshmallow 进行序列化:
- 1,编写 Schema ,用于数据转化
- 2,准备需要序列化的对象
- 3,使用 marshmallow.dump 进行序列化
```python
from marshmallow import schema, fields
class User:
def __init__(self, username, password, age):
self.username = username
self.password = password
self.age = age
def __repr__(self):
return f"User"
class UserSchema(schema.Schema):
username = fields.Str()
password = fields.Str()
age = fields.Int()
schema = UserSchema()
user1 = User(username='yuz', password='123', age=14)
# 序列化成功
user1_serial = schema.dump(user1)
print(user1_serial)
```
说明:
- UserSchema 中的字段名称和 User 的属性名称一致
- fields.Str() 表示字段必须能够转化成字符串。fields.Int() 必须能转化成整型
- 当因为 fields 类型不满足序列化失败的时候,会抛出 ValueError 异常
# 序列化失败
user2 = User(username='yuz', password='123', age='not a int')
user2_serial = schema.dump(user2)
print(user2_serial) # 报错
反序列化(Deserialization)
反序列化是指把通用数据转化成编程语言的对象,比如把二进制流转化成对象,或者在web 应用中把 json 等通用格式转成对象。
在 marshmallow 中,load 方法默认会对字典进行校验,转化后还是字典,只起到了数据校验的作用。
如果是要对 json 字符串进行校验,可以使用 loads 方法。
# dict to dict
user_from_dict = {"username": "yuz", "password": "123"}
schema = UserSchema()
user = schema.load(user_from_dict)
print(user)
# json string to dict
json_user = '{"username": "yuz", "password": "123"}'
schema = UserSchema()
user = schema.loads(json_user)
print(user)
required 参数
在进行反序列化中,必须要有相关字段,否则无法转化成对应的对象,可以把 schema 当中的字段都设置成 required。当没有传入相关字段时,在初始化 User 之前就会包 ValidatrionError 错误。
from marshmallow import post_load, schema, ValidationError
class UserSchema(schema.Schema):
username = fields.Str(required=True)
password = fields.Str(required=True)
age = fields.Int(required=True)
@post_load
def load_to_orm(self, value, **kwargs):
return User(**value)
user_from_dict = {"username": "yuz", "password": "123"}
schema = UserSchema()
user = schema.load(user_from_dict)
print(user) # 报 ValidationError 错误
测试当中的应用
- 如果你的测试数据存在外部,可以使用反序列化转成 python 对象,并且会对数据进行校验
- 如果你已经有 python 对象,需要转化成通用格式比如 json,使用序列化。
欢迎来到testingpai.com!
注册 关于