Pytest插件pytest-rerunfailures失败重跑

安装

pip install pytest-rerunfailures

doc

https://github.com/pytest-dev/pytest-rerunfailures

https://pypi.org/project/pytest-rerunfailures/#description

  • 当前最新版本11.0(2023-1-12)
  • python>=3.7
  • pytest 6.0以上

使用方法

第一种用法:装饰器 @pytest.mark.flaky

  • 示例代码

    import pytest
    from time import ctime @pytest.mark.flaky(reruns=3, reruns_delay=2)
    def test_a():
    print(ctime())
    import random assert random.choice([True, False]) # 这个代码你可能直接passed了,随机的 if __name__ == '__main__':
    pytest.main(['-sv',__file__])
  • 示例输出

    test_demo.py::test_a Sun Jan 29 09:39:35 2023
    RERUN
    test_demo.py::test_a Sun Jan 29 09:39:37 2023
    PASSED ========================= 1 passed, 1 rerun in 2.13s ==========================
  • 装饰器中的参数

    • reruns=重跑次数,如果都失败那么这个用例就失败了
    • reruns_delay就是重跑的间隔
  • 结果会记录你rerun的次数

  • 如果把assert改为

     assert random.choice([1, 0, 0, 0, 0])
  • 那你的输出很可能就是如下的

    test_demo.py:10: AssertionError
    =========================== short test summary info ===========================
    FAILED test_demo.py::test_a - AssertionError: assert 0
    ========================= 1 failed, 3 rerun in 6.20s ==========================

  • flaky还有一个参数

    • condition:有点类似于skipif中的条件
  • 示例代码

    import sys
    
    import pytest
    from time import ctime @pytest.mark.flaky(reruns=3, reruns_delay=2,condition=sys.platform.startswith('linux'))
    def test_a():
    print(ctime())
    import random
    assert random.choice([1, 0]) if __name__ == '__main__':
    pytest.main(['-sv', __file__])
  • 你测试多次会发现,遇到失败的情况压根就不会重跑的,因为condition不满足

第二种用法:命令行

  • 跟多数插件一样,它也支持命令行的用法

  • 你可以这样用

    $ pytest --reruns 5 --reruns-delay 1
  • 但是condition并没有这个命令行,它变成了--only-rerun(确切的说也不是变,有点不太一样了)

    # 遇到AssertionError错误就重跑
    $ pytest --reruns 5 --only-rerun AssertionError
    # 遇到AssertionError或者ValueError 就重跑
    $ pytest --reruns 5 --only-rerun AssertionError --only-rerun ValueError
  • 示例代码

    def test_a():
    assert int('a') # 会产生一个ValueError
    pytest -sv --reruns 2 --reruns-delay 1 --only-rerun ValueError test_demo.py
    test_demo.py:4: ValueError
    ==================== short test summary info =================================================
    FAILED test_demo.py::test_a - ValueError: invalid literal for int() with base 10: 'a'
    ==================== 1 failed, 2 rerun in 0.06s ===============================================
  • --only-rerun的意思很明确,只有遇到ValueError才重跑

  • 同样的代码,换个参数--rerun-except,除了ValueError才会重跑,遇到ValueError并不重跑

    pytest -sv --reruns 2 --reruns-delay 1 --rerun-except ValueError test_demo.py
    test_demo.py:4: ValueError
    ======================== short test summary info =================================================
    FAILED test_demo.py::test_a - ValueError: invalid literal for int() with base 10: 'a'
    ======================== 1 failed in 0.06s ====================================================

测试AssertionError的时候 貌似跟我预期的不太一样,可能是我眼花了。

  • 如果命令行没有-v显示的是R标记

    test_demo.py RRF  # 重跑了2次后失败了 , 对应底部的1 failed, 2 rerun in 0.06s 
    
    

部分源码

  • 命令行

    # command line options
    def pytest_addoption(parser):
    group = parser.getgroup(
    "rerunfailures", "re-run failing tests to eliminate flaky failures"
    )
    group._addoption(
    "--only-rerun",
    action="append",
    dest="only_rerun",
    type=str,
    default=None,
    help="If passed, only rerun errors matching the regex provided. "
    "Pass this flag multiple times to accumulate a list of regexes "
    "to match",
    )
    group._addoption(
    "--reruns",
    action="store",
    dest="reruns",
    type=int,
    default=0,
    help="number of times to re-run failed tests. defaults to 0.",
    )
    group._addoption(
    "--reruns-delay",
    action="store",
    dest="reruns_delay",
    type=float,
    default=0,
    help="add time (seconds) delay between reruns.",
    )
  • 装饰器参数

    def get_reruns_count(item):
    ...
    if "reruns" in rerun_marker.kwargs:
    ... def get_reruns_delay(item):
    ...
    if "reruns_delay" in rerun_marker.kwargs:
    ... def get_reruns_condition(item):
    ...
    if rerun_marker is not None and "condition" in rerun_marker.kwargs:
    ...

