8

pytest_runtest_makereport() 获取两个参数,item 和 call。从 item 中,我可以找到为此测试创建的 funcarg,从 call 中,我可以找到异常信息(如果有):

def pytest_runtest_makereport (item, call):
    my_funcarg = item.funcargs['name']
    my_funcarg.excinfo = call.excinfo

不幸的是,excinfo 被填充为失败和跳过。为了区分,我需要查看 pytest_report_teststatus() 的报告参数:

def pytest_report_teststatus (report):
    if report.when == 'call':
        if report.failed:
            failed = True
        elif report.skipped:
            skipped = True
        else:
            passed = True

这是很好的信息,但我无法将它与我为测试创建的 funcarg 相关联。我查看了报告参数(TestReport 报告),但找不到任何方法来返回传递给 pytest_runtest_makereport() 或我创建的 funcarg 的项目。

我在哪里可以访问两者?

4

2 回答 2

5

有一些未记录的有点非官方的方法,钩子实现可以与其他钩子实现交互,例如对它们的结果进行后处理。在您的具体情况下,您可能会执行以下操作:

@pytest.mark.tryfirst
def pytest_runtest_makereport(item, call, __multicall__):
    rep = __multicall__.execute()
    # your code follows and you can use rep.passed etc.
    return rep

笔记:

  • 一个钩子调用通常会调用多个钩子实现
  • “tryfirst”标记指示钩子调用让您的实现被尽早调用
  • multicall参数表示正在进行的钩子调用,可用于调用剩余的钩子实现,然后
    将其结果用于进一步处理
  • 你需要在这里返回“rep”,因为你隐藏了“真实”的创作

多重调用 API 真的很少,我怀疑可能有针对您的用例不需要它的解决方案。

HTH,霍尔格

于 2012-05-29T20:44:52.680 回答
4

虽然 hpk42 的答案有效,__multicall__但正在贬值。

但是,这实现了相同的结果:

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    rep = outcome.get_result()
    setattr(item, "rep_" + rep.when, rep)
    return rep
于 2018-03-06T02:53:13.497 回答