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这个方法的返回值

posted @ 2021-12-01 13:34  ElsaWang  阅读(149)  评论(0)    收藏  举报