我正在调试间歇性测试失败。为此,我想在测试失败时转储大量调试信息。转储调试的过程非常缓慢,会产生大量数据,因此我不希望每次测试都这样做。
我正在使用pytest和yield autouse fixture应该工作得很好
@pytest.yield_fixture(scope="function", autouse=True)
def dump_on_failue(request):
prepare_debug_dump()
yield
if test_failed(request):
debug_dump()
问题在于我无法弄清楚如何检测测试是否失败。有a questions already甚至是on pytest website:
if request.node.rep_setup.failed:
print ("setting up a test failed!", request.node.nodeid)
elif request.node.rep_setup.passed:
if request.node.rep_call.failed:
print ("executing test failed", request.node.nodeid)
不幸的是,此代码不再有效。节点对象中没有rep_setup和rep_calls符号。我试图挖掘请求和节点对象,但没有运气。
有人知道如何检测测试是否失败?
答案 0 :(得分:0)
节点对象中没有rep_setup和rep_calls符号。
No.rep_setup和rep_calls符号仍在那里。
将此代码添加到根conftest.py
中。它将检查每个测试函数的通过/失败。
import pytest
@pytest.mark.tryfirst
def pytest_runtest_makereport(item, call, __multicall__):
rep = __multicall__.execute()
setattr(item, "rep_" + rep.when, rep)
return rep
@pytest.fixture(scope='function', autouse=True)
def test_debug_log(request):
def test_result():
if request.node.rep_setup.failed:
print ("setting up a test failed!", request.node.nodeid)
elif request.node.rep_setup.passed:
if request.node.rep_call.failed:
print ("executing test failed", request.node.nodeid)
request.addfinalizer(test_result)
答案 1 :(得分:0)
我使用类似的方法,也许对您的情况有用:
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item):
outcome = yield
rep = outcome.get_result()
if rep.failed:
if rep.when == "setup":
print("Setup failed!")
elif rep.when == "call":
print("Test method failed")
elif rep.passed and rep.when == "call":
print("Test {} passed.".format(item.name))