为什么你传的测试数据格式不对?

本贴最后更新于 1546 天前,其中的信息可能已经东海扬尘

在自动化测试当中,我们会以各种形式去存储测试用例数据。

比如 excel

image20200821152806845.png

比如 yaml ,

image20200821152939441.png

或者是一个 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 进行序列化:

image.png

 ```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)
 ```

说明:

 # 序列化失败
 user2 = User(username='yuz', password='123', age='not a int')
 
 user2_serial = schema.dump(user2)
 
 print(user2_serial) # 报错

反序列化(Deserialization)

反序列化是指把通用数据转化成编程语言的对象,比如把二进制流转化成对象,或者在web 应用中把 json 等通用格式转成对象。

marshmallow-03-load.png

在 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 错误

测试当中的应用

回帖
请输入回帖内容 ...