Pytest中测试结果收集:pytest_terminal_summary!

news2024/12/29 13:49:12

前言

Pytest是Python的一种强大的测试框架,它提供了丰富的功能和插件来满足各种测试需求。

其中,pytest_terminal_summary是一个钩子函数,它允许我们在测试运行结束后,添加自定义的总结信息到测试报告中。这个功能在需要对测试结果进行额外分析或者美化测试报告时非常有用。

什么是pytest_terminal_summary?

首先,我们需要了解pytest的插件钩子机制。pytest是一个非常灵活的测试框架,它允许用户通过插件来扩展其功能。每一个插件都可以实现一些钩子函数,这些函数在pytest的特定运行阶段被调用,从而实现对pytest行为的定制化。

pytest_terminal_summary是pytest的一个插件钩子,用于在所有的测试运行完成后向终端报告总结信息。在编写pytest插件或者定制化pytest测试报告的时候,你可能会用到这个钩子。

如何使用pytest_terminal_summary?

要使用pytest_terminal_summary,你需要在你的pytest插件或者conftest.py文件中定义这个方法。这个方法会在所有的测试运行结束后被自动调用。下面是一个简单的示例:

# content of conftest.py
def pytest_terminal_summary(terminalreporter):
    pass_count = len([rep for rep in terminalreporter.stats.get('passed', []) if rep.when == 'call'])
    fail_count = len([rep for rep in terminalreporter.stats.get('failed', []) if rep.when == 'call'])
    skip_count = len([rep for rep in terminalreporter.stats.get('skipped', []) if rep.when == 'call'])
    error_count = len([rep for rep in terminalreporter.stats.get('error', []) if rep.when == 'call'])

    terminalreporter.write('\n')
    terminalreporter.write(f'Passed: {pass_count}, Failed: {fail_count}, Skipped: {skip_count}, Errors: {error_count}\n')

在这个例子中,我们首先从terminalreporter的stats属性中获取了各种测试结果的数量,然后我们在终端中打印出这些数据,也可以将这些数量添加到测试报告中。

注意,terminalreporter.stats是一个字典,它包含了所有的测试结果。每个结果都是一个TestReport对象,它有一个when属性,这个属性的值可以是'setup''call'或者'teardown',分别表示测试的设置阶段,执行阶段和清理阶段。

在这个例子中,我们只关心执行阶段的结果,所以我们在获取结果的时候检查了rep.when == 'call'

def pytest_terminal_summary(terminalreporter, exitstatus, config):
    passed_tests = terminalreporter.stats.get('passed', [])
    failed_tests = terminalreporter.stats.get('failed', [])
    print(f"总共运行了 {len(passed_tests) + len(failed_tests)} 个测试,其中 {len(passed_tests)} 个通过,{len(failed_tests)} 个失败。")

这个例子会在所有测试运行完毕后,打印出总共运行了多少个测试,其中有多少个通过,有多少个失败。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

但是,这只是pytest_terminal_summary的基本用法。实际上,你可以做更多的事情。例如,你可以根据测试的运行情况,动态地改变测试报告的内容。

为了实现这一点,你需要更深入地了解terminalreporter对象。这个对象有一个stats属性,它是一个字典,包含了所有的测试结果。字典的键是测试结果的类型(如'passed'、'failed'、'skipped'等),值是一个列表,包含了该类型的所有测试结果。

每一个测试结果都是一个TestReport对象,包含了测试的详细信息,如测试的名称、测试的状态、测试的持续时间等。你可以通过这些信息来定制化你的测试报告。

例如,你可以这样使用pytest_terminal_summary

def pytest_terminal_summary(terminalreporter, exitstatus, config):
    passed_tests = terminalreporter.stats.get('passed', [])
    failed_tests = terminalreporter.stats.get('failed', [])
    total_tests = len(passed_tests) + len(failed_tests)
    total_time = sum([x.duration for x in passed_tests + failed_tests])
    
    print(f"总共运行了 {total_tests} 个测试,其中 {len(passed_tests)} 个通过,{len(failed_tests)} 个失败。")
    print(f"总共耗时 {total_time} 秒。")
    
    if failed_tests:
        print("以下测试失败了:")
        for test in failed_tests:
            print(f"- {test.nodeid}")

