Python Pytest中@pytest.mark.parametrize参数化装饰器详解
本文详解Python测试框架Pytest中@pytest.mark.parametrize装饰器的使用方法。通过该装饰器可实现测试用例的参数化,支持单参数多值及多参数组合场景。文章介绍了参数定义格式、数据传递方式及代码示例,帮助开发者高效构建灵活的自动化测试脚本。
pytest.mark.parametrize装饰器基础用法
在Pytest测试框架中,装饰器@pytest.mark.parametrize('参数名', list)可用于实现测试用例的参数化功能,其作用类似于DDT(Data-Driven Tests)模式。例如,可以通过该装饰器指定请求方式、接口地址、传参内容及预期结果等多组数据,如:@pytest.mark.parametrize('请求方式,接口地址,传参,预期结果',[('get','www.baidu.com','{"page":1}','{"code":0,"msg":"成功"})',('post','www.baidu.com','{"page":2}','{"code":0,"msg":"成功"}')])。
参数定义与数据传递规则
使用该装饰器时,第一个参数必须为字符串格式。若需传递多个参数,各参数名之间需使用逗号进行分隔。
第二个参数应为列表(list)类型,其中包含多组测试数据,每组数据以元组(tuple)形式表示。当需要传递三个或更多参数时,传递方式保持一致。列表中的每个元素均为一个元组,且元组内的各个元素需按照参数定义的顺序一一对应。
当仅需传递单个参数时,使用语法@pytest.mark.parametrize('参数名',list)即可完成参数化配置。
若需传递两个参数,可采用语法@pytest.mark.parametrize('参数名1,参数2',[(参数1_data[0], 参数2_data[0]),(参数1_data[1], 参数2_data[1])])进行参数化设置。
代码示例与运行结果分析
import pytest
#单参数单值
@pytest.mark.parametrize("user",["18221124104"])
def test(user):
print(user)
assert user=="18221124104"
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 1 item
test03.py 18221124104
.
============================== 1 passed in 0.15s ==============================
Process finished with exit code 0
#单参数多值
@pytest.mark.parametrize("user",["18221124104","18200000000","18200000001"])
def test(user):
print(user)
assert user=="18221124104"
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 3 items
test03.py 18221124104
.18200000000
F18200000001
F
================================== FAILURES ===================================
______________________________ test[18200000000] ______________________________
user = '18200000000'
@pytest.mark.parametrize("user",["18221124104","18200000000","18200000001"])
def test(user):
print(user)
> assert user=="18221124104"
E AssertionError
test03.py:74: AssertionError
______________________________ test[18200000001] ______________________________
user = '18200000001'
@pytest.mark.parametrize("user",["18221124104","18200000000","18200000001"])
def test(user):
print(user)
> assert user=="18221124104"
E AssertionError
test03.py:74: AssertionError
========================= 2 failed, 1 passed in 0.21s =========================
Process finished with exit code 0
#多参数多值
@pytest.mark.parametrize("user,pwd",[("18221124104",111111),("18200000000",111111)])
def test(user,pwd):
print(user,pwd)
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 2 items
test03.py 18221124104 111111
.18200000000 111111
.
============================== 2 passed in 0.03s ==============================
Process finished with exit code 0
# 使用内置的mark.xfail标记为失败的用例就不运行了,直接跳过显示xfailed
@pytest.mark.parametrize("user,pwd",[("18221124104",111111),pytest.param("18200000000",111111,marks=pytest.mark.xfail)])
def test(user,pwd):
print(user,pwd)
assert user == "18221124104"
assert pwd== 111111
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 2 items
test03.py 18221124104 111111
.18200000000 111111
x
======================== 1 passed, 1 xfailed in 0.14s =========================
Process finished with exit code 0
#若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器
@pytest.mark.parametrize("x", [0, 1])
@pytest.mark.parametrize("y", [2, 3])
def test_foo(x, y):
print("测试数据组合:x->%s, y->%s" % (x, y))
if __name__=="__main__":
pytest.main(["-s","test03.py"])
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 4 items
test03.py 测试数据组合:x->0, y->2
.测试数据组合:x->1, y->2
.测试数据组合:x->0, y->3
.测试数据组合:x->1, y->3
.
============================== 4 passed in 0.03s ==============================
Process finished with exit code 0
以上就是关于Python Pytest装饰器@pytest.mark.parametrize的详细解析。如需了解更多关于pytest.mark.parametrize的相关内容,建议查阅本站过往文章或继续浏览后续教程,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









