pytest-rerunfailures:优化测试稳定性的失败重试工具

2023-12-17

2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)-CSDN博客 文章浏览阅读1.8k次,点赞82次,收藏11次。你知不知道有这么一个软件测试面试的刷题小程序。里面包含了面试常问的软件测试基础题,web自动化测试、app自动化测试、接口测试、性能测试、自动化测试、安全测试及一些常问到的人力资源题目。最主要的是他还收集了像阿里、华为这样的大厂面试真题,还有互动交流板块…… https://blog.csdn.net/AI_Green/article/details/134931243?spm=1001.2014.3001.5501 笔者在执行自动化测试用例时,会发现有时候用例失败并非代码问题,而是由于服务正在发版,导致请求失败,从而降低了自动化用例的稳定性,最后还要花时间定位到底是自身case的原因还是业务逻辑问题,还是其他原因,增加了定位成本。增加容错机制,失败重试,会解决大部分由于网络原因、服务重启等原因造成的case失败问题。那该如何增加失败重试机制呢?带着问题我们一起探索。

02 pytest-rerunfailures 插件

先给出答案,我们将使用 pytest-rerunfailures 插件来实现失败重试功能。

什么是 pytest-rerunfailures ?

pytest-rerunfailures 是一个基于 pytest 框架的插件,它允许我们对测试用例进行失败重试。当一个测试用例失败时,插件会自动重新运行失败的测试用例,直到达到预定的重试次数或测试用例通过为止。这样可以增加用例的稳定性,并减少因为偶发性问题导致的测试失败。

如何使用 pytest-rerunfailures ?

  • 方式一

首先,确保已经安装了 pytest-rerunfailures 插件。可以使用以下命令进行安装:

pip install pytest-rerunfailures

安装完成后,在项目中使用 pytest 运行测试用例时,pytest-rerunfailures 插件会自动生效。

接下来,在编写测试用例时,可以通过添加 @pytest.mark.flaky 装饰器将需要重试的测试用例标记起来。例如:

test_demo.py

import pytest


@pytest.mark.flaky(reruns=3, reruns_delay=2)
def test_case():
    assert 1 == 2

在上述示例中,我们使用了 @pytest.mark.flaky 装饰器来标记测试用例 test_case 为可重试的。参数 reruns 指定了重试次数,而 reruns_delay 则指定了每次重试之间的延迟时间(以秒为单位)。
  

我们来运行case,看一下执行结果:

执行命令:pytest -s -v test_demo.py::test_case,会看到如下结果:

RERUN
test_dir/test_demo.py::test_case RERUN
test_dir/test_demo.py::test_case RERUN
test_dir/test_demo.py::test_case FAILED

可以看到,重试了3次,最终结果为失败。

注意:如果你是在pycharm中点击绿色三角形直接运行是不生效的

总结一下:

当运行测试时,如果测试用例失败,pytest-rerunfailures 插件会根据我们配置的重试次数和延迟时间自动重新运行该测试用例,直到达到最大重试次数或测试通过为止。

  • 方式二

除了使用装饰器来标记测试用例外,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 最后 ​​​​​​​

失败重试功能并不是解决所有测试问题的法宝,它应该被视为一种提高测试稳定性的辅助手段。在使用 pytest-rerunfailures 进行失败重试时,我们应该仔细分析失败的原因,确保重试次数和延迟时间设置合理,并与团队成员共同讨论和决定是否需要重试测试用例。

总结起来,pytest-rerunfailures 是一个非常有用的工具,可以提高测试用例的稳定性。通过使用它,我们可以轻松地实现失败重试功能,并减少由于偶发性问题导致的测试失败。

另外源码中,看到了 pytest_runtest_logstart 等,可能有些同学不明白这是干嘛用的,之后我们专门写一篇文章来介绍它的作用。

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时, 请及时加入群: 786229024 ,里面有各种测试开发资料和技术可以一起交流哦。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取 【保证100%免费】

