测试重试机制(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和测试的架构问题。重试应该是针对某些类型测试的最后手段。
如果经过3次重试测试仍然无法通过该怎么办?
停止运行并报告不稳定性/调查bug——这样可以找出需要重构的棘手错误。
如果测试第二次通过——那就代表一切正常吗?
不,唯一正确的状态是第一次就能稳定通过。第二次通过是问题的指标(flaky或基础设施问题)。
对整个Jenkins管道启用了全局重试,限制为两次重试。一个月后,代码中的竞争条件导致的bug扩散,团队认为"质量不错"。产品在生产中突然因为相同的bug崩溃。
优点:
缺点:
对与外部API有关的测试类别仅设置了重试(根据标签)。其他所有测试严格要求一次通过。通过日志,团队调查并修复重复的失败。
优点:
缺点: