Skip to content

[自动合并 P2-9] flaky 测试治理 #94

Description

@randypanding

目标

建立 flaky 测试治理:flaky 识别、带过期时间的隔离清单、有上限且入账的自动重试。假红会逼人手动 rerun——这是最隐形的人类瓶颈,必须在无人值守设计内解决。

背景(源自 #81 §6)

假红的成本不是一次 rerun,而是"人被迫回到环路里"。同时"无声重试到绿"是另一种作弊:真回归会被当成 flaky 刷掉。设计约束:重试次数入账且封顶;隔离(quarantine)必须带过期时间,过期的测试自动回炉——不许永久隔离。

涉及文件

  • CI-Workflows 测试 job(重试机制与 flaky 标记产出)
  • governance/policy/testing.yaml(重试上限、flaky 判定规则、隔离期限声明)
  • 隔离清单落盘位置(各仓 tests/quarantine.yaml 或中心 policy,选型时定)
  • drift-check 或周期任务(隔离到期回炉检测)

执行步骤

  1. 自动重试:测试失败时自动重试 ≤2 次(上限进 policy);重试次数写入 check 输出/PR comment 入账——不允许无声重试。
  2. flaky 识别:同一测试在相同代码上"失败→重试通过"记一次 flaky 事件;窗口期内(如 30 天)flaky 事件 ≥3 次的测试进隔离清单候选,自动开 issue 叫人确认。
  3. 隔离清单:每条带 owner 与过期时间(≤30 天);隔离的测试从 gate 判定中排除但单独汇报;到期未修复 → 自动回炉(重新纳入 gate)并升级 issue。
  4. 隔离清单本身的变更走 ADR(防 agent 把真回归塞进隔离清单)。
  5. flaky 统计进 SLI(P3-4 的 gate 假红率指标)。

验收标准

  • 失败测试自动重试 ≤2 次且每次入账可见;重试通过记 flaky 事件。
  • 隔离的测试不影响 gate 但单独列出;隔离到期自动回炉。
  • 隔离清单变更无 ADR 则 gate 红。
  • 真回归(确定性失败)重试后仍红,不会被误判 flaky 放行。

测试方法(预先指定)

T1 重试上限与入账(核心):在测试仓注入一个必败测试 → 断言:自动重试恰好 2 次后 gate 红(总运行 3 次,无第 4 次);重试次数在 check 输出/PR comment 中可见。

T2 flaky 识别(核心):注入一个按运行次数奇偶决定成败的测试(用计数文件/环境模拟)→ 断言:首次失败、重试通过、gate 绿、且该测试被记录一次 flaky 事件(查询记录位置断言存在)。

T3 真回归不误放(负向,关键安全属性):注入确定性失败测试 → 断言重试 2 次全败、gate 红、产生 flaky 记录(或记录但明确标注非 flaky)——证明"重试到绿"通道对确定性失败关闭。

T4 隔离与回炉(时间注入)

  1. 把某测试加入隔离清单(走 ADR 流程),过期时间设为测试用短值(如 1 分钟)。
  2. 断言:隔离生效期间 gate 不受该测试影响且单独汇报中出现它。
  3. 到期后触发周期任务 → 断言该测试自动回炉、重新参与 gate、产生升级 issue。

T5 隔离清单保护(负向):PR 直接修改隔离清单(把某测试加进去)且不引用 ADR → 断言 gate 红(adr-required 覆盖该路径)。

依赖

  • P1-3(gate aggregator)
  • P2-1(测试篡改检测与隔离清单保护共用 ADR 逃生门机制)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    auto-merge自动合并计划(#81)工作卡gateGate 工作流相关process

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions