RERUNtest_dir/test_demo.py::test_case RERUNtest_dir/test_demo.py::test_case RERUNtest_dir/test_demo.py::test_case FAILED
可以看到,重试了3次,最终结果为失败。
注意:如果你是在pycharm中点击绿色三角形直接运行是不生效的
总结一下:
当运行测试时,如果测试用例失败,pytest-rerunfailures 插件会根据我们配置的重试次数和延迟时间自动重新运行该测试用例,直到达到最大重试次数或测试通过为止。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】
- 方式二
除了使用装饰器来标记测试用例外,pytest-rerunfailures 还支持使用命令行选项和配置文件的方式进行配置。
命令行执行的话,可以这样写:
pytest -s -v --reruns 3 --reruns-delay 2 test_demo.py::test_case
或者代码运行的话,可以这样写:
pytest.main([“-s”, “-v”, “–reruns”, “3”, “–reruns-delay”, “2”, “test_demo.py::test_case”])
03、运行机制
到这里,应该会使用了。我们简单概括一下它的运行机制:
1、pytest 通过插件系统加载 pytest-rerunfailures 插件,并启用其功能。
2、当 pytest 运行测试时,对每个测试用例的执行进行监控。
3、如果一个测试用例执行失败,pytest-rerunfailures 插件会捕获该失败,并判断是否需要进行重试。
4、如果该测试用例被标记为可重试(使用了 @pytest.mark.flaky 装饰器),插件会根据配置的重试次数和延迟时间重新运行该测试用例。
5、在每次重试之前,插件会根据设置的延迟时间暂停一段时间。
6、如果测试用例在重试次数达到上限之前通过了,即成功执行,则插件会将该测试用例标记为通过。
7、如果测试用例在达到最大重试次数后仍然失败,则插件会返回最后一次失败的结果作为最终的结果
总结起来,pytest-rerunfailures 插件在测试执行失败时,根据配置的重试次数和延迟时间重新运行测试用例,并根据重试结果判断最终的测试结果。这样可以提高测试用例的稳定性,并减少偶发性问题导致的测试失败。
**04、**源码解读
使用阶段,我们使用 mark 标记,那源码中应该添加了该标记。
def pytest_configure(config): # add flaky marker config.addinivalue_line( “markers”, "flaky(reruns=1, reruns_delay=0): mark test to re-run up " "to ‘reruns’ times. Add a delay of ‘reruns_delay’ seconds " “between re-runs.”, ) …
简单解释一下:
- pytest_configure(config) 是 pytest 的一个钩子函数,用于在 pytest 配置阶段对配置进行自定义操作。
- config.addinivalue_line() 是 pytest 的配置方法,用于向配置中添加新的配置项或配置信息。
- 在这段代码中,通过 config.addinivalue_line() 方法,插件向 pytest 的配置中加入了一行字符串。
- 这行字符串指定了标记名称为 “flaky”,并使用参数 reruns 和 reruns_delay 来说明重试次数和延迟时间的默认值。
- 标记的含义是将被标记的测试用例重新运行最多 “reruns” 次,每次重试之间间隔 “reruns_delay” 秒。
通过这个自定义的标记,就可以使用 @pytest.mark.flaky 装饰器来标记需要进行重试的测试用例,并且可以在装饰器中指定具体的重试次数和延迟时间。
我们看看实现失败重试的源码,这才是重点。
def pytest_runtest_protocol(item, nextitem): “”" Run the test protocol.
Note: when teardown fails, two reports are generated for the case, one for the test case and the other for the teardown error. “”" reruns = get_reruns_count(item) if reruns is None: # global setting is not specified, and this test is not marked with # flaky return
while this doesn’t need to be run with every item, it will fail on the # first item if necessary check_options(item.session.config) delay = get_reruns_delay(item) parallel = not is_master(item.config) db = item.session.config.failures_db item.execution_count = db.get_test_failures(item.nodeid) db.set_test_reruns(item.nodeid, reruns)
if item.execution_count > reruns: return True
need_to_run = True while need_to_run: item.execution_count += 1 item.ihook.pytest_runtest_logstart(nodeid=item.nodeid, location=item.location) reports = runtestprotocol(item, nextitem=nextitem, log=False)
for report in reports: # 3 reports: setup, call, teardown report.rerun = item.execution_count - 1 if _should_not_rerun(item, report, reruns): # last run or no failure detected, log normally item.ihook.pytest_runtest_logreport(report=report) else: # failure detected and reruns not exhausted, since i < reruns report.outcome = “rerun” time.sleep(delay)
if not parallel or works_with_current_xdist(): # will rerun test, log intermediate result item.ihook.pytest_runtest_logreport(report=report)
cleanin item’s cashed results from any level of setups _remove_cached_results_from_failed_fixtures(item) _remove_failed_setup_state_from_session(item)
break # trigger rerun else: need_to_run = False
item.ihook.pytest_runtest_logfinish(nodeid=item.nodeid, location=item.location)
return True
简单解释一下:
首先,通过函数 get_reruns_count(item) 获取当前测试用例需要重试的次数。如果没有设置重试次数,则直接返回。
然后,检查配置选项并获取重试的延迟时间,并确定是否运行在并行模式下。还会获取失败记录数据库对象,并获取当前测试用例已经执行的次数。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
)**
[外链图片转存中…(img-GBQgFIVR-1712793133420)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!