我可以在哪个py.test标注中找到'item'和'report'数据?

时间:2012-05-25 13:06:08

标签: python pytest

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。

我在哪里可以访问这两个?

2 个答案:

答案 0 :(得分:7)

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

@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”,因为你影响了“真正的”创造

multicall API实际上很少,我怀疑可能有针对您的用例的解决方案,不需要它。

HTH,Holger

答案 1 :(得分:1)

虽然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