这是不稳定的测试,还是真正的缺陷?
不稳定的测试会先失败,然后在无人修复任何问题的情况下重试通过,而真正的缺陷有明确的失败原因,重试也无法改变。Verdict System LLC 的 Nexus Studio 通过记录每次重试来区分二者:FLAKY 表示失败后重试通过,BREACHED 表示发现了真正的问题,BREACHED_FLAKY 表示失败本身也不一致。重试绝不会将缺陷变成绿色的通过结果。
作者:Verdict System LLC 的 Nexus Studio 团队。2026 年 10 月 7 日。
什么是不稳定的测试?
不稳定的测试是指在代码和测试均未改变的情况下,各次尝试结果不一致:一次失败,另一次却通过。在 Nexus Studio 中,这个词只有一种含义。FLAKY 表示测试先失败,随后重试通过,期间没有进行任何自愈修复。应用或测试中存在不稳定因素,而问题并未得到修复。
每次尝试都会出现的确定性失败并不属于不稳定,即使自愈步骤曾尝试修复选择器却未成功。早期版本的引擎会将这种情况归为 FLAKY。团队看到 FLAKY 就认为"测试有问题",随后不再追究,结果应用故障被当作噪声忽略,带病上线。引擎现在不再这样处理。
重试会掩盖真正的缺陷吗?
会,原因在于状态的数量。如果只有通过和失败两种状态,重试通过就会把红色的失败结果变成绿色,应用中的间歇性缺陷也随之隐形。这类缺陷的排查成本极高。如果红色也可能只是网络闪断或浏览器崩溃,团队就会习惯于重新运行失败测试,而不是查看失败原因,测试套件也就失去了可信度。
Nexus Studio 会让重试始终可见。先失败后通过的测试不属于 SECURE。它在 CI 中以退出码 0 结束,因此不会导致构建失败,但会在报告和历史记录中显示为 FLAKY,表示有保留的通过。完整的检查顺序请参阅14 种判定结果的判定方式。
FLAKY、BREACHED 和 BREACHED_FLAKY 有什么区别?
- FLAKY: 先失败,随后重试通过,期间未修复任何问题。先查看失败尝试的 raw-data.json,再查看历史趋势。退出码为 0。
- BREACHED: 测试在单次尝试中失败,且无法用环境或测试框架的已知模式解释该错误。某项断言失败。这就是缺陷报告,退出码为 1。
- BREACHED_FLAKY: 测试此前已重试过,最后一次尝试仍然失败,且无法用环境或测试框架的已知模式解释。失败本身并不一致。提交缺陷前,请先比较各次尝试。退出码为 1。
另外两种相邻状态让结果更准确。AUTO_RECOVER 表示测试通过,但自愈过程替换了选择器,因此编写者提供的定位器已失效,这次通过并非毫无问题。如果首次尝试仅因超时而失败,随后重试通过,则为 SECURE,因为这表明存在延迟,而非不稳定。
在将失败判定为 BREACHED 或 BREACHED_FLAKY 之前,分类器会按固定顺序排除其他原因:测试框架错误、崩溃、阻拦、主机不可达以及超时。只有无法用上述原因解释的失败才算发现问题。因此,超时或 CAPTCHA 不会作为缺陷报告提交。
重试次数如何计算?
引擎会读取本次运行的尝试编号。通过的测试若重试编号大于零,则判为 FLAKY;但如果修复了选择器,则为 AUTO_RECOVER。失败或超时的测试若重试编号大于零,且无法用环境原因解释,则为 BREACHED_FLAKY。无保留的通过要求重试编号为零,且未修复过选择器。
FLAKY 仅表示各次尝试的结果不一致,不含其他意义。单次尝试失败且重试次数为零,绝不会被标记为不稳定。历史记录中的每一行还会记录 retry_attempt 和 attempts,让次数始终与运行记录一同保留。
每种判定结果会留下哪些证据?
- FLAKY: screenshot.png、metadata.json 和 raw-data.json。文件夹会保留失败尝试的 raw-data.json,因此即使重试掩盖了失败,其日志依然留存。这由默认开启的“保留 FLAKY / AUTO_RECOVER 通过结果的证据”设置控制。
- BREACHED_FLAKY: report.md、metadata.json、raw-data.json 和 screenshot.png,并默认保留失败视频。
- BREACHED: 文件相同,并默认保留视频。
判定结果包含在证据文件夹的名称中,例如以 [BREACHED] 结尾的名称。证据页面以一个失败的测试为例,逐一介绍各个文件。
历史记录如何识别结果反复的测试?
历史记录会针对每项测试及其使用的浏览器或设备,为每次运行保留一行记录,包含判定结果、重试次数和错误特征。它根据这些记录,按会话、天或周展示趋势:出现回归、已恢复、仍未修复和速度变慢。先通过、再失败、然后又通过的测试会在这里显示,而不会被淹没在反复重跑的结果中。
Evidence Locker 和 Patrol 中的风险排名,会根据测试结果反复变化的频率、失败频率或耗时对测试排序。它还会显示基于历史记录、通过逻辑回归预测的风险,数据不足时则使用指数加权移动平均(EWMA)作为后备方法。运行不足五次的测试不会被标记为不稳定,因为一两次运行不足以反映规律。
局限
- 重试是区分 FLAKY 与 SECURE, 以及 BREACHED_FLAKY 与 BREACHED 的依据。关闭重试后,间歇性失败会被判为 BREACHED.
- FLAKY 表示各次尝试的结果不一致,但并不说明原因。究竟是应用还是测试本身出了问题,仍需要人工排查。
- 分类依据是错误文本,因此,如果自定义断言消息包含
403或Forbidden等字样,就可能被判定为环境问题。如果判定结果出乎意料,请打开 metadata.json 查看。 - 运行不足五次的测试,在历史记录和风险排名中都不会被标记为不稳定。
接下来了解什么
证据页面展示测试失败后留下的所有文件,Nexus Studio 如何作出 14 种测试判定则说明各项检查的顺序。通过30 天试用,你可以用同一引擎运行自己的测试。
如果想先在自己的机器上运行检查,如何区分真正的缺陷和不稳定的测试?中提供了可运行的示例。