如何让pytest将特定测试的断言失败判定为测试成功?
问题:如何标记预期失败的pytest测试用例为成功?
我在项目里用pytest写了个辅助函数,用来在多个测试里执行最终断言。代码示例如下:
tsthelper.py:
def check(obj1, obj2, *args): # 从两个对象中计算得到字符串str1和str2(使用args参数) assert str1 == str2
test_arg1.py:
from tsthelper import check def test_arg1_(): # 初始化obj1和obj2 check(obj1, obj2, arg1) def test_arg2_(): # 初始化obj1和obj2 check(obj1, obj2, arg2) ... def test_no_arg1_should_fail(): # 初始化obj1和obj2 check(obj1, obj2)
大部分测试用例能通过断言,但最后一个test_no_arg1_should_fail预期会触发断言失败。我不想用xfixture,因为那样pytest会把它统计为失败,我希望这个用例的断言失败被视为正确行为,计入成功统计。请问要给这个失败用例加什么装饰器,让它被判定为成功?
解决方案
你需要使用pytest的@pytest.mark.xfail装饰器,搭配raises和strict=True参数来实现需求。
修改后的测试用例代码如下:
import pytest from tsthelper import check # ... 其他测试用例保持不变 ... @pytest.mark.xfail(raises=AssertionError, strict=True) def test_no_arg1_should_fail(): # 初始化obj1和obj2 check(obj1, obj2)
关键参数说明:
raises=AssertionError:明确指定该测试预期会抛出断言错误,只有当触发这个类型的异常时,才会被认定为“符合预期”。如果抛出其他异常,测试依然会被标记为失败。strict=True:开启严格模式后,若测试按预期触发了AssertionError,会被标记为XFAIL(预期失败,实际失败),这类结果会被统计到成功的测试范畴内,不会拉低整体通过率;如果测试意外通过了(没有触发断言错误),则会被标记为XPASS,此时会被视为测试失败,帮你及时发现不符合预期的情况。
这样设置后,你那个预期断言失败的测试用例,在触发断言错误时会被判定为成功,完全符合你的需求。
内容的提问来源于stack exchange,提问作者halloleo
相关产品推荐
相关产品推荐

