文章目录
失败重跑
前言
在进行自动化测试的过程中,我们一定会有这样的需求:希望失败的用例可以自动重跑
在pytest中,提供了pytest-rerunfailures插件可以实现自动重跑的效果
前提条件
- Python 3.6,最高 3.10,或 PyPy3
- pytest 5.3 或更高版本
插件安装
pip3 install pytest-rerunfailures -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
使用前了解
命令行参数:
--reruns n
(重新运行次数),
--reruns-delay m
(等待运行秒数)
装饰器参数:
reruns=n
(重新运行次数),
reruns_delay=m
(等待运行秒数)
使用实例
重新运行所有失败的用例
如果需要把所有失败的用例都重新运行,使用 --reruns 命令,并且制定要运行的最大次数,举个🌰:
# FileName: test_03.pyclassTestDemo:defsetup(self):print("执行setup method方法")defteardown(self):print("执行teardown方法")deftest_case1(self):print("执行测试用例1")assert1+1==3deftest_case2(self):print("执行测试用例2")assert1+3==6deftest_case3(self):print("执行测试用例3")assert1+3==4
执行
pytest test_03.py --reruns 2 -vs
结果如下:
可以看到,运行失败的 fixture 或 setup_class 也将重新执行
指定重新运行的延时
可以使用 --reruns-delay 命令行选项,指定下次测试重新开始之前等待的秒数,举个🌰:
还是上面的case,执行
pytest test_03.py --reruns 2 --reruns_delay 10 -vs
结果如下:
可以看到,重跑被挂起(在执行setup之前被挂起),且执行总时间增加了近40s
重新运行指定的测试用例
如果在测试时,只希望在某一条测试用例失败后重新执行,可以使用flaky装饰器 @pytest.mark.flaky(reruns=, reruns_delay=)
reruns 指定重跑的次数
reruns_delay 指定重跑的延迟时间
举个🌰:
# FileName: test_03.pyimport pytest
classTestDemo:defsetup(self):print("执行setup method方法")defteardown(self):print("执行teardown方法")
@pytest.mark.flaky(reruns=2, reruns_delay=10)deftest_case1(self):print("执行测试用例1")assert1+1==3deftest_case2(self):print("执行测试用例2")assert1+3==6deftest_case3(self):print("执行测试用例3")assert1+3==4
执行
pytets test_03.py -vs
结果如下:
注意事项
如果指定了用例的重新运行次数,在命令行添加的 --reruns 对这些用例是不会生效的,即:
使用了flaky装饰器的用例,不会再受命令行参数的
--reruns
的影响
拓展:兼容性
- 不可以和 fixture 装饰器
@pytest.fixture()
一起使用 - 该插件与 pytest-xdist 的 --looponfail 标志不兼容
--looponfail #在子进程中重复运行测试。每次运行后,pytest 都会等待项目中的文件发生更改,然后重新运行之前失败的测试。重复此过程,直到所有测试都通过,然后再次执行完整运行
- 该插件与核心 --pdb 标志不兼容
pytest --pdb # 每次遇到失败都跳转到 PDB# pdb 是 Python 标准库的调试模块。在 pytest 中,可以直接使用 --pdb 参数在测试失败时开启调试
版权归原作者 _黎晟 所有, 如有侵权,请联系我们删除。