如何在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
关键说明:
pytest_runtest_makereport钩子会生成每个测试的阶段报告(setup/call/teardown),我们把报告存到测试节点的属性里,方便后续调用。- 在fixture的
yield之后,通过request.node.rep_call.failed判断当前测试的核心执行阶段是否失败,这样只会把真正失败的用例加入列表。 - 原代码中存在两个重名的
test_test1,pytest会识别为重复测试用例并报错,因此修改了第二个测试的名称。
内容的提问来源于stack exchange,提问作者user17948615
相关产品推荐
相关产品推荐

