软件质量保障
专注测试圈,自动化测试、测试平台开发、测试新技术、大厂测试岗面经分享, 可以帮忙内推BATJ等大厂!欢迎加VX沟通交流: ISTE1024
zip()函数是Python的内置函数(build-in),参数为可迭代的对象,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
a = [1,2,3]
b = [4,5,6]
print(zip(a,b))
print(list(zip(a,b)))
>> <zip object at 0x7fd7a01d9b80>
[(1, 4), (2, 5), (3, 6)]
a1, a2 = zip(*zip(a,b))
print(a1)
print(a2)
>>(1, 2, 3)
(4, 5, 6)
而pytest的装饰器@pytest.mark.parametrize('参数名',list) 进行参数化所需的数据结构则是list;如果有多个参数名,则@pytest.mark.parametrize('参数名1,参数名2',[(参数1_data[0], 参数2_data[0]),(参数1_data[1], 参数2_data[1])]) 进行参数化的数据结构为[(参数1, 参数2),(参数1, 参数2)],这个结构则可以通过zip()函数生成。参考如下例子:
参考:Pytest系列(7)-数据驱动测试DDT
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : test_param_pytest.py
@Time : 2021/06/12 12:58:42
@Author : 软件质量保障
wechat : ISTE1024
@Email : byteflow@163.com
@Blog : https://www.zhihu.com/people/iloverain1024
@Copyright : 侵权必究
'''
import pytest
class Test():
# 多参数传值
@pytest.mark.parametrize("user, pwd", [("xiaoming",111111),("xiaohua",111111)])
def test_002(self, user, pwd):
print(user)
assert user == 'xiaohua'
assert pwd == 111111
所以,zip()函数结合@pytest.mark.parametrize装饰器,可以很好地实现DDT。只需将yaml中的测试数据经过zip()函数处理即可。
具体操作如下:
-
定义测试数据TEST_DATA_001.yaml文件。
- case: 测试登陆查询回答内容
http:
method: POST
path: https://account.xinli001.com/login?next=https://www.xinli001.com/user
headers:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
body:
password: xxxxxxxxxx
username: 软件质量保障
expected:
response:
message: 登陆成功
code: 0
-
通过PyYAML对数据进行数据解析
-
def get_test_data(test_data_path:
case = [] # 存储测试用例名称
http = [] # 存储请求对象
expected = [] # 存储预期结果
data = yaml.safe_load(open(test_data_path, encoding='utf-8'))
# test = data['tests']
for td in data:
case.append(td.get('case', ''))
http.append(td.get('http', {}))
expected.append(td.get('expected', {}))
parameters = zip(case, http, expected)
return list(parameters)
3. 结合装饰器@pytest.mark.parametrize
@pytest.mark.parametrize("case, http, expected", get_test_data('TEST_DATA_001.yaml'))
def test_main(case, http, expected, login):
# 发起请求
query_res = login.httpcore(method, url=url, headers=headers, data=body)
print(query_res.json())
# 断言
assert query_res.json()['code'] == expected['response']['code']
喜欢就点个在看再走吧
往期推荐
接口测试框架开发实践4:HTTP方法封装
接口测试框架开发实践3:用例管理模块
经验分享|测试工程师转型测试开发历程
接口测试框架开发实践5:配置文件读取
接口测试框架开发实践2:接口自动化测试框架设计思路
接口自动化测试框架实践1:接口测试概述
Pytest系列(7)-数据驱动测试DDT
|