pytest测试框架pytest-rerunfailures插件重试失败用例
myzbx 2025-03-20 16:58 10 浏览
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,满足条件所以用例会被重复执行
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
----感谢读者的阅读和学习,谢谢大家。
相关推荐
- Luminati代理动态IP教程指南配置代理VMLogin中文版反指纹浏览器
-
介绍如何使用在VMLogin中文版设置Luminati代理。首先下载VMLogin中文版反指纹浏览器(https://cn.vmlogin.com)对于刚接触Luminati动态ip的朋友,是不是不懂...
- 文档中图形及子图形的处理(word中的图形对象有何特点)
-
【分享成果,随喜正能量】走得越远,见识越多,认识的人越多,你就越能体会到,人这一辈子,你真的在意的,同时又在意你的人,就那么几个,这几个人,就是你全部的世界。三两知己,爱人在侧,父母康健,听起来平淡无...
- Python爬虫破解滑动验证码教程(python绕过滑动验证码)
-
破解滑动验证码通常需要结合图像识别和模拟人类操作,以下是分步骤的解决方案:1.分析验证码类型缺口识别型:背景图带缺口,滑块图带凸块轨迹验证型:除了位置还需模拟人类移动轨迹2.获取验证码图片方法一:...
- 「教程」5 分钟带你入门 kivy(新手kp教学)
-
原创:星安果AirPythonkivy语言通过编写界面UI,然后利用Python定义一些业务逻辑,可以移植很多功能模块到移动端直接执行。下面对kivy常见用法做一个汇总。1、什么是...
- 比呀比: Fossil Estate Canvas EW 男式复古邮差包 $70.99
-
Fossil是一个来自美国的全球性生活时尚品牌,始建于1984年,专注于时尚配件,是第一个将手表的价值与款式完美结合的美国品牌,如今Fossil已跃身成为美国最受欢迎的品牌之一。这款FossilE...
- 智能教学:如何在网上授课(网上授课怎么弄)
-
摘要:因为担心传统课堂可能会传播冠状病毒,许多大学已经开始在网上授课。耶鲁-新加坡国立大学的讲师凯瑟琳·谢伊·桑格(CatherineSheaSanger)解释了如何快速而有效地做到这一点。当新型冠...
- wxPython库教程系列之图片:托盘图标和图片缩放、移动
-
1概要:=====1.1托盘图标设置1.2普通图片显示:原图显示,缩放显示,窗口与图片大小相互适应。1.3按钮图片设置1.4移动图片和zoom菜单按钮联动设置2托盘图标:========2...
- UE4渲染目标开发教程(ue4渲染效果图质量怎么样)
-
渲染目标(RenderTarget)是你可以在运行时写入的纹理。在引擎方面,它们存储基础颜色、法线和环境光遮蔽等信息。在用户方面,渲染目标主要用作一种辅助相机。你可以将场景捕捉指向某物并将图像存储到...
- 比呀比: Fossil 化石 Canvas NS 男士复古帆布斜挎包 $57.59
-
FossilCanvasNS男士复古帆布斜挎包,尺寸约为26.5*11*33厘米。采用100%纯棉帆布面料,融合了休闲与百搭的外形,在经典的款型呈现复古质感。内设1个拉链袋,2个搭扣数码产品袋和...
- 比呀比: Timberland 添柏岚 Canvas Cord Case 帆布旅行手包 $5.99
-
Timberland添柏岚这款耐用帆布旅行手包,虽然一眼过去,觉得不咋地,但是品牌和质量还是妥妥滴,非常适合装一些零零碎碎的小东西,便于携带,多色可选,重点是价格更是感动价啊。目前这款包在6pm报价...
- 提炼文章/知识资料,两键转换成小红书图片
-
现在AI的功能已经越来越强大了,通过AI可以提高我们不少工作效率。刚好前几天做了一个几乎“一气呵成”,把长文章转成小红书卡片的流程Demo,分享给大家。之前发过两篇利用AI把长文章转成小红书图片...
- python海龟绘图turtle(一):画布和窗体
-
海龟绘图(turtle)是python的一个有趣的内置模块,是python语言的标准库之一,是入门级的图形绘制函数库。海龟绘图(turtle)可以根据编写的控制指令(代码),让一个小“海龟”在屏幕上来...
- 在文档中添加画布及图片(word中如何添加画布)
-
【分享成果,随喜正能量】宁可正而不足,不可邪而有余。相识满天下,知心能几人。书七成,戏三分,牛皮灯影胡编成。布施不如还债,修福不如避祸。勿以恶小而为之,勿以善小而不为。。《VBA之Word应用》,是我...
- 知识管理神器 Obsidian,终于有了白板功能!
-
沙牛提示阅读本文需要3分钟,Obsidian白板功能来了!如果你喜欢本文,就分享给你的小伙伴!01白板继双链笔记之后,这一年,白板类工具开始火了起来。顾名思义,白板类工具,它给了你一张无限尺寸...
- 虚拟背景第一弹!教你如何在家中优雅地“学在交大”!
-
交大将于3月2日正式开始线上教学(3月1日举行线上教学第一课|视频直播课)目前正处于网课试课阶段交大在线课程教学以ZOOM、Canvas等作为主平台平台的虚拟背景功能可以具特别的环境效果更好地沉浸课堂...
- 一周热门
- 最近发表
-
- Luminati代理动态IP教程指南配置代理VMLogin中文版反指纹浏览器
- 文档中图形及子图形的处理(word中的图形对象有何特点)
- Python爬虫破解滑动验证码教程(python绕过滑动验证码)
- 「教程」5 分钟带你入门 kivy(新手kp教学)
- 比呀比: Fossil Estate Canvas EW 男式复古邮差包 $70.99
- 智能教学:如何在网上授课(网上授课怎么弄)
- wxPython库教程系列之图片:托盘图标和图片缩放、移动
- UE4渲染目标开发教程(ue4渲染效果图质量怎么样)
- 比呀比: Fossil 化石 Canvas NS 男士复古帆布斜挎包 $57.59
- 比呀比: Timberland 添柏岚 Canvas Cord Case 帆布旅行手包 $5.99
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 中级教程 (30)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)