一、pytest装饰器
参数化测试用例
@pytest.mark.parametrize
import pytest
# 定义测试函数
def test_example(param1, param2):
print(f"Testing with param1: {param1} and param2: {param2}")
assert param1 + param2 > 0
# 使用@pytest.mark.parametrize装饰器传入参数,这样是三个case,用例会执行3遍
@pytest.mark.parametrize("param1,param2", [(1, 2), (3, -2), (-5, 5)])
def test_multiple_params(param1, param2):
print(f"Testing with param1: {param1} and param2: {param2}")
assert param1 + param2 > 0
# 多个参数话,每个input都和output中的数据组成一个测试用例,例子中一共有6个用例
@pytest.mark.parametrize('input', [1, 2, 3])
@pytest.mark.parametrize("output, expected", [
(4, 5),
(6, 7)
])
def test_square(input, output, expected):
pytest.param参数化标识
在参数化测试中,每个测试用例可能包含多组参数,可能会产生大量的测试结果。为了更好地理解和调试测试结果,给每个参数化测试用例指定一个易于理解的标识是很有意义的。而 pytest.param 函数的 id 参数就能做到这一点。
import pytest
@pytest.mark.parametrize(
"input, expected",
[
pytest.param(2, 4, id="用例1"),
pytest.param(3, 9, id="用例2"),
pytest.param(5, 25, id="用例3")
]
)
def test_multiply(input, expected):
# 运行用例时,会出现id展示的unicode编码,非中文,需使用 pytest_collection_modifyitems 钩子函数,对输出的 item.name 和 item.nodeid 重新编码。
# 原因是Pytest默认将IDs视为ASCII字符串,并在测试报告中按原样显示。由于中文字符不属于ASCII字符范围,因此Pytest会将其转换为Unicode编码表示。
# conftest.py
def pytest_collection_modifyitems(items):
"""
测试用例收集完成时,将收集到的item的name和nodeid的中文显示在控制台上
"""
for item in items:
item.name = item.name.encode("utf-8").decode("unicode_escape")
item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")
参数化-传入字典数据
# test_data.py
def get_request_param():
return (
{
'param1': '1',
'param2': '2'
},
{
'param1': '3',
'param2': '4'
}
)
@pytest.mark.parametrize("dict", get_request_param(), ids=['case1', 'case2'])
def test_case(dict):
some_code(dict['param1'], dict['param2'])
二、allure装饰器
@allure.title
import allure
# 添加用例的描述,使得在报告中很清楚看到执行了哪个场景
@allure.title("这是一个case")
def test_case()
@allure.title与@pytest.mark.parametrize:
当没有加allure.title()时候,用例的描述就是 ids 用例的名称,
如果加了allure.title(),那么用例的描述就是添加的ids 用例的名称值,这两个地方取其中的一个。
三、函数
pytest.main
用于控制测试的运行方式和输
import pytest
# -s:用于显示程序中的print/logging输出,即在测试执行过程中显示任何通过print或logging产生的输出。
# -v:启用详细模式,输出更详细的用例执行信息,提供更丰富的测试结果反馈。
# -k:允许通过逻辑运算符(如and、not、or)匹配范围(如文件名、类名、函数名),执行用例名称中包含某字符段的测试。
if __name__ == '__main__':
pytest.main(['-s', '-v', '-k' 'test_cases02']) # 匹配目录名、模块名、类名、用例名,包含test_cases02的用例
pytest.main() # 运行所有用例,以test_开始或_test结尾的py