pytest测试框架pytest-rerunfailures插件重试失败用例

news2024/11/25 11:04:53

Pytest提供了丰富的插件来扩展其功能,介绍下插件pytest-rerunfailures ,用于在测试用例失败时自动重新运行这些测试用例。

pytest-rerunfailures官方显示的python和pytest版本限制:

  • Python 3.8+
  • pytest 7.2 或更新版本

此插件可以通过以下可选先决条件从硬崩溃中恢复:

pytest-xdist 2.3.0 或更新版本

目前最新版本是14.0,支持了pytest 8.0, 8.1版本,但是不支持最新的pytest 8.2版本,所以大家使用时要注意版本的配套,可以去官方网站(
https://pypi.org/project/pytest-rerunfailures/)上查看。(我自己在调试的时候下载的都是最新的版本,结果运行时一直不成功,将pytest8.2.2卸载然后安装8.1.2版本就成功了。)

pytest-rerunfailures安装

使用pip命令安装: pip install pytest-rerunfailures (安装在pytest工程所运行的python环境,python的安装目录或者虚拟环境目录,可以参考之前文章查看运行环境pycharm配置pytest运行环境)

通过pycharm安装:打开设置,按照如下图中安装插件(windows系统)

pytest-rerunfailures运行

重新运行所有失败用例并指定重试次数

使用--reruns命令行选项并指定希望测试用例运行的最大次数,比如命令pytest --reruns 5或者pytest --reruns=5,同时执行过程中失败的fixture函数或者setup_class也将被重新执行。

举例:设置5条用例,第5条用例通过断言assert 1 != 1时用例预期失败,然后我们重试3次,并使用pytest-html生成测试报告。

执行参数类似如下:pytest.exe -v --reruns 3 --html=report/report.html test_case.py

执行结果如下:5条用例执行耗时4.32s

执行后测试报告如下:显示第5条测试用例重新执行了3次

重新运行所有失败用例并指定延迟时间

使用--reruns-delay命令行选项,表示在启动下一次测试重新运行之前想要等待的秒数。比如pytest --reruns 5 --reruns-delay 1

举例:设置5条用例,第5条用例通过断言assert 1 != 1时用例预期失败,然后我们重试3次,每次延迟1秒,并使用pytest-html生成测试报告。

执行参数类似如下:pytest.exe -v --reruns 3 --reruns-delay 1 --html=report/report.html test_case.py

执行后预期耗时比上面的4.32s再增加3s。

实际执行后结果:确实是显示耗时7.32s,证明每次重试时都延迟了1s执行。

重新运行所有与特定表达式匹配的失败项

使用--only-rerun命令行选项表示仅重新运行与特定表达式列表匹配的失败,例如,仅重新运行与AssertionError匹配的错误:

$ pytest --reruns 5 --only-rerun AssertionError

多次传递标志会累积参数,比如以下操作只会重新运行与AssertionError或ValueError匹配的错误:

$ pytest --reruns 5 --only-rerun AssertionError --only-rerun ValueError

举例:设置5条用例,第3条用通过使用不存在的变量预期报NameError,第4条用例通过value = 1/0预期报ZeroDivisionError,第5条用例通过断言assert 1 != 1时用例预期报AssertionError

PS:第5条用例 通过assert 1 != 1会断言失败,但并不会返回AssertionError,所以重试时会捕捉不到,此时我们使用try...except语句,通过raise语句返回AssertionError。

我们重试3次,并使用pytest-html生成测试报告。

执行参数类似如下:pytest.exe -v --reruns 3 --only-rerun
AssertionError--only-rerun NameError --html=report/report.html test_case.py

执行后预期只重试第3条用例和第5条用例

实际执行后结果如预期一样。

重新运行除匹配某些表达式之外的所有失败

使用--rerun-except命令行选项仅重新运行与特定表达式列表不匹配的失败用例。例如,以下内容将仅重新运行除匹配AssertionError之外的错误:

$ pytest --reruns 5 --rerun-except AssertionError

多次传递标志会累积参数,例如下面的例子只会重新运行与AssertionError或OSError不匹配的错误:

$ pytest --reruns 5 --rerun-except AssertionError --rerun-except OSError

举例:还是使用上面定义的5条用例,我们重试3次,并使用pytest-html生成测试报告。

执行参数类似如下:pytest.exe -v --reruns 3 --rerun-except AssertionError --rerun-except NameError --html=report/report.html test_case.py

执行后预期只重试第4条用例,排除第3和第5条用例

实际执行后结果如预期一样。

使用@pytest.mark.flaky标记测试用例并在失败时重新运行

我们可以将单个测试标记为不稳定,并让它们在失败时自动重新运行,而且还可以标记重试次数和延迟时间,或者其他一些参数

以下是 @pytest.mark.flaky 的参数,以及它们的详细描述:

  • reruns:当测试失败时,重新运行测试的次数。默认为 0(不重新运行)
  • reruns_delay:在每次重新运行测试时的延迟时间(秒)。默认为 0(无延迟)
  • condition: 配合reruns参数,当满足该条件时失败用例才被执行。
  • only_rerun: 配合reruns参数,仅重新运行与特定表达式列表匹配的失败用例,可传入单个值或列表
  • rerun_except:配合reruns参数,仅重新运行与特定表达式列表不匹配的失败用例,可传入单个值或列表

PS:网络上有些文章提到其他参数max_runs、min_passes、min_successes、run_with_increasing_delay等是另一个插件Flaky 的功能。

举例 在测试用例1中标记重试3次,延迟1s

@pytest.mark.flaky(reruns=3, reruns_delay=1)
def test_1():
  try:
      assert 1 != 1
  except AssertionError:
      raise AssertionError
  print('\n用例test_1执行成功')
  time.sleep(1)

执行命令如下:pytest.exe -v --html=report/report.html test_case.py

测试报告如下: 显示用例1被重复执行3次

那如果我们在执行命令行中还加上--reruns 3参数,结果如何?

我们执行pytest.exe -v --reruns 3 --html=report/report.html test_case.py来检验下:

结果显示: 加了参数也不会再多执行3次,两者不会冲突,加了参数只会执行那些没有被标记的失败用例。

举例:在测试用例1中标记重试3次,满足操作系统是windows32时才执行

@pytest.mark.flaky(reruns=3, condition=sys.platform.startswith("win32"))
def test_1():
  try:
      assert 1 != 1
  except AssertionError:
      raise AssertionError
  print('\n用例test_1执行成功')
  time.sleep(1)

执行结果如下:因为我自己的电脑是win32,所以用例会被重复执行

举例:在测试用例1中标记重试3次,满足only_rerun=["AssertionError", "NameError"])错误时才执行。

