一、简介
当因为一个确切的原因,我们知道这个用例会执行失败,比如用例所覆盖的功能还未实现,或者这个功能存在阻塞性的已知Bug时,就可以使用xfail将其标记起来。
二、xfail的使用方法
1、@pytest.mark.xfail装饰器
可以使用@pytest.mark.xfail标记用例,表示期望这个用例执行失败。标记后的用例会正常执行,只是失败时不再显示堆栈信息,最终的结果有两个:用例执行失败时(XFAIL:符合预期的失败)、用例执行成功时(XPASS:不符合预期的成功)
pytest.mark.xfail(condition=None, *, reason=None, raises=None, run=True, strict=False)
-
condition位置参数,默认值为None,表示只有满足条件时才标记用例;
-
reason关键字参数,默认值为None,表示可以指定一个reason字符串,说明标记用例的原因;
-
strict关键字参数,默认值为False
当strict=False时,如果用例执行失败,结果标记为XFAIL,表示符合预期的失败;如果用例执行成功,结果标记为XPASS,表示不符合预期的成功;
当strict=True时,如果用例执行成功,结果将标记为FAILED;
-
raises关键字参数,默认值为None
可以指定为一个异常类或者多个异常类的元组,表示我们期望用例上报指定的异常;
如果用例的失败不是因为所期望的异常导致的,pytest将会把测试结果标记为FAILED;
-
run关键字参数,默认值为True:
当run=False时,pytest不会再执行测试用例,直接将结果标记为XFAIL;
2、pytest.xfail方法
我们也可以通过pytest.xfail方法在用例执行过程中直接标记用例结果为XFAIL,并跳过剩余的部分:
def test_aaa():
if not meet():
pytest.xfail("failing configuration (but should work)")
3、结合@pytest.mark.parametrize装饰器使用
import pytest
import sys
@pytest.mark.parametrize(('n', 'expected'),
[(2, 1),
pytest.param(2, 1, marks=pytest.mark.xfail(), id='XPASS'),
pytest.param(0, 1, marks=pytest.mark.xfail(raises=ZeroDivisionError), id='XFAIL'),
pytest.param(1, 2, marks=pytest.mark.skip(reason='无效的参数,跳过执行')),
pytest.param(1, 2, marks=pytest.mark.skipif(sys.version_info <= (3, 8), reason='请使用3.8及以上版本的python。'))])
def test_bbb(n, expected):
assert 2 * n == expected
三、执行方法
pytest默认不显示xfail用例的详细信息,我们可以通过-r选项使其显示出来;
通常一个字母代表一种类型,具体的规则如下:
(f)ailed, (E)rror, (s)kipped, (x)failed, (X)passed, (p)assed, (P)assed with output, (a)ll except passed(p/P), or (A)ll
所以,使用pytest -rxX 方式执行,能够显示结果为XFAIL和XPASS用例的详细信息。