Pytest-html 自定义报告

Pytest-html custom report

我正在使用 pytest 运行 我的测试,并使用 pytest html 生成报告。

我正在尝试在报告失败或跳过的情况下显示 error\skip 消息,使用值形式 call.excinfo.value
我注意到 pytest_runtest_makereport 被多次调用,对于 setupcallteardown,并且因为 call.excinfo.valuesetup 和 [=16 中=] 为空,它正在覆盖单元格中的消息,结果 error message 单元格为空。

所以,我尝试使用以下条件更新值 report.when == "call"
但是当 pytest_html_results_table_rowsetupteardown 上执行时我收到以下错误:

AttributeError: 'TestReport' object has no attribute 'error_message'

这是我试过的代码:

# in conftest.py
@pytest.mark.optionalhook
def pytest_html_results_table_header(cells):
    cells.insert(1, html.th('Error Message'))


@pytest.mark.optionalhook
def pytest_html_results_table_row(report, cells):
    cells.insert(1, html.td(report.error_message))



@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()
    if report.when == "call" and report.skipped or report.failed:
        report.error_message = str(call.excinfo.value) if call.excinfo else ""
   

是否有另一种方法可以在 failure\skipped 的报告中显示错误消息。
p.s:对于通过的测试,该值应为空字符串

这是我期望实现的目标: expected report

我找到了解决这个问题的方法,希望对以后的人有所帮助。
这是解决 teardown 覆盖在 call 阶段设置的值的问题的解决方法。

基本上,在 teardown 阶段之后,我用 call 阶段设置的值覆盖 error_message 中的值。

注意:请考虑到这只会显示来自 call 阶段

的错误消息
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    report = outcome.get_result()
    report.error_message = ""


    # set a report attribute for each phase of a call, which can be "setup", "call", "teardown"
    setattr(item, "rep_" + report.when, report)
    report.error_message = str(call.excinfo.value) if call.excinfo else ""
    if report.when == "teardown":
        # retrieving the error messages from the call phase
        report.error_message = item.rep_call.error_message

见附图report