Agent Skills
返回列表
💻

pytest不稳定用例自动重试

开发编程 更新于 2026.08.29

将以下提示词粘贴到你的 AI 对话框中:

请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/automatically-rerun-flaky-pytest-cases-with-bounded-retry-rules-before-intermittent-failures-block-merges-with-pytest-rerunfailu。

技能介绍

要解决的问题

CI 流水线里,一些 pytest 用例本身不稳定——可能在并发负载下偶发超时、依赖外部资源时随机失败,或在本地能过但线上环境触发边界条件。这类 flaky tests 一旦在 PR 合并前冒头,就会让构建变红,工程师不得不手动重跑整个套件,等待十几分钟只为确认某个用例是否只是临时抖动。更糟的是,如果没人盯着,这些偶发失败可能反复阻塞合并,拖慢交付节奏。

核心能力与工作方式

该技能通过 pytest-rerunfailures 插件为测试运行注入受控的有限重试规则。它不追求无限重跑,而是设定明确的重试边界:当某个用例失败时,插件会在当前会话内自动重新执行该用例(而非整个套件),直到达到预设的重试上限或最终稳定通过。代理层在此过程中可以捕获每次重试的结果,并基于最终状态——无论是成功还是持续失败——给出准确的测试报告。

具体执行时,技能依赖以下关键步骤:

  • 在 pytest 启动参数中启用 --reruns 及可选的 --reruns-delay,控制最大重试次数与等待间隔
  • 插件拦截失败用例,在隔离上下文中重新运行,避免污染其他测试的状态
  • 重试耗尽后,原始失败信息会被完整保留并上报,不会因自动重跑而被掩盖
  • 代理据此判断:是真实的回归缺陷,还是需要排查环境稳定性

适用边界与注意事项

此方案适用于已确认存在间歇性失败的用例,而非替代对确定性 bug 的修复。重试机制不能替代良好的测试隔离设计——如果用例间存在共享状态或外部依赖,重跑本身可能引入新的不确定性。此外,pytest-rerunfailures 对硬崩溃(hard crashes)的恢复能力有限,只能从特定类型的进程中断中恢复。使用前需确保环境满足 Python 3.10+、pytest 8.1+ 的先决条件,并理解重试次数不宜设置过高,以免延长 CI 时长掩盖真实问题。

使用场景

  • CI 流水线中某个 pytest 用例偶发超时失败,需要在合并 PR 前用有限次数重试确认是否为环境抖动。
  • 团队提交的测试套件存在间歇性失败,需要在不手动重跑全部用例的情况下拿到最终失败报告。
  • CI 构建因依赖外部资源的测试用例随机失败而变红,需要自动重跑这些用例以判断是回归还是临时故障。
  • 夜间定时测试中部分用例在高负载下偶发报错,需要在无人值守时自动重试并保留最终失败状态供排查。

适合人员

  • 负责 CI 流水线维护的 DevOps 工程师,需要在合并前自动过滤偶发测试失败以避免误报阻塞。
  • 经常处理 flaky tests 的后端开发者,需要在本地或 CI 中快速确认偶发失败是环境问题还是代码回归。
  • 管理大型测试套件的技术负责人,需要在无人值守的定时任务中自动重跑不稳定用例并收集最终报告。
  • 使用 AI 代理执行测试任务的开发者,需要代理在重试耗尽后准确报告最终失败状态以触发后续排查流程。