既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
注意:如果你是在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) 获取当前测试用例需要重试的次数。如果没有设置重试次数,则直接返回。
然后,检查配置选项并获取重试的延迟时间,并确定是否运行在并行模式下。还会获取失败记录数据库对象,并获取当前测试用例已经执行的次数。
接下来,通过比较已执行次数和设定的重试次数,判断是否需要进行重试。如果已执行次数大于等于设定的重试次数,则不再进行重试,直接返回。
如果需要重试,会进入一个循环,每次重试会增加已执行次数。在重试过程中,会调用 pytest_runtest_logstart 函数记录测试用例开始执行的日志。
然后,通过调用 runtestprotocol 函数执行测试用例,并获取测试结果。在这里,生成的报告会被标记为执行次数减一,以便区分原始执行和重试执行的报告。
接着,通过 _should_not_rerun 函数判断当前报告是否满足不需要重试的条件。如果满足,则继续执行后续操作。
如果报告表明需要重试,并且重试次数未达到设定的次数,会将报告的结果设置为 “rerun”,并根据设定的延迟时间暂停一段时间。
然后,根据并行模式和当前使用的 xdist 版本,决定是否记录中间结果。同时,会清除缓存的结果和执行状态。
之后,重试循环会继续,直到不满足重试条件为止。最后,会调用 pytest_runtest_logfinish 函数记录测试用例结束执行的日志。
最后,函数返回 True,表示已经实现重试机制。
总结起来,这段代码通过循环执行测试用例,并在满足重试条件时进行重试,直到满足退出条件为止。在重试过程中,会记录日志、生成报告,并根据设定的重试次数和延迟时间进行控制。
04、最后
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新