当前位置: 首页 > article >正文

深入理解 pytest_runtest_makereport:如何在 pytest 中自定义测试报告

pytest_runtest_makereport 是 pytest 系统中的一个钩子函数,它允许我们在测试执行时获取测试的报告信息。通过这个钩子,我们可以在测试运行时(无论是成功、失败还是跳过)对测试结果进一步处理,比如记录日志、添加自定义信息、生成报告等。

1、pytest_runtest_makereport 的作用
pytest_runtest_makereport 会在每个测试执行完成后被调用,并生成一个 TestReport 对象。这个对象包含了测试的执行结果,通常包括:
测试名称:测试的名称
执行结果:测试是成功(passed)、失败(failed)、跳过(skipped)还是标记为 Xfail(预期失败)
异常信息:如果测试失败或有异常,这里会包含异常的相关信息
执行时长:测试执行的时间
模块和函数信息:测试的模块、类、函数等
该钩子可以在每次测试完成后生成自定义报告或执行其他自定义操作。

2、使用 pytest_runtest_makereport
要使用 pytest_runtest_makereport,需要将它放在 conftest.py 文件中。
例如:记录每个测试的执行结果并生成日志
在 conftest.py 中定义 pytest_runtest_makereport 钩子:

@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    rep = outcome.get_result()

    if rep.when == 'call':
        if rep.failed:
            logger.error(f"Test {item.nodeid}: FAILED\n")

            if call.excinfo:
                error_message = str(call.excinfo.value)
                logger.error(f"Test {item.nodeid} failed with error: {error_message}\n")
                print('这是error_message:', error_message)

        elif rep.skipped:
            outcome_status = 'SKIPPED'
            logger.info(f"Test {item.nodeid}: {outcome_status}\n")
        else:
            outcome_status = 'PASSED'
            logger.info(f"Test {item.nodeid}: {outcome_status}\n")

3、钩子函数的参数
pytest_runtest_makereport 接收两个参数:
item:表示当前的测试项(pytest.Item 对象),它包含了测试的相关信息,如测试名称、模块、类、函数等。
call:表示测试执行的结果。它是一个包含执行过程信息的对象,通常具有以下属性:
call.excinfo:如果测试失败或出错,这里会包含异常信息。
call.result:测试的返回结果(仅在测试通过时有效)。

4、生成详细报告
可以利用 pytest_runtest_makereport 来生成更详细的测试报告。比如,将失败的测试详情写入到文件中,或者在每次测试后生成 HTML、JSON 等格式的报告。
例如:记录失败测试并输出到文件

# conftest.py

import pytest

def pytest_runtest_makereport(item, call):
    # 生成测试报告
    report = pytest.TestReport(item)
    
    # 如果测试失败,将失败信息写入到文件
    if report.failed:
        with open('failed_tests.log', 'a') as f:
            f.write(f"Test {item.nodeid} failed with error: {call.excinfo}\n")

5、获取详细的 TestReport 对象
pytest_runtest_makereport 默认返回的是一个 TestReport 对象,这个对象包含了很多关于测试的信息。可以使用它来定制测试报告。
TestReport 对象的常用属性包括:
nodeid:测试的标识符(通常是文件路径 + 测试函数名称)。
outcome:测试结果,可以是 'passed', 'failed', 'skipped' 等。
longrepr:如果测试失败,这里包含了失败的详细信息(例如堆栈跟踪)。
duration:测试的执行时长。
when:指示测试在何时执行。值可以是 'setup', 'call', 'teardown' 等,通常 call 是我们关心的测试执行阶段。
例如:打印详细的测试结果 

# conftest.py

import pytest

def pytest_runtest_makereport(item, call):
    report = pytest.TestReport(item)
    
    print(f"Test {item.nodeid} executed.")
    print(f"Outcome: {report.outcome}")
    print(f"Duration: {report.duration}")
    
    if report.outcome == 'failed':
        print(f"Failure details: {report.longrepr}")

【总结】
pytest_runtest_makereport 是一个强大的钩子函数,可以定制和扩展 pytest 的测试报告系统。通过该钩子,可以访问每个测试的详细结果,并在测试完成后执行自定义操作。这对于生成报告、日志记录、失败处理等非常有用。如果在使用 pytest 时需要更详细的报告或日志记录,pytest_runtest_makereport 是一个非常实用的工具。


http://www.kler.cn/a/470243.html

相关文章:

  • Electron使用记录
  • [Linux]Mysql9.0.1服务端脱机安装配置教程(redhat)
  • 渗透测试--Web基础漏洞利用技巧
  • 《Vue3实战教程》19:Vue3组件 v-model
  • 用 HTML5 Canvas 和 JavaScript 实现流星雨特效
  • VISRAG论文介绍:一种直接的视觉RAG
  • OKHttp调用第三方接口,响应转string报错okhttp3.internal.http.RealResponseBody@4a3d0218
  • 平安产险安徽分公司携手安徽中医药临床研究中心附属医院 共筑儿童安全防护网
  • SQLark:高效数据库连接管理的新篇章
  • 懒人不下床型遥控方案--手机对电脑的简单遥控(无收费方案)
  • jupyter执行指令的快捷键
  • 根据自己的需求安装 docker、docker-compose【2025】
  • Chapter4.3:Implementing a feed forward network with GELU activations
  • vue3+Echarts+ts实现甘特图
  • 《OpenCV 4.10.0 实例:开启图像处理新世界》
  • C#: button 防止按钮在短时间内被连续点击的方法
  • 3D内容生成技术:驱动数字世界创新的关键力量
  • OSCP - Proving Grounds - Snookums
  • 在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)
  • 头歌python实验:网络安全应用实践3-验证码识别
  • 【姿态估计实战】使用OpenCV和Mediapipe构建锻炼跟踪器【附完整源码与详细说明】
  • 【软考网工笔记】计算机基础理论与安全——网络规划与设计
  • jrc水体分类对水体二值掩码修正
  • redis各种数据类型介绍
  • SUB输入5V升压充3节12.6V升压充电管理芯片
  • react构建项目报错 `npm install --no-audit --save @testing-l