xfail 函数文档如下:
def xfail(self,condition=None, reason=None, raises=None, run=True, strict=False): """mark the the test function as an expected failure if eval(self,condition) has a True value. # 将eval(self,condition)为真的测试函数标记为失败。 Optionally specify a reason for better reporting and run=False if you don't even want to execute the test function. # 不想执行某个测试功能,可以指定 run=False,可以自定义错误原因 reason=‘’ See http://doc.pytest.org/en/latest/skipping.html # 官方文档说明 """
xfail 作用:
1)xfail意味着你期望测试由于某种原因失败。常见的示例是对尚未实现的功能或尚未修复的错误进行测试。
2)当预期失败时(标记为pytest.mark.xfail
),但实际测试通过,标记为xpass,用 x 标记代替 F,但无错误信息输出,将在测试摘要中报告
3)使用 pytest.xfail(reason) 从用例中强制标记测试。
4)通过 -r 显示 xfail、skip 详细信息 pytest -r
5)忽略xfail:
pytest --runxfail
1)直接使用 @pytest.mark.xfail
# File : test_demo_10_xfail.py # IDE : PyCharm import pytest def division(a, b): return int(a / b) @pytest.mark.xfail @pytest.mark.parametrize('a, b, c', [(4, 2, 2), (0, 2, 0), pytest.param(1, 0, 0, marks=pytest.mark.xfail), (6, 8, 0)], ids=['整除', '被除数为0', '除数为0', '非整除']) def test_1(a, b, c): res = division(a, b) assert res == c
执行(使用xfail标记的用例仍然会执行):
- xfailed 为失败的用例,小写 x
- xpassed 为通过的用例,大写 X
E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py test_demo_10_xfail.py::test_1[整除] test_demo_10_xfail.py::test_1[被除数为0] test_demo_10_xfail.py::test_1[除数为0] test_demo_10_xfail.py::test_1[非整除] XXxX 1 xfailed, 3 xpassed in 0.12s Process finished with exit code 0
2)condition 为False执行标记的代码块,True则标记 xpass
@pytest.mark.xfail(condition=True, reason='xfail标记') @pytest.mark.parametrize('a, b, c', [(4, 2, 2), (0, 2, 0), pytest.param(1, 0, 0, marks=pytest.mark.xfail), (6, 8, 0)], ids=['整除', '被除数为0', '除数为0', '非整除']) def test_1(a, b, c): res = division(a, b) assert res == c
执行:
E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py test_demo_10_xfail.py::test_1[整除] test_demo_10_xfail.py::test_1[被除数为0] test_demo_10_xfail.py::test_1[除数为0] test_demo_10_xfail.py::test_1[非整除] test_demo_10_xfail.py::test_2 XXxX. 1 passed, 1 xfailed, 3 xpassed in 0.14s Process finished with exit code 0
3)raises 具体原因,python标准错误类型,可以在raises参数中指定单个异常或异常组
- 如果测试失败且没有提到指定的异常,则报告failed
- 如果测试失败,raises 报告的异常与失败异常一致,则标记为 xfailed
@pytest.mark.xfail(raises=AssertionError) def test_03(): assert 3 == 4 @pytest.mark.xfail(raises=ValueError) def test_04(): if isinstance('1234', int) is False: raise TypeError("传入参数非整数")
E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py test_demo_10_xfail.py::test_03 test_demo_10_xfail.py::test_04 xF ================================== FAILURES =================================== ___________________________________ test_04 ___________________________________ @pytest.mark.xfail(raises=ValueError) def test_04(): if isinstance('1234', int) is False: > raise TypeError("传入参数非整数") E TypeError: 传入参数非整数 test_demo_10_xfail.py:41: TypeError =========================== short test summary info =========================== FAILED test_demo_10_xfail.py::test_04 - TypeError: 传入参数非整数 1 failed, 1 xfailed in 0.14s Process finished with exit code 0
4)run=False 直接标记为xfail,且不执行,防止在xfail死循环(默认为True执行用例)
@pytest.mark.xfail(run=False) @pytest.mark.parametrize('a, b, c', [(4, 2, 2), (0, 2, 0), pytest.param(1, 0, 0, marks=pytest.mark.xfail), (6, 8, 0)], ids=['整除', '被除数为0', '除数为0', '非整除']) def test_1(a, b, c): res = division(a, b) assert res == c
E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py test_demo_10_xfail.py::test_1[整除] test_demo_10_xfail.py::test_1[被除数为0] test_demo_10_xfail.py::test_1[除数为0] test_demo_10_xfail.py::test_1[非整除] xxxx 4 xfailed in 0.27s Process finished with exit code 0
5)strict=True 会使产生了 xpass 的用例,标记为测试失败(默认False则标记通过)
@pytest.mark.xfail(strict=True) def test_05(): assert 3 == 3
执行结果(只要 strict=True 的用例均会失败):
E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py test_demo_10_xfail.py::test_05 F ================================== FAILURES =================================== ___________________________________ test_05 ___________________________________ [XPASS(strict)] =========================== short test summary info =========================== FAILED test_demo_10_xfail.py::test_05 1 failed in 0.07s Process finished with exit code 0
5)在 parametrize 中使用 marks=pytest.mark.xfail
@pytest.mark.parametrize('a, b, c', [(4, 2, 2), (0, 2, 0), pytest.param(1, 0, 0, marks=pytest.mark.xfail), (6, 8, 0)], ids=['整除', '被除数为0', '除数为0', '非整除'])
def test_1(a, b, c):
res = division(a, b)
assert res == c
E:personalpython38python.exe E:/personal/GitWorkSpace/pytest_basic/main.py
test_demo_10.py::test_1[整除]
test_demo_10.py::test_1[被除数为0]
test_demo_10.py::test_1[除数为0]
test_demo_10.py::test_1[非整除]
..x.
3 passed, 1 xfailed in 0.14s