深入理解 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 = 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.mzph.cn/diannao/66398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

w~自动驾驶~合集16

我自己的原文哦~ https://blog.51cto.com/whaosoft/12765612 #SIMPL 用于自动驾驶的简单高效的多智能体运动预测基准 原标题:SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 论文链接:https://ar…

外驱功率管电流型PWM控制芯片CRE6281B1

CRE6281B1 是一款外驱功率管的高度集成的电流型PWM 控制 IC,为高性能、低待机功率、低成本、高效率的隔离型反激式开关电源控制器。在满载时,CRE6281B1工作在固定频率(65kHz)模式。在负载较低时,CRE6281B1采用节能模式,实现较高的…

2025年安卓面试复习总结

文章目录 深入理解并熟练运用常用设计模式及反射原理,能够自定义注解及泛型,多次通过设计模式对 app 代码进行高效重构,显著提升代码的可维护性与扩展性。设计模式自定义注解泛型Kotlin泛型 精通多线程原理,对 ThreadPoolExecutor…

【微服务】SpringBoot 整合Redis实现延时任务处理使用详解

目录 一、前言 二、延迟任务的高频使用场景 三、延迟任务常用解决方案 3.1 Quartz 3.2 DelayQueue 3.2.1 Timer + TimerTask 3.2.2 ScheduledExecutorService 3.3 Redis sorted set 3.4 RabbitMQ 四、Redis实现延时队列操作实战 4.1 Redis Sorted Set 概述 4.1.1 Re…

加固服务器有什么用?

为什么越来越多的企业和个人都在加固他们的服务器?加固服务器不仅可以保护数据安全,还能提升整体系统的稳定性和可靠性。下面是聚名网的一些介绍。 加固服务器的首要目的就是提高安全性。随着网络攻击手段的不断演变,黑客和恶意软件的威胁也…

web移动端UI框架

文章目录 Vant简介主要特点和功能适用场景和用户评价 Mint UI简介主要特点和功能 cube-ui简介特性 iView Weapp简介 uni-app简介 Vant 使用vue3版本官网:https://vant-ui.github.io/vant/#/zh-CN/ 适用vue2版本官网:https://vant-ui.github.io/vant/v2/…

亚信安全2025年第1期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件51起,本周勒索事件数量降至近一年来最低,需注意防范。从整体上看Ransomhub依旧是影响最严重的勒索家族;本周Acrusmedia和Safepay也是两个活动频繁的恶意家族,需要注意防范。本周&#…

git①111

如果你只想提交并推送一个文件,而不是所有修改过的文件,可以按照以下步骤进行操作: 步骤: 1.查看当前修改的文件: 使用 git status 来查看哪些文件被修改了。 git status 你会看到类似以下的输出,列出了…

linux网络 | http结尾、理解长连接短链接与cookie

前言:本节是http章节的最后一部分,主要解释一些小概念。讲解到了HTTP的方法,表单, 重定向等等。 现在废话不多说, 开始我们的学习吧。 ps:本节内容都是概念, 知道就行, 友友们放心观…

韩国机场WebGIS可视化集合Google遥感影像分析

目录 前言 一、相关基础数据介绍 1、韩国的机场信息 2、空间数据准备 二、Leaflet叠加Google地图 1、叠加google地图 2、空间点的标记及展示 3、韩国机场空间分布 三、相关成果展示 1、务安国际机场 2、有同类问题的机场 四、总结 前言 12月29日8时57分左右务安国际机…

基于Django的农业管理系统

一、系统背景与意义 随着信息技术的不断发展,农业生产也逐渐向智能化、信息化转型。基于Django的农业管理系统正是为了满足这一需求而设计的。该系统通过集成先进的信息技术,旨在提升农业生产效率,优化资源配置,减少人工干预&…

后台管理系统引导功能的实现

引导是软件中经常见到的一个功能,无论是在后台项目还是前台或者是移动端项目中。 那么对于引导页而言,它是如何实现的呢?通常情况下引导页是通过 聚焦 的方式,高亮一块视图,然后通过文字解释的形式来告知用户该功能的作…

nuxt3访问localstorage,sessionStorage

nuxt3在客户端的时候可以正常使用localstorage,sessionStorage,但是如果在服务端,是没有这些方法的,这个时候可以把数据存到cookie里,通过cookie来维护数据 // 访问cookie const token getCookie(token) console.log(token)// 更…

Yolov8训练方式以及C#中读取yolov8+onnx模型进行目标检测.NET 6.0

目录 首先你要定义v8的模型特征文件 下方是完整的模型编写函数 然后你要在控件窗体中定义应用这些方法以及函数 一、定义你的标签 二、下方是定义模块和坐标的方法 三、画框 完整推理函数代码块 效果展示 完整源码 训练其实和yolov10差不多 因为v10就是在v8的基础上做了优…

C 语言奇幻之旅 - 第16篇:C 语言项目实战

目录 引言1. 项目规划1.1 需求分析与设计1.1.1 项目目标1.1.2 功能需求1.1.3 技术实现方案 2. 代码实现2.1 模块化编程2.1.1 学生信息模块2.1.2 成绩管理模块 2.2 调试与测试2.2.1 调试2.2.2 测试2.2.4 测试结果 3. 项目总结3.1 代码优化与重构3.1.1 代码优化3.1.2 代码重构 3.…

YOLOv10-1.1部分代码阅读笔记-instance.py

instance.py ultralytics\utils\instance.py 目录 instance.py 1.所需的库和模块 2.def _ntuple(n): 3.class Bboxes: 4.class Instances: 1.所需的库和模块 # Ultralytics YOLO 🚀, AGPL-3.0 licensefrom collections import abc from itertools import…

云安全博客阅读(二)

2024-05-30 Cloudflare acquires BastionZero to extend Zero Trust access to IT infrastructure IT 基础设施的零信任 不同于应用安全,基础设置的安全的防护紧急程度更高,基础设施的安全防护没有统一的方案IT基础设施安全的场景多样,如se…

06-RabbitMQ基础

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.安装 2.2.收发消息 2.2.1.交换机 2.2.2.队列 2.2.3.绑定关系 2.2.4.发送消息 2.3.数据隔离 2.3.1.用户管理 2.3.2.virtual host 3.SpringAMQP 3.1.导入Demo工程 3.2.快速入门 3.2.1.消…

【Linux系列】并发与顺序执行:在 Linux 脚本中的应用与选择

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

解决高并发环境消息通知涉及问题

在开发时,给特定用户发送消息通知是常见的场景;比如给1000个人每秒要发一条消息,如何保证时间准确性呢?在高并发场景下,确保每秒向1000个用户发送消息并保证时间准确性,确实是一个挑战。以下是一些解决方案…