Pytest插件pytest-rerunfailures失败重跑的更多相关文章

  1. Pytest(4)失败重跑插件pytest-rerunfailures

    安装: pip3 install pytest-rerunfailures 重新运行所有失败用例 要重新运行所有测试失败的用例,请使用--reruns命令行选项,并指定要运行测试的最大次数: $ py ...

  2. pytest框架之rerunfailures失败重运行机制

    web自动化测试中,稳定性在整个测试运行中都至关重要,但不能保证测试脚本或者测试环境一直都能够稳定,它牵扯到诸多因素,在这里就不赘述,pytest框架相较于unittest的一大优势就在于拥有用例失败 ...

  3. pytest文档8-html报告报错截图+失败重跑

    前言 做web自动化的小伙伴应该都希望在html报告中展示失败后的截图,提升报告的档次,pytest-html也可以生成带截图的报告. conftest.py 1.失败截图可以写到conftest.p ...

  4. pytest失败重跑

    一.说明 平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来.自动化运行用例时候,也会出现偶然的bug,可以针对单个用例 ...

  5. pytest 失败重跑截图

    1.环境准备 /*@param: 作者:流浪的python Date:2019/01/19 env:python 3.7(由于3.0-3.5以下部分pytest可能有部分兼容问题安装建议2.7-2.9 ...

  6. Pytest学习笔记9-失败重跑

    前言 在进行自动化测试的过程中,我们一定会有这样的需求:希望失败的用例可以自动重跑 在pytest中,提供了pytest-rerunfailures插件可以实现自动重跑的效果 插件安装 pip命令安装 ...

  7. testng优化:失败重跑,extentReport+appium用例失败截图,测试报告发邮件

    生成的单html方便jenkins集成发邮件,= = 构建失败发邮件 参考:https://blog.csdn.net/galen2016/article/details/77975965 步骤: 1 ...

  8. 【转载】扩展Robot Framework,实现失败用例自动再执行(失败重跑)

    使用自动化脚本进行测试,经常受环境影响等各方面导致本能成功的脚本失败,下面介绍了RFS框架下,失败重跑的方法: 通过改写RobotFramework源代码增加--retry选项,实现test级别的失败 ...

  9. testng增加失败重跑机制

    注: 以下内容引自 http://www.yeetrack.com/?p=1015 testng增加失败重跑机制 Posted on 2014 年 10 月 31 日 使用Testng框架搭建自动测试 ...

  10. RF实现多次失败重跑结果合并的基础方法和优化方法

    实现思路:通过分次执行失败案例重跑,然后通过结果文件合并命令实现多次失败重跑结果文件的合并,并输出合并后的log和report文件: 说明:具体失败案例重跑命令和结果文件合并命令请参考本博客其他相关章 ...

随机推荐

  1. C#程序自启动

    在窗体加载事件里面加入下述代码: //设置开机自启动 RegistryKey registryKey = Registry.CurrentUser.OpenSubKey ("SOFTWARE ...

  2. perl静态变量

    state操作符功能类似于C里面的static修饰符,state关键字将局部变量变得持久. state也是词法变量,所以只在定义该变量的词法作用域中有效,举个例子: #!/usr/bin/perl u ...

  3. 如何精简 Prometheus 的指标和存储占用

    前言 随着 Prometheus 监控的组件.数量.指标越来越多,Prometheus 对计算性能的要求会越来越高,存储占用也会越来越多. 在这种情况下,要优化 Prometheus 性能, 优化存储 ...

  4. windows每日定时计划任务

    若要计划安全脚本 ,Sec.vbs,每天在下午 5:00 到上午 7:59 之间每隔 100 分钟在本地计算机上运行一次,请键入: schtasks /create /tn Security Scri ...

  5. php zip下载附件到压缩包并浏览器下载

    /** * 下载图片并生成压缩包 * @param $arr 资源数组 * @return string */ function downloadZipImg($arr) {if(is_array($ ...

  6. laravel框架部署

    每一个 Laravel 程序都会生成一个随机的 32 位长度的字符串存储在 .env 文件中的 APP_KEY 键值中, 当我们新建 Laravel 项目的时候会自动为你创建一个,只有在克隆的时候你才 ...

  7. Go 的windows安装与环境配置

    1.请前往go的官网下载安装包:https://golang.org/dl/ 安装你如果C盘够大比较土豪就一路next即可,在这里小编穷就安装到了D:\Program Files\Go 2.环境变量配 ...

  8. NET 6 实现滑动验证码(三)、接口

    题外话,有网友说,这玩意根本很容易破解,确实是这样.但验证码这东西,就跟锁子很类似,防君子不防小人.验证码的发明其实是社会文明的退步.因为它阻碍了真正的使用者,却无法阻挡别有用心的人.但又有什么办法呢 ...

  9. CPU 和 CPU Core 有啥区别?多核 CPU?多个 CPU?

    CPU 全称 Central Processing Unit,中央处理器,计算机的大脑,长这个样子: CPU 通过一个插槽安装在主板上,这个插槽也叫做 CPU Socket,它长这个样子: 而我们说的 ...

  10. jQuery基本使用

    目录 一:jQuery查找标签 1.基本选择器 二:分组与嵌套 三:组合选择器 四:jQuery基本筛选器 五:属性选择器 1.属性标签 六:JQuery表单筛选器 1.type属性 2.表单对象属性 ...