pytest.mark.parametrize
装饰器可以实现测试用例参数化。
1.这里是一个实现检查一定的输入和期望输出测试功能的典型例子;
注意编写格式,第一个参数是字符串输入形参,第二个参数是数组,数组中是元祖的实参;
import pytest
@pytest.mark.parametrize("a,b",[(2+2,4),(2*3,5),("静静","静静")])
def test_add(a,b):
assert a==b
运行结果:
test_parameters.py::test_add[2-2] PASSED [ 25%]
test_parameters.py::test_add[4-4] PASSED [ 50%]
test_parameters.py::test_add[6-5] FAILED [ 75%]
test_parameters.py:1 (test_add[6-5])
6 != 5
Expected :5
Actual :6
<Click to see difference>
a = 6, b = 5
@pytest.mark.parametrize("a,b",[(2,2),(2+2,4),(2*3,5),("静静","静静")])
def test_add(a,b):
> assert a==b
E assert 6 == 5
test_parameters.py:5: AssertionError
test_parameters.py::test_add[\u9759\u9759-\u9759\u9759] PASSED [100%]
2.它也可以标记单个测试实例在参数化,例如使用内置的mark.xfail
import pytest
@pytest.mark.parametrize("a,b",[(2+2,4),(2*3,6),
pytest.param("2+4",6,marks = pytest.mark.xfail)])
def test_add(a,b):
assert a==b
运行结果:
test_parameters.py::test_add[4-4]
test_parameters.py::test_add[6-6]
test_parameters.py::test_add[2+4-6]
======================== 2 passed, 1 xfailed in 0.06s =========================
Process finished with exit code 0
PASSED [ 33%]PASSED [ 66%]XFAIL [100%]
a = '2+4', b = 6
@pytest.mark.parametrize("a,b",[(2+2,4),(2*3,6),
pytest.param("2+4",6,marks = pytest.mark.xfail)])
def test_add(a,b):
> assert a==b
E AssertionError: assert '2+4' == 6
test_parameters.py:6: AssertionError
标记为失败的用例,预期结果是失败,实际运行也是失败,显示xfailed
参数组合
1.若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器
import pytest
@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", "test_para02.py"])
- 运行结果:
test_para02.py::test_foo[2-0] PASSED [ 25%]测试数据组合:x->0, y->2
test_para02.py::test_foo[2-1] PASSED [ 50%]测试数据组合:x->1, y->2
test_para02.py::test_foo[3-0] PASSED [ 75%]测试数据组合:x->0, y->3
test_para02.py::test_foo[3-1] PASSED [100%]测试数据组合:x->1, y->3
============================== 4 passed in 0.02s ==============================