Skip to content

Agent 把 CI 打爆了:测试影响分析怎么扛

Agent 写得越快,PR 越密,测试套件越肥,CI 队列就越容易先崩。Anthropic 工程侧公开过一组量级:相对 2021–2025 的习惯,工程师每季度交付代码大约 8 倍,其中 Claude 作者约占 80%;测试量大约 10 倍;半年内 CI job 大约 25 倍。写代码不再是瓶颈——评审提速之后,下一堵墙往往是流水线。

对 Claude Code 用户同样成立:并行会话多了、Agent 顺手补测试,队列会跟着炸。下面用 deterministic 测试影响分析讲清他们怎么扛,以及小团队能抄哪几条,不照搬整套架构。

写代码快了,CI 成下一瓶颈

以前「人写得慢」天然限流。现在模型把实现压短,人更多时间在审 diff、合并、盯红灯。若每个 PR 仍全量跑测,排队时长会按 PR 频率线性(甚至超线性)涨。

合理目标不是「永不失败」,而是:每个 PR 只跑与这次改动相关的子集,全量留在主干或夜间。这就是测试影响分析要解决的事。

确定性测试影响分析在干什么

他们用的是确定性方案,而不是「让模型猜该跑哪些用例」:

  1. Listener(监听):持续记录 CI 里各测试的结果与归属(包、历史命中等)。
  2. Selector(选择器):开 PR 时,根据历史命中 + 包相关性,选出本 PR 该跑的子集。

原则很直白:不是每个测试都在每个 PR 上跑。相关度靠可复现规则,方便排查「为什么没跑到这条」。

监听滞后:选错用例比少跑更烦

监听若落后(例如约 20 分钟),选择器看到的是旧世界:

  • 刚修绿的用例仍被当成红灯相关,多出来一堆无效排查
  • 偶发 flaky 红灯被放大
  • 新建或刚修好的测试,可能根本没进本 PR 的集合

影响分析的价值取决于「历史有多新」。机器再大,数据陈旧,选择器也会带偏。

v0 单例怎么扛不住,又怎么改

第一版 listener 是 singleton(单写者)。负载涨上来之后,补丁依次失效:

  • 先换更大机器——顶一阵
  • 再按 package 级分片——大约撑了 29 天
  • 再靠 每日重启——撑不住一天;重启本身又让监听掉队更远

根因不是「机器不够大」,而是状态塞在进程里,扩写者、重启、追历史都会互相踩。

重做方向(约 1 名工程师、3 周量级):

  • 进程内改为内存 store / journal,listener 无状态,只负责追加
  • 单独的 consumer 把 journal 滚成可查询历史
  • selector 只做查找,不背写入压力

经验收成三条:按两个季度规划约 25 倍 CI 负载;状态别留在进程里;把「进队列 / 出队列」的 job 数做成可观测指标,确保 in ≈ out,别静默积压。

Claude Code 用户:你的队列也会一起涨

本地用 Claude Code 时,常见叠加是:

  • 多开并行会话,一天产生更多小 PR
  • Agent 主动补单测 / 集成测,suite 变厚
  • 人还没改完合并习惯,CI 仍是「每 PR 全量」

结果是:写代码爽了,等绿灯更烦。CI 里用 Claude 本身(例如非交互打印)和「Agent 制造更多要测的代码」是两件事;脚本侧用 -p / --bare 时别误加载本机配置,见 脚本和 CI 里跑 Claude

小团队可落地的几条

不必一上来自研整套 listener / consumer:

  1. 别让每个 Agent PR 全量跑测——按目录、包名或变更文件做粗粒度选择,也比全绿全红强。
  2. PR 尽量小——影响面小,选择器(哪怕是脚本规则)更准,回滚也便宜。
  3. 盯队列滞后——平均等待、积压 job 数、flaky 占比,比「机器是不是最新」更早报警。
  4. 全量测放到主干或定时——PR 上求相关子集,主干求信心。
  5. Agent 写测试时约定范围——要求「只覆盖本次 diff」,避免一次会话灌进无关大文件测试。

并行用法与额度节奏,可对照 使用模式;权限与沙箱仍建议收紧,见 权限与沙箱

小结

Agent 把交付速度乘上去之后,CI 会先以「队列」而不是「编译器」的形式喊疼。确定性测试影响分析用监听 + 选择器减负,但监听滞后会选错用例;单例写者扛不住 25 倍级增长,要把状态挪出进程并观测进出流量。小团队先做「非整仓每 PR」、小 PR、盯滞后,再谈更细的影响图。

Claude-cn.org,专注于 Claude Code 中文教程