You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:05:09