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

embedded/2025/1/11 8:51:40/

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 = yieldrep = 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.pyimport pytestdef 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.pyimport pytestdef 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.ppmy.cn/embedded/152961.html

相关文章

HTML5 加载动画(Loading Animation)

加载动画(Loading Animation)详解 概述 加载动画是指在数据加载过程中,向用户展示的一种视觉效果,旨在提升用户体验,告知用户系统正在处理请求。它可以减少用户的等待焦虑感,提高界面的互动性。 常见的加…

集成Log4j2以及异步日志

文章目录 1.环境搭建1.在sunrays-common下创建一个单独的模块2.依赖关系1.继承父模块的版本和通用依赖 3.创建自动配置相关1.目录2.pom.xml3.Log4j2AutoConfiguration.java 自动配置类4.META-INF/spring.factories 指定自动配置类 2.集成Log4j2以及异步日志1.目录2.引入依赖3.l…

Nacos server 2.4.0 版本已知问题和 Bug 汇总

Nacos server 2.4.0 版本已知问题和 Bug 汇总 核心功能问题 集群模式下的数据一致性问题 在特定条件下,可能出现节点间数据同步延迟某些情况下会出现脑裂现象Issue #9876: 数据同步时可能出现死锁 内存泄漏问题 长时间运行后可能出现内存泄漏当配置变更频繁时&…

Dart语言的数据结构

Dart 语言中的数据结构 Dart 是一种现代化的编程语言,广泛用于构建高效、逻辑清晰的移动、Web 和服务器端应用程序。作为一种面向对象的语言,Dart 提供了一系列强大的数据结构,帮助开发者更高效地管理和操作数据。在本文中,我们将…

【SpringAOP】Spring AOP 底层逻辑:切点表达式与原理简明阐述

前言 🌟🌟本期讲解关于spring aop的切面表达式和自身实现原理介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 &am…

shell的练习

192. 统计词频 - 力扣(LeetCode) 写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的 频率 。 为了简单起见,你可以假设: words.txt只包括小写字母和 。每个单词只由小写字母组成。单词间由一个或多个空格字符…

【JavaEE】—— SpringBoot项目集成百度千帆AI大模型(对话Chat V2)

本篇文章在SpringBoot项目中集成百度千帆提供的大模型接口实现Chat问答效果: 一、百度智能云 百度千帆大模型平台是百度智能云推出的一个企业级一站式大模型与AI原生应用开发及服务平台。 注册地址:https://qianfan.cloud.baidu.com/ 注册成功后&…

手机租赁平台开发全解析 让租赁变得更简单便捷

内容概要 手机租赁市场近年来发展迅猛,越来越多的人开始依赖租赁服务来满足他们对智能设备的需求。要知道,这可不仅仅是为了省钱,还是为了体验最新科技的便捷方式。 让我们一起探索这个扬帆起航的市场吧! 在开发一个高效的手机租…