@pytest.mark.flaky(reruns=3, only_rerun=["AssertionError", "NameError"])
def test_1():
  try:
      assert 1 != 1
  except AssertionError:
      raise AssertionError
  print('\n用例test_1执行成功')
  time.sleep(1)

执行结果如下:因为用你预期报错AssertionError,满足条件所以用例会被重复执行

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,谢谢大家。

---祝愿大家都能够龙腾虎跃,步步高升!!!

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

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

相关文章

《计算机英语》Unit2 Operating System and Computer Architecture 操作系统和计算机构造

SectionA Operating System操作系统 不同操作系统 批处理操作系统(Batch Processing Operating System) 分时操作系统(Time Sharing Operating System) 实时操作系统(Real Time Operating System) 个人操作系统(Personal Operating System) 网络操作系统(NOS, Network Operati…

【Vue3组件】分享一下自己写的简约风格评论区组件

代码比较简单,方便大家二次开发,旨在快速提供基础的样式模板,自行迭代定制 预览 简介 通用评论组件 组件功能 此组件旨在创建一个具备嵌套回复能力的通用评论区域,适用于构建动态、互动性强的用户讨论场景。 接收数据结构 组件通…

运营管理和服务支撑阶段

我前面的所有设备都部署好了,现在就需要运营管理和服务支撑 遇到问题了迅速解决,避免风险扩大 我们也可以给客户提供上面的服务,提高客户的预警能力,安全风险处理能力 我们不仅提供设备,还提供服务 我们公司成立了安…

如何选择服务器?快解析能搭建私人服务器吗?

随着网络的发展,搭建私人服务器逐渐成为网络达人们的热门选择,比如建立私人性质的博客、论坛、FTP、个人网站、服务器集群等。通过源搭建私人服务器,就可以将很多资源分享到网络上进行信息共享。随之而来的是服务器市场不断扩大,在…

马尔可夫聚类算法

马尔可夫聚类算法(Markov Clustering Algorithm,MCL)是一种用于图聚类的算法,广泛应用于生物信息学、社交网络分析、推荐系统等领域。 其核心思想是模拟随机游走过程,通过迭代地扩散和收缩图上的概率分布来识别图中的…

Java基础的重点知识-01-基础

文章目录 开发前言Java语言开发环境入门程序说明常量变量和数据类型数据类型转换运算符方法解析 开发前言 常用DOS命令 Java语言的初学者,学习一些DOS命令,会非常有帮助。DOS是一个早期的操作系统,现在已经被Windows系统取代,对于…

【mysql】建库

通过命令建库: CREATE DATABASE database_name; 如果是用Workbench:

React+TS前台项目实战(十六)-- 全局常用组件Pagination封装

文章目录 前言Pagination组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 [PC端&手机端] 总结 前言 在上篇文章中,我们封装了表格组件Table,本文则继续封装配套使用的分页器组件。想看Table表格组件的,可自行查看全局常用组件Tab…

【pytorch04】创建Tensor

numpy中的数据创建tensor 数据已经在numpy中了,将numpy中的数据转到tensor中来,因为我们将使用tensor在GPU上进行加速运算 从NUMPY导入的FLOAT其实是DOUBLE类型 list中的数据创建tensor FloatTensor()和大写的Tensor()接收的是shape(即数据的…

敏捷开发笔记(第7章节)--什么是敏捷设计

目录 1:PDF上传链接 7.1: 软件出了什么错 7.2: 设计的臭味--腐化软件的气味 7.2.1: 什么激化了软件的腐化 7.2.2: 敏捷团体不允许软件腐化 7.3: “copy”程序 1: 初始设计 2: 需求在变化 3: 得寸进尺 4: 期望变化 7.3.1: “copy”程序的敏捷设计 7.3.2:…

【职场人】职场故事:与邀功精的共舞

在我的职业生涯中,我遇到过一位特别引人注目的同事,我们都叫他李经理。他的工作能力并不差,但他有一个习惯,那就是喜欢邀功。他的这种习惯,不仅让我印象深刻,也让我在合作中学会了不少东西。 恶心的四件事 …

MySQL学习笔记-进阶篇-视图和存储过程

四、视图和存储过程 视图 存储过程 基本语法 创建 CREATE PROCEDURE ([参数列表]) BEGIN --SQL END; 调用 CALL 存储过程名([参数列表]) 查看 --查看指定数据库的存储过程及状态信息 SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SHCEMA…

AI-智能体

什么是 AI 智能体? 「AI 智能体」这个术语并没有真正被定义,对智能体究竟是什么也存在很多的争议。 AI 智能体可以定义为「一个被赋予行动能力的 LLM(通常在 RAG 环境中进行函数调用),以便在环境中对如何执行任务做出…

第一次接触Swing

学习java版的HslCommunication发现使用的是Swing,所以了解了一下~ 了解: Swing是Java的标准库(Java Foundation Classes, JFC)的一部分,用于构建桌面应用程序的图形用户界面(GUI)。它是Java AWT…

华为某员工爆料:三年前985本科起薪30万,现在硕士起薪还是30w,感慨互联网行情变化

“曾经的30万年薪,是985本科学历的‘标配’,如今硕士也只值这个价?” 一位华为员工的爆料,揭开了互联网行业薪资变化的冰山一角,也引发了不少人的焦虑:互联网人才“通货膨胀”的时代,真的结束了…

Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获

Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获 Java-异常:不恰当的异常转换、不充分的日志记录、过度或不当的异常捕获一、前期准备二、案例分析1、不恰当的异常转换2、不充分日志记录3、过度或不当的异常捕获 三、正确处理方式1…

2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等

6月还有一周就要结束了,我们今天来总结2024年6月上半月发表的最重要的论文,重点介绍了计算机视觉领域的最新研究和进展。 Diffusion Models 1、Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation LlamaGen,是一个…

C++20中的Feature Test Mocros

C20定义了一组预处理器宏,用于测试各种语言和库的feature。 Feature Test Mocros(特性测试宏)是C20中引入的一种强大机制,用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现,它使你能够在编译过程中仔细…

Edge 浏览器退出后,后台占用问题

Edge 浏览器退出后,后台占用问题 环境 windows 11 Microsoft Edge版本 126.0.2592.68 (正式版本) (64 位)详情 在关闭Edge软件后,查看后台,还占用很多系统资源。实在不明白,关了浏览器还不能全关了,微软也学流氓了。…

计算机网络期末

1、IP 地址为:192.168.0.254,它的子网掩码应该为( ) A.255.255.255.0 B.255.255.254.0 C.255.255.252.0 D.255.255.0.0 2、最容易产生网络可靠性瓶颈问题的拓扑构型是( )。 A 总线型 B 星型 C 环型 D 网状型 3、HTTP 就是电子邮件阅读协议&#xff0…