这个例子不仅会打印出总共运行了多少个测试,其中有多少个通过,有多少个失败,还会打印出总共耗时多少秒,以及哪些测试失败了。

方法参数:

pytest_terminal_summary方法的定义如下:

def pytest_terminal_summary(terminalreporter, exitstatus, config):
    ...
  • terminalreporter:这是一个TerminalReporter对象,它提供了一些方法来添加内容到测试报告中。是一个特殊的报告对象,用于向终端输出信息。你可以用它来打印自定义的总结信息。

  • exitstatus:这是一个整数,表示pytest的退出状态。0表示所有测试都通过,1表示有一些测试失败。

  • config:这是一个Config对象,是pytest的配置对象,包含了pytest运行的所有配置信息,表示pytest的配置信息。

总结

pytest_terminal_summary是一个特殊的钩子方法,它是pytest测试框架的一部分。这个方法在所有的测试运行结束后被调用,它的主要作用是提供一个机会来处理和显示pytest运行的总结信息。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:自动化测试老司机 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1481827.html

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

相关文章

Java 小项目开发日记 04(文章接口的开发、oss图片上传)

Java 小项目开发日记 04&#xff08;文章接口的开发、oss图片上传&#xff09; 项目目录 配置文件&#xff08;pom.xml&#xff09; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

HMAC算法

HMAC HMAC可以用来加密、数字签名、报文验证等。 1. 消息认证码 消息认证码&#xff08;Message Authentication Code&#xff0c;MAC&#xff09;是基于消息和秘钥的公开函数&#xff0c;输出为定长数据&#xff1a; MACC(M,K) 假定通信双发共享秘钥K&#xff0c;发送方A向接…

ubuntu22.04 成功编译llvm和clang 3.4.0,及 bitcode 函数名示例,备忘

1, 获取llvm 仓库 从github上获取&#xff1a; $ git clone --recursive https://github.com/llvm/llvm-project.git 2, 检出 llvmorg-3.4.0 tag 针对llvm 3.4.0版本&#xff0c;检出 $ cd llvm-project $ git tag $ git checkout llvmorg-3.4.0 3, 配置并编译llvm 使用 M…

ARK:《BIG IDEAS 2024》

Cathie Wood所带领的方舟投资&#xff08;ARK&#xff09;发布了年度重磅研究报告《BIG IDEAS 2024》&#xff0c;该报告指出人工智能、公共区块链、多组学测序、能源存储和机器人技术这五大板块的融合将带来全球经济活动的改变。 这五个创新平台正在融合并定义这个技术时代&am…

GoFrame:如何简单地搭建一个简单地微服务

一切资料来源于GoFrame官网&#xff0c; 感兴趣的&#xff0c; 可以直接去官网查阅相关资料。 首先下载框架工具&#xff0c; 下载地址&#xff1a;https://github.com/gogf/gf/releases 然后进入你想要放置的项目文件夹&#xff0c; 执行命令行 gf init {project_name} #pr…

插混、油混、增程式、轻混、强混,啥区别

这里写自定义目录标题 随着我国新能源汽车的大力推进&#xff0c;电车可以说是世界未来的主流&#xff0c;只不过现在是处在一个过渡时代 这是个好时代&#xff0c;因为我们见证并体验着历史过渡的细节 这是个不好的时代&#xff0c;因为我们可能只是未来新新人类的试验品 帮他…

微信小程序iOS禁止上下拉显示白边

先上图暴露出问题 iOS端这个页面明明正好显示的&#xff0c;非要能下拉上拉给显示出来点白边。这样不就不好看了嘛。。 想了想是不是支持页面下拉导致的&#xff0c;加入以下代码到json文件中。 {"enablePullDownRefresh": false,"usingComponents": {} }…

【k8s资源调度--DaemonSet】

