Pytest---参数化
软件测试中,输入相应值,检查期望值,是常见测试方法。
在自动化测试中,一个测试用例对应一个测试点,通常一组测试数据无法完全覆盖测试范围,所以,需要参数化来传递多组数据。
pytest的测试用例参数化使用如下装饰器即可完成
使用pytest.mark.parametrize
import pytest @pytest.mark.parametrize('a,b,c',[ (1, 2, 3), (3, 4, 6), ]) def test_answer(a, b,c): assert a +b == c
使用ids自定义测试用例标题
import pytest @pytest.mark.parametrize('a,b,c',[ (1, 2, 3), (3, 4, 6), ],ids=['1+2','3+4']) def test_answer(a, b, c): assert a +b == c
如果需要在ids传入中文的时候, 出现编码问题, 需要在conftest.py 文件里写入pytest_collection_modifyitems(items) 函数
def pytest_collection_modifyitems(items): """ 测试用例收集完成时,将收集到的item的name和nodeid的中文显示在控制台上 :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") print(item.nodeid)
多次使用Parametrize:
同一个测试用例还可以使用多个@pytest.mark,parametrize,多个parametrize的所有元素相互组合(类似于笛卡尔积),下例,使用了2个装饰器分别提供两个参数的列表,3*3=9种结合, 则产生9条测试用例
import pytest @pytest.mark.parametrize('a',[1,2,3]) @pytest.mark.parametrize('b',[1,2,3]) def test_1(a,b): print(f'测试数据为a:{a},b:{b}')
@pytest.fixture 与 @pytest.mark.parametrize 结合
如果测试数据需要在 fixture 方法中使用,同时也需要在测试用例中使用,可以在使用 parametrize 的时候添加一个参数 indirect=True,pytest 可以实现将参数传入到 fixture 方法中,也可以在当前的测试用例中使用
import pytest # 定义一组测试数据 user_data = ["admin1", "admin2"] @pytest.fixture(scope="module") def login(request): # 通过request.param获取参数 user = request.param print(f'账户:{user}') return user @pytest.mark.parametrize("login", user_data, indirect=True) #indire=True标识login是个函数,只是在这被用作了参数 def test_login(login): a = login print(f'用例中login的返回值: {a}') assert a != ''
从上边的结果可以看出当 indirect=True,会将login作为参数,user_data被当作参数传入到login方法中,生成多条测试用例。通过return将结果返回,当调用login可以获得login这个方法的返回值