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,这里存放的就是参数化数据