跳转至

06 · 测试:防止 AI 骗你

dsh 的测试策略文档只有 49 行(09-04 为 54 行,新增了"spec 是并发执行的"这一事实和一个 expected-output 层级),但几乎每条规则都在针对 AI 写代码和写测试的具体作弊模式。写测试的也是 agent——让 agent 给自己的产出写验收,它天然倾向写最省事、恰好对自己失败模式免疫的断言。规则就是冲这个来的。

1. 验证世界,不验证自述(Verify the world, not the self-report)

他们仓库里一个真实 e2e 测试:启动真实 agent 进程,发 prompt"用 bash 工具把 ACP_OK 写进当前目录的 proof.txt"。验收有两种写法:

// 作弊者能通过的写法(被禁止):在 agent 的回复文本里搜关键词
expect(agentReply).toContain('已成功写入')

// 他们的写法:测试代码亲自去磁盘读那个文件
const proof = await readFile(join(workdir, 'proof.txt'), 'utf8')
expect(proof).toContain('ACP_OK')

前者验证的是 agent 说了什么——模型完全可能嘴上说成功,实际工具调用失败了。后者验证的是世界的状态——agent 想通过测试只有一条路:真的把活干了。

配套规则:断言不该动的文件字节级一致——防"活干了,但顺手碰坏了别的东西"。8 月下旬这条原则被推进到快照层:会话回放场景如果会改工作区,必须把完整的最终工作区提交为独立 oracle,录制和刷新快照都不会改写它。规则文件里的原话:"Model prose and tool-result text do not prove the external effect."(模型的文字和工具结果文本都不能证明外部效果。)

日常协作同理:让 AI 干完活,验收时让它重新 cat 文件、重新跑命令给你看输出,而不是问"你做好了吗"。

2. 守卫只有在回归真的能弄红它时才算守卫

写完防御性测试,要求亲手引入那个回归、看测试变红、再撤销——证明测试真的会抓到它声称防的东西。原文的表述(转述):introduce the regression, watch red, revert。

这针对的是 AI 写测试的另一大毛病:断言复述实现、覆盖率漂亮但什么都防不住。他们的 postmortem 里就有实锤:某次事故的第一版回归测试是假阳性——超时杀进程恰好满足了非零退出断言,真跑一遍才暴露。

3. 覆盖率是死代码探测器,不是正确性证明

他们有全仓库最狠的 100% 每文件覆盖率门禁,但对它的定位极其清醒:

  • 未覆盖的行往往是门禁正确标记出来的死代码,该删,而不是该补一个测试
  • 行覆盖是必要的,永远不是充分的——它证明代码跑过,不证明功能正确

4. "我们是 DeepSeek——别省真实 API 测试"

原文就这么写的(We are DeepSeek — do not ration real-API tests)。无 key 测试只证明管道通;只有带 key 打真模型才证明 agent 真能干活。最高价值的是 smoke test:启动真实示例(08-24 顶层 examples 目录退役时改为"启动一个发布出去的 dsh profile")、发一条 prompt、检查世界状态——专抓"单测全绿、产品是坏的"这类问题(postmortem 0001:插件导出方式错了,所有单测通过,真实加载路径直接废掉)。

这条对成本敏感的团队要打折执行,但它点出的原则普遍成立:mock 省下的钱,是用"测不到真问题"付的。mock 的范围要收窄到昂贵或不确定的边界(LLM、网络、时钟),下游一律用真实现。

5. 模型可见的文本 = 行为,用快照钉死

任何改到模型能看见的东西(system prompt、工具 schema、工具结果文案)或用户能看见的输出,必须在同一个 PR 里更新快照——录一份真实会话回放,diff 完整协议流和会话日志。措辞变化被当作行为变化 review,不是格式噪音。

这个意识对所有做 agent 产品的人都适用:prompt 文案就是 API,改一个词等于改一个接口,要有回归手段。

6. 测真实入口路径

手工挂载组件的测试不算数——必须通过真实的配置加载器、真实启动流程、甚至构建产物用裸 node 跑,因为开发工具链(tsx 之类)会掩盖模块解析、加载失败这些真实故障。"真实入口"指的是发布出去的那个 artifact。

与前两章的关系

门禁(第 3 章)防格式垃圾,review skill(第 4 章)防语义垃圾,测试策略防假绿。三者共同的假设是同一句话:产出者(agent)不可信,但可验证。整个体系没有一处依赖"AI 会诚实汇报"。


← 上一章 · 返回目录 · 下一章:可借鉴清单 →