在这里插入图片描述

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。 在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytest-rerunfailures:优化测试稳定性的失败重试工具 的相关文章

  • JMeter 中的周期性后台任务

    我的测试计划中的请求使用授权令牌 我知道该令牌将在 1 小时内过期 我需要以某种方式每 59 分钟重新请求一次令牌 直到测试完成 有人可以建议最好的方法吗 看起来使用 While 控制器测试将永远不会完成并停留在永恒的 while 循环中
  • pytest 无法导入模块,而 python 可以

    我正在用 Python 开发一个包 我使用虚拟环境 我在 virtualenv 的 pth 路径中设置了模块根目录的路径 这样我就可以在开发代码时导入包的模块并进行测试 问题 1 这是一个好方法吗 这工作正常 这是一个例子 这是我想要的行为
  • Selenium 登录测试不接受 pytest 设备登录或拒绝连接

    我变得绝望 因为我似乎找不到一个我认为每个人都会使用的解决方案 我想使用 selenium 和 pytest 以及 live server url 来测试简单的登录 根据 pytest django 文档 一个简单的固定装置称为live s
  • 无法在fiddler中捕获jmeter流量

    我创建了 JMeter 记录 但当我开始测试时 我在 Fiddler 中没有看到任何请求 我改变了 Fiddler 中的端口号为 8080 我在 JMeter 中使用该端口号 Steps 创建线程组 将Http请求添加到线程组并输入URL
  • 使用conftest.py 与从专用模块导入装置

    我最近开始熟悉 pytest 以及如何使用conftest py定义在我的测试中自动发现和导入的装置 我很清楚如何conftest py工作原理以及如何使用它 但我不确定为什么这在某些基本场景中被认为是最佳实践 假设我的测试是这样构建的 t
  • 如何设置http请求的源IP?

    在发送 http 请求之前 我需要设置源 IP 地址 用于 IP 欺骗等 用于建立http连接的类是HTTPURLConnection 我在 stackoverflow 上找到了下面的链接 这非常有用 注册和使用自定义 java net U
  • 在 pytest 中参数化并运行单个测试

    如何从配置了参数化的集合中运行单个测试 假设我有以下测试方法 pytest mark parametrize PARAMETERS LIST PARAMETERS VALUES def test my feature self param1
  • PhantomJS CPU(核心)受限吗?

    我开始做一些基于并行浏览器的测试 并想看看在达到 100 CPU 之前我可以在 EC2 大型机器上并行运行多少个浏览器 我正在使用 JMeter webdriver 插件来实际运行浏览器 对于 FireFox 实际上每个 CPU 核心有 1
  • 如何从视图中删除单元测试的“@oidc.login_required”?

    I use 烧瓶样机 questions tagged flask oidc用于用户登录和pytest questions tagged pytest供测试用 对于单元测试 我想 删除 oidc require login 我怎样才能做到这
  • 模拟导入失败

    我该如何制作import pkg失败moduleA py 我可以打补丁pkg如果从中导入某些内容则会失败 否则不会失败 test py import os import moduleA from unittest mock import p
  • 如何告诉 pytest-xdist 按顺序从一个文件夹运行测试,并并行运行其余文件夹?

    想象一下我有test unit 可以安全地并行运行并且test functional 目前还不能并行运行 有没有一种简单的方法可以说服 pytest 运行functional依次 考虑到我们正在讨论大量的测试 因此改变每个测试函数 方法将会
  • 单元测试 python 代码,其中 configparser 从配置文件中读取

    我是 python 单元测试的新手 我学习并进行了示例单元测试 其中方法接受输入并返回输出 但对于下面提到的代码 我有一些疑问 如何在unittest中模拟init方法的configparser 路径 config program cfg
  • 在 JMETER 中循环遍历 JSON 响应 +

    我正在使用 Jmeter 进行性能测试并卡在以下点 我从 Webapi 收到 JSON 响应 如下所示 PersonInfoList Person 0 id 1 name Steve 1 Person id 2 name Mark 我需要根
  • Django Channels Postgres InterfaceError:连接已关闭

    我似乎无法理解这里的问题 我正在为我的渠道消费者编写测试文档中的描述 https channels readthedocs io en latest topics testing html 我通常会使用 Django 默认的单元测试 但由于
  • pytest.raises(Error) 如何工作?

    对 Python 来说是新手 但我试图理解这段代码 with pytest raises ValueError group adjust vals grps 1 grps 2 weights 看完之后本教程与 http effbot org
  • 使用 Pytest 的参数化添加测试功能的描述

    当其中一个测试失败时 可以在测试正在测试的内容的参数化中添加描述 快速了解测试失败的原因 有时您不知道测试失败的原因 您必须查看代码 通过每个测试的描述 您就可以知道 例如 pytest mark parametrize num1 num2
  • Pytest报告摘要显示错误信息

    我对 pytest 挂钩和插件相对较新 我无法弄清楚如何让我的 pytest 代码为我提供测试执行摘要以及失败原因 考虑代码 class Foo def init self val self val val def test compare
  • GET 错误:ModuleNotFoundError:没有名为“api”的模块

    当我尝试运行 pytest 命令时出现错误 错误是当我在 docker 上运行应用程序时 当我在本地执行时 它可以工作 还有另一个好奇心 swagger 和 de requests 工作正常 只是测试文件不行 我已经尝试过 python m
  • Jmeter 和 Bitbucket 服务器负载测试

    我是 Jmeter 的新手 我有一个本地托管的 Bitbucket 服务器 有时 当 Bamboo plan 触发并发 git 克隆操作时 会发现 Bitbucket 服务器变得缓慢 无响应 我必须重新启动服务 我想通过对另一个本地创建的
  • pytest 看不到正在测试的函数的日志

    我有一个像这样的烧瓶应用程序 from flask import Flask import logging app Flask name app route def catch all logging warning I m a warni

