Pytest失败重跑机制pytest-rerunfailures的实现

 更新时间:2025年06月29日 10:20:52   作者:Tom Boom  
pytest-rerunfailures插件是解决自动化测试偶发故障的有效工具,通过--reruns设置重试次数和--reruns-delay配置间隔时间,具有一定的参考价值,感兴趣的可以了解一下

在自动化测试中,偶发性失败是常见痛点。本文将深入解析如何通过pytest-rerunfailures插件优雅解决偶发故障问题。

一、核心命令解析

安装命令

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest-rerunfailures
  • -i:指定镜像源(国内加速)
  • pypi.tuna.tsinghua.edu.cn:清华大学PyPI镜像
  • pytest-rerunfailures:失败重跑插件

基础重跑命令

pytest -s testcases/test_rerun.py --reruns 5
  • --reruns 5:最大重试次数(失败后自动重跑最多5次)

延迟重跑命令

pytest -s testcases/test_rerun.py --reruns 5 --reruns-delay 1
  • --reruns-delay 1:每次重试间隔1秒

二、为什么需要失败重跑?

偶发性失败的常见原因

失败类型占比典型场景
环境波动40%网络抖动、资源竞争
时序问题30%异步操作未完成
第三方依赖20%API限流、服务不稳定
随机因素10%随机数据冲突

重跑机制的价值

graph LR
    A[首次失败] --> B{是否可重跑?}
    B -->|是| C[自动重试]
    B -->|否| D[标记失败]
    C --> E{重试成功?}
    E -->|是| F[报告成功]
    E -->|否| D

三、实战演示:重跑机制应用

测试场景:支付结果查询

# test_payment.py
import pytest
import random

def test_payment_status():
    """ 模拟第三方支付接口的不稳定响应 """
    result = random.choice([True, False])  # 50%失败率
    assert result, "支付状态查询失败"

执行结果对比

无重跑机制

$ pytest test_payment.py
============================
1 failed in 0.12s

启用重跑机制

$ pytest test_payment.py --reruns 3 --reruns-delay 0.5
============================
rerun test_payment.py::test_payment_status
Rerun #1: 失败
Rerun #2: 成功

1 passed, 2 rerun in 0.87s

四、进阶使用技巧

1. 标记特定测试重跑

@pytest.mark.flaky(reruns=3, reruns_delay=1)
def test_api_connection():
    response = requests.get("https://unstable-api.com")
    assert response.status_code == 200

优势:针对不稳定API单独设置重试策略

2. 条件重跑(仅重试特定异常)

@pytest.mark.flaky(
    reruns=3, 
    condition=TypeError  # 仅当捕获TypeError时重试
)
def test_data_processing():
    # 可能因数据类型错误失败
    process_data(get_external_data())

3. 重跑结果报告增强

pytest --reruns 2 --reruns-delay 1 --html=report.html

报告效果

测试用例      状态     重试次数
test_login   PASSED   0
test_payment PASSED   2 (首次失败)

五、重跑机制原理剖析

执行流程

1. pytest收集测试用例
2. 执行原始测试
   - 成功 → 记录结果
   - 失败 → 触发重试机制
3. 重试执行(最多N次)
   - 任意成功 → 标记为passed
   - 全部失败 → 标记为failed
4. 生成最终报告

注意事项

  1. setup/teardown:每次重试都会重新执行
  2. 测试状态:只有最终状态计入报告
  3. 耗时计算:包含所有重试时间总和

六、最佳实践指南

1. 重试策略配置建议

场景类型rerunsreruns-delay说明
网络依赖3-51-3s等待网络恢复
异步操作2-30.5-1s给操作完成时间
高负载服务5+随机延迟避免雪崩效应
数据库竞争30.3s减少锁冲突

2. 避免滥用重跑

不应使用重跑的场景

  • 逻辑性错误(永远失败)
  • 环境配置错误
  • 数据一致性问题
  • 性能不达标场景

3. 结合其他机制

# 重跑+分布式执行
pytest -n auto --reruns 3

# 重跑+失败截图
pytest --reruns 2 --screenshot-on-failure

# 重跑+性能监控
pytest --reruns 1 --perf-monitor

七、企业级应用案例

案例1:电商支付系统测试

挑战:支付网关接口偶发超时(发生率约5%)
解决方案

pytest tests/payment/ --reruns 3 --reruns-delay 2

效果

  • 测试稳定性从95%提升至99.9%
  • 误报缺陷减少90%
  • 团队信任度显著提升

案例2:微服务集成测试

问题:服务启动顺序导致偶发失败
重跑策略

@pytest.mark.flaky(
    reruns=2, 
    reruns_delay=5,  # 等待服务注册完成
    condition=ConnectionError
)
def test_service_integration():
    # 测试服务间调用

案例3:移动App自动化测试

特殊需求

  • 首次安装权限弹窗干扰
  • 应用启动时间波动
    定制方案
pytest mobile_tests/ --reruns 1 --reruns-delay 10

首次失败后等待10秒重试,避开初始化阶段

八、常见问题解决方案

Q1:重跑导致测试时间过长

解决方案

# 只对标记为flaky的测试重跑
pytest -m flaky --reruns 3

# 使用智能延迟(指数退避)
@pytest.mark.flaky(reruns=3, reruns_delay="exponential")

Q2:如何区分重跑日志?

# conftest.py
def pytest_runtest_logstart(nodeid, location):
    if hasattr(request.node, "execution_count"):
        count = request.node.execution_count
        print(f"\n[重试 #{count}] {nodeid}")

Q3:重跑后如何清理状态?

@pytest.fixture(autouse=True)
def cleanup_after_retry(request):
    yield
    if hasattr(request.node, "execution_count"):
        # 每次重试后清理
        reset_test_state()

九、重跑机制核心价值

核心优势矩阵

维度传统模式重跑机制
稳定性偶发失败导致误报过滤偶发故障
可信度报告可信度低真实反映质量
维护成本大量时间排查伪缺陷聚焦真实问题
执行效率手动重跑浪费时间自动恢复执行

最佳实践口诀

偶发失败不用慌,rerun插件来帮忙
--reruns 设次数,--delay 定间隔
标记注解更精准,避免滥用记心上
结合报告分布式,测试稳定又高效

通过合理应用pytest-rerunfailures,您可以将自动化测试的稳定性提升到新的高度。记住:重跑是应对偶发故障的利器,但不是代码质量问题的遮羞布。当测试频繁重试时,仍需深入分析根本原因!

到此这篇关于Pytest失败重跑机制pytest-rerunfailures的实现的文章就介绍到这了,更多相关Pytest失败重跑内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Python实现批量修改文件的修改日期功能

    使用Python实现批量修改文件的修改日期功能

    在日常的文件管理中,您可能需要批量修改文件的修改日期,比如,您可能希望将某个文件夹中的所有文件的修改日期随机设置为6到8月份之间的日期,这在数据整理中可能非常有用,本文将详细介绍如何使用Python实现这一功能,需要的朋友可以参考下
    2024-10-10
  • Python浅析多态与鸭子类型使用实例

    Python浅析多态与鸭子类型使用实例

    python是一门解释语言,但是同java等静态语言一样,是可以通过继承的方式实现多态。而且python还有一个自己的特殊实现多态的方法,就是通过鸭子类型,来实现多态
    2022-10-10
  • Python字典和集合讲解

    Python字典和集合讲解

    这篇文章主要给大家假关节的是Python字典和集合,字典是Python内置的数据结构之一,是一个无序的序列;而集合是python语言提供的内置数据结构,没有value的字典,集合类型与其他类型最大的区别在于,它不包含重复元素。想具体了解有关python字典与集合,请看下面文章内容
    2021-10-10
  • 在anaconda中配置graphviz包的详细过程

    在anaconda中配置graphviz包的详细过程

    graphviz是贝尔实验室开发的一个开源的工具包,它使用一个特定的DSL(领域特定语言):dot作为脚本语言,然后使用布局引擎来解析此脚本,并完成自动布局,这篇文章主要介绍了如何在anaconda中配置graphviz包,需要的朋友可以参考下
    2023-02-02
  • python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法

    python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法

    今天小编就为大家分享一篇python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Vscode使用matplotlib显示图像详细图文教程

    Vscode使用matplotlib显示图像详细图文教程

    最近使用python里的matplotlib库绘图,想在代码结束时显示图片看看,下面这篇文章主要给大家介绍了关于Vscode使用matplotlib显示图像的相关资料,需要的朋友可以参考下
    2024-03-03
  • Python表示当前时间的方法合集

    Python表示当前时间的方法合集

    在 Python 中获取当前时间是许多与时间有关的操作的一个很好的起点。一个非常重要的用例是创建时间戳。在本教程中,你将学习如何用 datetime 模块获取、显示和格式化当前时间
    2023-01-01
  • 轻松实现TensorFlow微信跳一跳的AI

    轻松实现TensorFlow微信跳一跳的AI

    这篇文章主要教大家如何轻松实现TensorFlow微信跳一跳的AI,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • python 自定义装饰器实例详解

    python 自定义装饰器实例详解

    这篇文章主要介绍了python 自定义装饰器,结合实例形式分析了Python自定义装饰器的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-07-07
  • python Tcp协议发送和接收信息的例子

    python Tcp协议发送和接收信息的例子

    今天小编就为大家分享一篇python Tcp协议发送和接收信息的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论