1、什么是守护进程 有以下这样一个商品场景&#xff1a; 1、用户在商城查询商品信息&#xff0c;查询商品信息的时候需要登录用户&#xff0c;如果用户想要下单&#xff0c;需要提交到订单服务&#xff0c;最后下单完成后&#xff0c;需要更新仓库的商品数量信息。 2、如果每一…

mysql和redis双写一致性策略分析

mysql和redis双写一致性策略分析 一.什么是双写一致性 当我们更新了mysql中的数据后也可以同时保证redis中的数据同步更新&#xff1b; 数据读取的流程&#xff1a; 1.读取redis,如果value!null,直接返回&#xff1b; 2.如果redis中valuenull&#xff0c;读取mysql中数据对应的…

P2040 打开所有的灯

题目传送门&#xff1a;P2040 打开所有的灯 用深度优先搜索实现的一个填色题。 题目步骤&#xff1a; 1..dfs 首先dfs要判断是否符合题意&#xff0c;如果符合题意就更新最短路&#xff1b; 如果不符合题意就枚举 如果是关的就把周围四个包括 给标记上和原来相反的&#xf…

AI大预言模型——ChatGPT与AI绘图及论文高效写作

原文链接&#xff1a;AI大预言模型——ChatGPT与AI绘图及论文高效写作 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网…

python语言1

一、pytho中的注释 1.1注释的理解 程序员在代码中对代码功能解释说明的标注性文字可以提高代码的可读性注释的内容将被python解释器忽略&#xff0c;不被计算机执行 1.2注释的分类 注释分为&#xff1a;单行注释、多行注释、中文声明注释 &#xff08;1&#xff09;单行注…

计算机网络-网络互连和互联网(五)

1.路由器技术NAT&#xff1a; 网络地址翻译&#xff0c;解决IP短缺&#xff0c;路由器内部和外部地址进行转换。静态地址转换&#xff1a;静态NAT&#xff08;一对一&#xff09; 静态NAT&#xff0c;内外一对一转换&#xff0c;用于web服务器&#xff0c;ftp服务器等固定IP的…

大模型的智慧之源:图技术的崛起

自2023年以来&#xff0c;大语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;的兴起已经改变了科技行业的面貌。 科创公司如果不涉足这一领域&#xff0c;似乎就不好意思称自己是科技企业。 然而&#xff0c;随着大语言模型的普及&#xff0c;它固有的…

Linux高级编程:进程(三),线程(一)

进程的一生&#xff1a; execute&#xff1a; exec族 用fork创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09;&#xff0c; 子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的 用户空间…

Python复合型数据避坑指南

目录 前言 列表&#xff08;Lists&#xff09; 1. 修改可变对象 2. 浅拷贝和深拷贝 元组&#xff08;Tuples&#xff09; 集合&#xff08;Sets&#xff09; 字典&#xff08;Dictionaries&#xff09; 1. 键值唯一性 2. 键的类型 实际应用场景 1. 数据分析与清洗 2. 网络…

微信小程序云开发教程——墨刀原型工具入门(安装以及基础使用教程)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

Hgame题解(第二星期)

Hgame题解&#xff08;第二星期&#xff09; Web Select More Courses 打开靶机发现是一个登陆页面&#xff0c;根据题目提示下载弱密码字典&#xff0c;通过BP爆破获得用户密码为qwert123 登陆后进入下一个页面&#xff0c;由于学分已满无法选课&#xff0c;所以需要先进行…

仿牛客网项目---显示评论和添加评论功能的实现

这篇文章&#xff0c;我来介绍一下我的项目中的另外一个功能&#xff1a;显示评论和添加评论。 其实这两个功能都不怎么重要&#xff0c;我感觉最重要的应该是用户注册登录功能&#xff0c;这个也了解一下&#xff0c;知道这么一回事儿就好。 首先设计DAO层。 Mapper public …

【刷题】Leetcode 1609.奇偶树

Leetcode 1609.奇偶树 题目描述广度优先搜索&#xff08;BFS&#xff09;深度优先算法&#xff08;DFS&#xff09; 思路一&#xff08;BFS&#xff09;思路二&#xff08;DFS&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&a…