9.4. pytest参数化
pytest中使用@pytest.mark.parametrize进行参数化,可以来看一下下面的例子:
import pytest
# 测试数据
data = [
{
"num1": 1,
"num2": 2,
"res": 3
},
{
"num1": 5,
"num2": 10,
"res": 15
},
{
"num1": 0.1,
"num2": 0.1,
"res": 0.2
},
{
"num1": 0.1,
"num2": 0.2,
"res": 0.3 # 这里为什么会是False可以网上看一下资料,和浮点转二进制后被截取有关系
}
]
# 被测函数
def fun_add(num_1, num_2):
return num_1 + num_2
# 测试类
class TestDemo:
@pytest.mark.parametrize('data_add', data)
def test_add(data_add):
assert fun_add(data_add['num1'], data_add['num2']) == data_add['res']
if __name__ == '__main__':
pytest.main()
test_data = [
{
'case': '登入成功',
'usr': 'admin', # 正常登入
'psw': '123456'
},
{
'case': '账号不存在',
'usr': 'admin1', # 账号不存在
'psw': '123456'
},
{
'case': '密码错误',
'usr': 'admin', # 密码错误
'psw': '12345'
},
{
'case': '账号或密码为空',
'usr': '', # 账号或密码为空
'psw': ''
},
]
@pytest.mark.parametrize('param', test_data, ids=[data.get('case') for data in test_data]) # ids需要传入一个列表,我们利用列表推导式
def test_login(param):
usr = param.get('usr')
psw = param.get('psw')
print(f'usr: {usr} , psw: {psw}')
# 调用login接口,传入usr和psw,代码省略
if __name__ == '__main__': # 定义主函数
pytest.main() # 调用pytest
解决执行过程中的一下乱码,在conftest.py文件中加上下面这块代码:
def pytest_collection_modifyitems(items):
"""
修改用例名称中文乱码
:param items:
:return:
"""
for item in items:
item.name = item.name.encode('utf-8').decode('unicode_escape')
item._nodeid = item.nodeid.encode('utf-8').decode('unicode_escape')
9.4.1. 使用fixture实现参数化
fixture提供了这么一个机制,fixture装饰的函数拥有一个内置的对象request,同时fixture中还有一个params参数是用来传递参数化数据的,直接上代码:
import pytest # 导入pytest
test_data = [
{
'case': '登入成功',
'usr': 'admin', # 正常登入
'psw': '123456'
},
{
'case': '账号不存在',
'usr': 'admin1', # 账号不存在
'psw': '123456'
},
{
'case': '密码错误',
'usr': 'admin', # 密码错误
'psw': '12345'
},
{
'case': '账号或密码为空',
'usr': '', # 账号或密码为空
'psw': ''
},
]
@pytest.fixture(params=test_data) # 给params传入参数化数据
def param_data(request):
return request.param # 返回request对象中的param,这里存放的就是参数化数据
def test_login(param_data): # 测试函数传入fixture
usr = param_data.get('usr')
psw = param_data.get('psw')
print(f'usr: {usr} , psw: {psw}')
# 调用login接口,传入usr和psw,代码省略
if __name__ == '__main__': # 定义主函数
pytest.main() # 调用pytest
fixture也给我们提供了ids的参数,用来传递用例名称,代码如下:
@pytest.fixture(params=test_data, ids=[data.get('case') for data in test_data]) # 给params传入参数化数据,ids传入case名称列表
def param_data(request):
return request.param # 返回request对象中的param,这里存放的就是参数化数据