首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【测试用例】为什么你传的测试数据格式不对?

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

比如 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,使用序列化。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200825A08LJM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券