【问题标题】:Detect whether test has failed within fixture检测夹具内的测试是否失败
【发布时间】:2016-11-13 07:21:18
【问题描述】:

我正在调试间歇性测试失败。为此,如果测试失败,我想转储大量调试信息。转储调试内容是一个非常缓慢的过程,会产生大量数据,所以我不想在每次测试时都这样做。

我正在使用 pytest 和 yield autouse 夹具应该很好用

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

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

【问题讨论】:

  • 您列出的示例中的pytest_runtest_makereport 挂钩添加 那些rep_* 属性。你确定你也添加了?
  • 这个答案stackoverflow.com/a/51830008/3162884 解释了如何使用 pytest_runtest_makereport 以便创建 rep_*

标签: testing pytest


【解决方案1】:

节点对象中没有 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)

【讨论】:

    【解决方案2】:

    我使用这样的东西,也许它对你的情况有用:

    @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))
    

    【讨论】:

      猜你喜欢
      • 2013-08-30
      • 1970-01-01
      • 2016-08-08
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 2013-08-26
      相关资源
      最近更新 更多