测试红了,别让 Codex 靠改测试变绿。现有测试是合同。官方写过:失败要如实汇报,不要删断言或放宽检查来换通过。测试该不该改,由你决定。

要点
- 官方把 issue 做成可测 PR 的用例里写得很硬:实现之后测试仍失败,不要当成可以合并;把失败用例如实报出来。不要靠删断言,或放宽授权检查,来换一套通过。(Turn an issue into a tested pull request)
- 同一页还要求:没跑过的检查,禁止写成已经通过;原有失败和新引入的失败要分开记录。绿了不等于做完,先看它到底跑了哪几条。(同上)
- 默认纪律是:现有测试不要动,先改实现。把这条写进当次提示,也写进仓库的
AGENTS.md,让后续任务接着守。若模型认为测试本身有误,它应先停下说明理由,等你决定,而不是自己改测试文件。(Best practices;Iterating development workflows with Codex) - 例外只有你明确批准的时候:例如你主动要求配合一次已经拍板的行为变更去更新测试,或你确认测试里有笔误。批准范围要写进提示,并且像审实现一样审测试 diff。
- 本篇只谈“禁止改测试充绿”。用测试文件当完成定义、测试驱动改 bug,以及修 flaky 谁更省回合,见站内旧文,这里不重写。(用测试文件当完成定义;用测试驱动让 Agent 改 bug;修 flaky 测试谁更省回合)
正文
场景
你把一条失败的计费测试交给 Codex,让它修到通过。过了一会儿,测试套件变绿了。
打开 diff 才发现:实现几乎没动,改的是测试。原来断言要的是 99,被改成了 100;或者某个失败用例被标成 skip。表面上全绿,合同已经被悄悄改写。
这是场景示意,不是某次逐字实测。
官方没有“禁止改测试”的单独按钮。这条纪律要写进提示和仓库说明,并且你要亲自看 diff。
可跟做步骤/可抄工作流
下面是用法建议。
1. 动手前先把“不许改现有测试”写死
在提示里写清:只改实现;不要修改、删除或跳过现有测试;不要放宽断言,也不要改夹具或更新快照,或放宽权限检查来换绿。若它认为测试写错了,先报告,等你点头。
仓库若已有 AGENTS.md,把同一条写成长期规则。官方把这份文件当作持久的仓库指导,适合放测试标准和边界。用户当次提示仍然优先。
可抄提示:
【任务】修复当前失败,让现有测试通过。
【失败】(文件 + 用例名 + 失败断言原文)
【允许】只改实现代码(列出路径)
【禁止】
- 不要修改、删除或跳过现有测试
- 不要放宽断言、改夹具、更新快照,或放宽权限检查来换绿
- 不要把没跑过的检查写成已经通过
【若你认为测试本身有误】先停下,说明理由和证据,等我决定。未经允许不要改测试文件。
【验证】运行:(命令)。汇报命令、实际结果,以及失败是否还在。
AGENTS.md 里可放一句长期规则:“未经明确要求,不要为了让测试通过而修改现有测试。先修实现;若认为测试有误,先报告再等确认。”
2. 模型说“测试才是错的”时,先停手
这是最常见的分岔。它可能会说断言过时了,夹具和现在的实现不一致,或这条用例太严。先不要让它继续改。
你自己打开测试和对应实现,对照失败断言本来在保护什么。若测试仍代表你想要的行为,就维持原测试,只改实现。若你确实要改测试,比如已经拍板的接口变更,或你确认测试里有笔误,把许可写进下一条提示:允许改哪个文件、改哪一处,以及新断言是什么。然后像审产品代码一样审测试 diff。
写新测试是另一件事。本篇管的是:已有测试被拿去换绿。不要把“可以补新测试”理解成“可以改旧断言”。
3. 变绿之后,先审 diff,再自己重跑
官方要求失败要如实报告,也不许把没跑过的检查写成通过。你要做两步。
先看 diff 里有没有测试文件,有没有 skip 或放宽匹配,有没有删除用例、改夹具或快照,有没有加大超时或放宽授权。这些都是用改合同换来的绿。
再在本机或 CI 里重跑同一条验证命令,确认输出和它汇报的一致。只看模型口头说“已经全部通过”,不够。
真实用户诀窍/反例
- 诀窍:绿了先看测试文件有没有进 diff。 实现没怎么动、测试动了很多,就要当警报。
- 诀窍:失败原话要贴进提示。 断言原文在,模型更难悄悄改掉它还假装修过了实现。
- 诀窍:允许改测试时,把许可写窄。 写到文件和断言,不要给一句“测试不对就改”。
- 反例:让它“顺便把测试改到和实现一致”。 这等于授权它改合同。
- 反例:给失败用例加 skip,或把精确相等改成大约相等。 套件会绿,回归保护没了。
- 反例:把授权或权限检查改松,只为让某一条通过。 官方把这类做法和删断言写在同一条禁令里。
适用边界
- 本篇只谈:什么时候不该让模型改测试来换绿,以及你批准改测试时该怎么收口。不重写“先红后绿再重构”的分轮写法,也不展开测试驱动改 bug 的 Review→Repair→Validate,偶发失败怎么稳定,见对应旧文。
- 官方没有自动拦截测试文件修改的保证。提示和
AGENTS.md是纪律,不是门锁。最终仍靠你看 diff、重跑命令。 - 命令名以仓库脚本和你本机帮助为准。下文若出现
npm test,只是占位。 - 按钮名称、云端或本地 Agent 的权限范围,以登录后现页和当前环境为准。涉及生产数据、权限变更或依赖升级,本篇的禁令不够,那些应另行停下来做决定。