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

如何在pytest中记录失败测试用例并在测试类结束后通过API传递

解决pytest只记录失败测试用例的问题

你当前代码的问题在于用了request.session.testsfailed做判断——这个值是整个测试会话中累计的失败次数,只要之前有测试失败过,后面的测试哪怕执行成功,这个值也会大于0,导致所有测试用例都被加入失败列表。

要只记录当前测试用例本身的失败情况,需要借助pytest的pytest_runtest_makereport钩子获取单个测试的执行结果,再在fixture里针对性判断。修改后的代码如下:

fails = []

@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    # 捕获测试结果并存储到测试节点的属性中
    outcome = yield
    rep = outcome.get_result()
    setattr(item, "rep_" + rep.when, rep)

@pytest.fixture(scope='function')
def something(request):
    yield
    # 判断当前测试的执行阶段是否失败
    if request.node.rep_call.failed:
        print(f"I failed: {request.node.name}")
        fails.append(request.node.name)
    print('FAILED', fails)

class TestLala:
    @pytest.mark.order(1)
    def test_test1(self, something):
        assert False

    @pytest.mark.order(2)  # 注意原代码有两个重名的test_test1,这里修改避免报错
    def test_test2(self, something):
        assert True

    @pytest.mark.order(3)
    def test_test3(self, something):
        assert 4 == 4

关键说明:

  1. pytest_runtest_makereport钩子会生成每个测试的阶段报告(setup/call/teardown),我们把报告存到测试节点的属性里,方便后续调用。
  2. 在fixture的yield之后,通过request.node.rep_call.failed判断当前测试的核心执行阶段是否失败,这样只会把真正失败的用例加入列表。
  3. 原代码中存在两个重名的test_test1,pytest会识别为重复测试用例并报错,因此修改了第二个测试的名称。

内容的提问来源于stack exchange,提问作者user17948615

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:35:34