随机推荐

  • 外包干了3个月,技术退步明显。。。

    先说一下自己的情况 本科生生 19年通过校招进入广州某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋
  • 【计算机网络概述】第一章:概论 1.3什么是网络核心

    学习目标 网络核心 电路交换 分组交换 电路交换与分组交换的区别 前言 上一篇文章学习了网络边缘 知道了主机和应用进程 端系统 是怎么接入网络核心中的 端系统的两种模式 客户端 服务器模式 对等模式 端系统中利用两种面向网络实施的服务 TC
  • 基于java中SSM框架和vue.js实现红酒网站演示【附项目源码】

    基于java中SSM框架和vue js实现红酒网站演示 JAVA简介 JAVA语言是目前软件市场上应用最广泛的语言开发程序 可以在多种平台上运用的 兼容性比较强 适应市面上大多数操作系统 不会出现乱码的现像 其扩展性和维护性都更好 具有分析
  • 车载以太网-DoIP

    文章目录 车载以太网DoIP协议 Diagnostics over Internet Protocol DoIP协议的报文格式 DoIP报文类型 DoIP协议的完整流程 车载以太网DoIP协议 Diagnostics over Intern
  • 题解 | #输出单向链表中倒数第k个结点#

    滴滴前端日常实习一面 字节跳动前端日常实习 一面 Cider秋招一二面 已拒 贝壳编程题题解 山东offer选择 求助 选择华为还是中电14所 写论文 写论文 华为 煞笔公司 华为待遇问题 已接offer 字节跳动飞书运营实习面经 华为 煞
  • 编写http接口api及接口自动化测试

    片言 此文中代码都是笔者工作中源码 所以不会很完整 主要摘常见场景的api片段用以举例说明 另 此文主要针对自动化测试人员 尤其有python基础阅读更佳 笔者使用 python3 6 postgresql10 flask 0 12 的环境
  • 题解 | #某宝店铺连续2天及以上购物的用户及其对应的天数#

    腾讯财经线暑期实习生面经 前女友突然在我的婚礼现场求复合怎么办 不妙了 好像自己真成小丑了 华为实习 提前批面试 池子里泡了一百多天了 发的一堆sp被鸽麻了 求求大家投下小米 HC还剩50 剩下不到半个月去哪招人呀 求求大家投下小米吧 发的
  • 2024最全java面试题及答案(600道)

    本文分为十九个模块 分别是 包括了 Java面试 Spring JVM MyBatis Redis MySQL 并发编程 微服务 Linux Springboot SpringCloud MQ Kafka 面试专题 如下图所示 共包含 20
  • 搭建Android自动化python+appium环境

    一 需要软件 JDK JAVA安装后配置JDK环境 SDK SDK下载后配置adb环境 Python pyhton语言 Pycharm python脚本编译工具 Appium python client pyhton中的库 Appium客户
  • C 语言教程:数据类型和格式说明符

    C 语言中的数据类型 C 中的变量必须是指定的 数据类型 并且您必须在 printf 函数中使用 格式说明符 来显示它 创建变量 int myNum 5 整数 没有小数点 float myFloatNum 5 99 浮点数 char myL
  • 题解 | #复制部分字符串#

    拒了华为 重回0 offer 目前在大三 寒假想找个实习 退役大学生 如题 uu们帮忙看看 25届 没有实习过 没有背过八股文 心里感觉很不稳 下学期想去暑期实习 uu们 德赛西威鸽 在中国电信公司工作一年后 我提桶跑路 东北辽宁就业求职好
  • 华为OD机试真题-求字符串中所有整数的最小和-2023年OD统一考试(C卷)

    题目描述 输入字符串s 输出s中包含所有整数的最小和 说明 1 字符串s 只包含 a z A Z 2 合法的整数包括 1 正整数 一个或者多个0 9组成 如 0 2 3 002 102 2 负整数 负号 开头 数字部分由一个或者多个0 9组
  • FXSXP32.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个FXSXP32
  • APP UI自动化测试思路总结

    首先想要说明一下 APP自动化测试可能很多公司不用 但也是大部分自动化测试工程师 高级测试工程师岗位招聘信息上要求的 所以为了更好的待遇 我们还是需要花时间去掌握的 毕竟谁也不会跟钱过不去 接下来 一起总结一下APP UI自动化测试的思路吧
  • Elasticsearch安装

    1 什么是ELK ELK是Elasticsearch Logstash Kibana三大开源框架首字母大写简称 市面上也被成为Elastic Stack 1 Elasticsearch 负责日志的检索和存储 2 Logstash 负责日志的
  • 自动化测试中6种常见验证码的处理方式

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 8k次 点赞82次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • FXSAPI.dll文件缺失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个FXSAPI
  • 华为OD机试真题-查找一个有向网络的头节点和尾节点-2023年OD统一考试(C卷)

    题目描述 给定一个有向图 图中可能包含有环 图使用二维矩阵表示 每一行的第一列表示起始节点 第二列表示终止节点 如 0 1 表示从0到1的路径 每个节点用正整数表示 求这个数据的首节点与尾节点 题目给的用例会是一个首节点 但可能存在多个尾节
  • 拓展了个新业务枚举类型,资损了

    分享是最有效的学习方式 案例背景 翻车了 为了cover线上一个业务场景 小猫新增了一个新的枚举类型 盲目自信就没有测试发生产了 由于是底层服务 上层调用导致计算逻辑有误 造成资损 老板很生气 后果很严重 产品提出了一个新的业务场景 新增一
  • pytest-rerunfailures:优化测试稳定性的失败重试工具

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 8k次 点赞82次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自