0

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

我正在尝试使用值形式显示错误\跳过消息以防失败或在报告中跳过call.excinfo.value
我注意到它pytest_runtest_makereport被多次调用,for和setup,并且由于in和为空,它正在覆盖单元格中的消息,因此单元格为空。callteardowncall.excinfo.valuesetupteardownerror 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 ""
   

是否有另一种方法可以在失败\跳过的报告中显示错误消息。
ps:对于通过的测试,该值应该是一个空字符串

这是我期望实现的目标: 预期报告

4

1 回答 1

0

我找到了解决这个问题的方法,我希望它对将来的人有所帮助。
这是处理teardown覆盖阶段期间设置的值的问题的解决方法call

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

注意:请注意,这只会显示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

见附图片报告

于 2021-03-03T11:08:38.057 回答