自动化质量保证 (QA)QA自动化 / SDET

如何正确实现自动测试的重试机制:何时应用,何时不应用?

用 Hintsage AI 助手通过面试

答案。

测试重试机制(retry)旨在提高测试管道的稳定性,解决不稳定的自动测试,但需要理智的方法。

问题背景 作为临时基础设施错误或不稳定错误的解决办法出现,与应用程序错误无关(不稳定的环境、网络问题、API的随机超时)。许多CI/CD系统现在支持内置的retry

问题 过度或不受控制的retry可能会掩盖真实的bug或者将崩溃变为"只是临时现象"。会出现假阳性结果:看似测试通过,但bug依然存在。

解决方案 仅对不稳定或依赖外部的测试启用retry,使用标签或标记。设定固定的重试次数限制(1-2次)。记录所有的崩溃和重试的成功,以便分析故障原因。

import pytest @pytest.mark.flaky(reruns=2, reruns_delay=5) def test_external_api(): # 可能因API不稳定而失败的测试 ...

关键特点:

  • 应该有意识地使用
  • 始终分析重试的原因
  • 不掩盖应用程序的bug,只处理基础设施的/flaky问题

陷阱问题。

可以对管道中的所有自动测试进行重试吗?

这是一个坏习惯:掩盖真实的bug和测试的架构问题。重试应该是针对某些类型测试的最后手段。

如果经过3次重试测试仍然无法通过该怎么办?

停止运行并报告不稳定性/调查bug——这样可以找出需要重构的棘手错误。

如果测试第二次通过——那就代表一切正常吗?

不,唯一正确的状态是第一次就能稳定通过。第二次通过是问题的指标(flaky或基础设施问题)。

常见错误和反模式

  • 不受控制地使用重试,掩盖bug
  • 缺乏崩溃原因的分析
  • 将重试作为真实问题的替代解决方案

生活中的例子

负面案例

对整个Jenkins管道启用了全局重试,限制为两次重试。一个月后,代码中的竞争条件导致的bug扩散,团队认为"质量不错"。产品在生产中突然因为相同的bug崩溃。

优点:

  • 有绿色的管道

缺点:

  • 应用的bug没有及时被发现
  • 挖掘时很难找到不可靠的源头

正面案例

对与外部API有关的测试类别仅设置了重试(根据标签)。其他所有测试严格要求一次通过。通过日志,团队调查并修复重复的失败。

优点:

  • 真实的bug立即可见
  • 重试保护了免受外部系统的偶发错误
  • 可以分析和消除问题的根源

缺点:

  • 需要维护测试标签和重试的原因
  • 管道的维护稍微复杂一些