检测夹具内的测试是否失败

时间:2016-07-11 11:05:32

标签: testing pytest

我正在调试间歇性测试失败。为此,我想在测试失败时转储大量调试信息。转储调试的过程非常缓慢,会产生大量数据,因此我不希望每次测试都这样做。

我正在使用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符号。我试图挖掘请求和节点对象,但没有运气。

有人知道如何检测测试是否失败?

2 个答案:

答案 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))