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. JavaWeb2

    1. web服务器软件:Tomcat 1.1 概述 服务器:安装了服务器软件的计算机 服务器软件:接受用户的请求,处理请求,做出响应 web服务器软件:接受用户的请求,处理请求,做出响应 在web服务 ...

  2. ES6高级编程(一)

    一.JavaScript概要 1.1.JavaScript组成 JavaScript主要由三部分构成,分别是ECMAScript.DOM与BOM ECMAScript定义了该语言的语法.类型.语句.关 ...

  3. 记一次node节点无法加入K8S集群

    #问题现象:root@small-virtual-machine:~# kubeadm join 10.0.0.133:6443 --token d2hyl5.5qt5fzjsdbxm2k5o     ...

  4. 【Java并发001】使用级别:线程相关知识

    一.前言 本文介绍Java线程相关知识(不包括线程同步+线程通信,这个内容在笔者的另一篇博客中介绍过了),包括:线程生命周期.线程优先级.线程礼让.后台线程.联合线程. 二.线程生命周期 2.1 引子 ...

  5. 启动homestead虚拟机 vagrant up执行后,提示Timed out while waiting for the machine to boot

    最近在启动homestead虚拟机时,总会卡在ssh验证这,几分钟后,就报timed out-- 以往都是重启电脑后,再次执行vagrant up后就能正常启动. 今日重启电脑很多次也无用. 查询解决 ...

  6. Go | 函数注意事项

    细节汇总 函数的形参列表可以是多个,返回值列表也可以是多个 形参列表和返回值列表的数据类型,可以是值类型.也可以是引用类型 函数的命名遵循标识符命名规范,首字母不能是数字,首字母大写表示该函数可以被本 ...

  7. 关于咪咕视频的m3u8再次解析

    软件和源码 前言 之前写过一片文章: 关于突破咪咕视频付费限制的研究, 但是后来我发现评论说已经不能用了,我知道肯定是api修改了,写这种东西就是这样,不一定什么时候就变化了,然后就用不了了,我懒得继 ...

  8. vulnhub靶场之HACK ME PLEASE

    准备: 攻击机:虚拟机kali.本机win10. 靶机:HACK ME PLEASE,下载地址:https://download.vulnhub.com/hackmeplease/Hack_Me_Pl ...

  9. Java常用开发文档及工具

    一.实用工具/网站 1.PHP中文网:https://www.php.cn/ 2.Json工具:http://www.bejson.com/ 3.IT大哥导航:https://itdage.com/ ...

  10. 【基础语法规范】BC1:Hello Nowcoder

    语言1:Java public class Main{ public static void main(String[] args){ System.out.println("Hello N ...