2026-05-14

Question

你在团队里引入了一个 AI Coding Agent,它可以根据 issue 自动改代码、运行测试、提交 PR。

但上线一段时间后发现两个问题:

  • Agent 有时只跑了很小范围的单元测试,就认为改动安全;
  • 有时又会跑非常重的全量测试,导致反馈很慢、成本很高。

问题:你会如何设计 AI Coding Agent 的 test selection / verification boundary 机制,让它既不过度自信,也不过度测试?

可以从这几个角度回答:

  1. Agent 应该根据哪些信息判断要跑哪些测试?
  2. 什么情况下必须扩大验证范围,甚至要求人工确认?
  3. 如果测试缺失或测试结果不稳定,Agent 应该怎么处理?
  4. 你会如何评估这个机制是否有效?

Your Answer

我不知道

Review

本次未作答,完整示范回答如下。

Improved Answer

结论先行:AI Coding Agent 的 test selection 不应该只按“改了哪个文件”机械决定,而应该基于改动影响面、风险等级、历史信号和测试可信度,动态决定验证边界。目标是在“足够安全”和“反馈成本可控”之间做工程权衡。

1. 先用改动影响面决定基础测试范围

Agent 至少要分析四类信息:

  • 代码 diff:改了哪些文件、函数、模块、接口。
  • 依赖关系:被改代码被哪些模块调用,是否影响公共 API。
  • 变更类型
    • 文案、注释、样式类改动:可以较小范围验证;
    • 业务逻辑、权限、支付、数据写入:需要扩大测试;
    • schema、配置、依赖升级、框架升级:通常要更大范围验证。
  • 测试映射关系:哪些测试覆盖了被修改模块,例如 test file mapping、coverage、历史失败记录。

所以基础策略可以是:
先跑最相关的单元测试和静态检查,再根据风险决定是否扩大到集成测试、端到端测试或全量测试。

2. 高风险场景必须扩大验证边界

以下情况不能只跑局部测试:

  • 改动跨多个模块,影响调用链较长;
  • 修改公共接口、数据库 schema、权限逻辑、支付逻辑;
  • 修改 shared utils、middleware、基础配置;
  • 相关测试缺失或覆盖率很低;
  • Agent 自己无法明确判断影响范围;
  • 本次改动是 bug fix,但没有新增回归测试。

这时 Agent 应该升级验证范围,比如:

  • 从单测扩大到模块级测试;
  • 从模块级测试扩大到集成测试;
  • 必要时标记为需要人工 review;
  • 对高风险改动要求补充 regression test。

核心原则是:不确定性越高,验证范围越大;副作用越严重,越不能自动合并。

3. 测试缺失或不稳定时,不能假装安全

如果没有相关测试,Agent 不能直接说“验证通过”,而应该明确标记:

  • 当前缺少自动化测试覆盖;
  • 本次只完成了静态检查、构建或手动验证说明;
  • 建议或自动补充最小 regression test;
  • 如果无法补测试,需要人工确认。

如果测试 flaky,Agent 应该:

  • 重跑有限次数;
  • 区分是稳定失败还是偶发失败;
  • 查看历史 flaky 记录;
  • 不把 flaky pass 当作强信号;
  • 必要时把 PR 标记为“验证不稳定”。

也就是说,Agent 的输出应该区分:
verified、partially verified、not verified、verification unstable,而不是简单地说 pass / fail。

4. 防止过度测试,需要设置成本和分层策略

为了避免每次都跑全量测试,可以做分层验证:

  1. 快速层:lint、type check、相关单元测试。
  2. 中等层:受影响模块测试、关键集成测试。
  3. 重型层:端到端测试、全量回归测试、性能测试。

Agent 默认从快速层开始。只有当风险信号触发时,才升级到更重的测试层。

同时可以设置:

  • 最大测试耗时预算;
  • CI 分阶段执行;
  • 高风险路径白名单;
  • 改动类型到测试集合的规则;
  • 历史缺陷数据驱动的测试推荐。

这样可以避免“为了安全永远全量测试”,也避免“为了快只跑一个单测”。

5. 评估机制是否有效,要看缺陷拦截和成本平衡

我会用几个指标评估:

  • 漏检率:Agent 标记通过但后续出问题的比例;
  • 测试命中率:选中的测试是否真的覆盖相关改动;
  • 平均验证耗时:是否比全量测试更快;
  • 升级准确率:高风险改动是否被正确扩大测试范围;
  • 人工 review 反馈:reviewer 是否经常认为验证不足;
  • 回归缺陷数量:上线后是否减少相同类型问题。

最终,这套机制不是追求每次最少测试,而是追求:
低风险改动快速反馈,高风险改动充分验证,不确定时显式升级,而不是让 Agent 自信地假装安全。