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

作者:

文章目录
  • 目录
    • 一、核心命令解析
      • 安装命令
      • 基础重跑命令
      • 延迟重跑命令
    • 二、为什么需要失败重跑?
      • 偶发性失败的常见原因
      • 重跑机制的价值
    • 三、实战演示:重跑机制应用
      • 测试场景:支付结果查询
      • 执行结果对比
    • 四、进阶使用技巧
      • 1. 标记特定测试重跑
      • 2. 条件重跑(仅重试特定异常)
      • 3. 重跑结果报告增强
    • 五、重跑机制原理剖析
      • 执行流程
      • 注意事项
    • 六、最佳实践指南
      • 1. 重试策略配置建议
      • 2. 避免滥用重跑
      • 3. 结合其他机制
    • 七、企业级应用案例
      • 案例1:电商支付系统测试
      • 案例2:微服务集成测试
      • 案例3:移动App自动化测试
    • 八、常见问题解决方案
      • Q1:重跑导致测试时间过长
      • Q2:如何区分重跑日志?
      • Q3:重跑后如何清理状态?
    • 九、重跑机制核心价值
      • 核心优势矩阵
      • 最佳实践口诀

    在自动化测试中,偶发性失败是常见痛点。本文将深入解析如何通过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
    

    @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单独设置重试策略

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

    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. 耗时计算:包含所有重试时间总和

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

    不应使用重跑的场景

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

    # 重跑+分布式执行
    pytest -n auto --reruns 3
    
    # 重跑+失败截图
    pytest --reruns 2 --screenshot-on-failure
    
    # 重跑+性能监控
    pytest --reruns 1 --perf-monitor
    

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

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

    效果

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

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

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

    特殊需求

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

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

    解决方案

    # 只对标记为flaky的测试重跑
    pytest -m flaky --reruns 3
    
    # 使用智能延迟(指数退避)
    @pytest.mark.flaky(reruns=3, reruns_delay="exponential")
    

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

    @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优化测试稳定性的失败重试工具pytest-rerunfailures详解
    • pytest 用例执行失败后其他不再执行

    站内搜索