12. Pytest常用插件: pytest-rerunfailures失败用例重跑
一、前言
测试环境不稳定偶发接口超时(和服务无关,纯粹是环境问题),然后执行接口case也因此偶发失败。比如同一个接口case跑五次,其中有两次失败,另外三次都是成功的,这种偶发性的环境问题就需要我们手动重跑(还不一定能够通过)。有没有一个比较好的机制,保证case能够尽最大努力通过测试呢?
这里我们介绍pytest的一个失败重跑插件:pytest-rerunfailures。
二、学习目标
1.pytest-rerunfailures
安装
2.pytest-rerunfailures
应用
三、知识点
1.【pytest-rerunfailures
安装】
插件安装:
pip install pytest-rerunfailures
2.【pytest-rerunfailures
应用】
使用方式有两种:
-
命令行参数
-
语法:
pytest --reruns 3 --reruns-delay 1 test_demo.py #3是重试次数,1是每次间隔1秒 pytest --reruns 3 --only-rerun AssertionError --only-rerun ValueError test_demo.py #也可以指定异常类型重跑,其中多个--only-rerun之间是或的关系
-
代码示例:
#测试用例文件test_XXX.py class TestCase(): def test_01(self): print("---用例1执行---") assert False
-
运行效果:
test_demo.py:8: AssertionError ----------------------------------------------- Captured stdout call ---------------------------------------------------- ---用例1执行--- ----------------------------------------------- Captured stdout call ---------------------------------------------------- ---用例1执行--- ------------------------------------------------Captured stdout call ---------------------------------------------------- ---用例1执行--- -----------------------------------------------Captured stdout call ----------------------------------------------------- ---用例1执行--- ================================ short test summary info ==================================== FAILED test_demo.py::TestCase::test_01 - assert False ==================================== 1 failed, 3 rerun in 3.08s ==========================================
用例失败后又重试运行了三次。
-
-
装饰器方式
-
语法:
@pytest.mark.flaky(reruns=3, reruns_delay=1)#3是重试次数,1是每次间隔1秒
-
代码示例:
import pytest class TestCase(): @pytest.mark.flaky(reruns=3, reruns_delay=1) def test_01(self): print("---用例1执行---") assert False
-
运行效果:
test_demo.py::TestCase::test_01 RERUN [100%] test_demo.py::TestCase::test_01 RERUN [100%] test_demo.py::TestCase::test_01 RERUN [100%] test_demo.py::TestCase::test_01 FAILED [100%]---用例1执行--- ---用例1执行--- ---用例1执行--- ---用例1执行--- FAILED test_demo.py::TestCase::test_01 - assert False ========================= 1 failed, 3 rerun in 3.06s ==========================
用例失败后又重试运行了三次。
-
-
注意:
不可以与类,模块还有包级别的fixture装饰器一起使用: @pytest.fixture()
该插件与pytest-xdist的 --looponfail 标志不兼容
该插件在使用pdb调试时候会有不兼容性
最后总结,这个插件虽然还用,但是坑还是不少,建议主要使用失败重试次数和重试间隔的功能即可。