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

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

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

本文由柠檬班雨泽老师原创,转载需注明出处!

想了解更多咨询的同学扫描下方二维码,可以加Q群领取学习资料:753665853  备注:CSDN

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要手写批量造测试数据的工具,你需要考虑以下几点: 1. 数据格式:确定测试数据格式,比如是文本、数字、日期等,以及数据的长度、范围等。 2. 数据规模:确定测试数据的数量,以及每种数据类型的数量。 3. 数据生成算法:根据需求编写数据生成算法,可以使用随机数生成器、模拟数据生成器等方式。 4. 数据输出:将生成的测试数据输出为文件或者数据库,方便后续的测试使用。 下面是一个简单的示例: ```python import random # 生成随机字符串 def random_string(length): letters = "abcdefghijklmnopqrstuvwxyz" return ''.join(random.choice(letters) for i in range(length)) # 生成随机数字 def random_number(min_value, max_value): return random.randint(min_value, max_value) # 生成随机日期 def random_date(start, end): return start + (end - start) * random.random() # 生成测试数据 def generate_test_data(filename, num_rows): with open(filename, 'w') as f: for i in range(num_rows): row = [] row.append(random_string(10)) row.append(random_number(1, 100)) row.append(random_date(1, 365)) f.write(','.join(str(x) for x in row) + '\n') # 生成100行测试数据 generate_test_data('test_data.csv', 100) ``` 这段代码可以生成100行测试数据,每行包含一个长度为10的随机字符串、一个1~100的随机数字和一个1~365的随机日期,数据以逗号分隔,输出到文件test_data.csv中。你可以根据需要自行修改数据格式、数量和生成算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值