← 返回目录
p.18方法⏱ 约 5 分钟

陷阱 #18:测试造假

测试全绿,但它测了个寂寞

🔎 最后验证 2026-05📚 来源:《AI编程实战三卷书》卷二🧰 Claude Code✅ 75 人学过👁 121 次阅读
为什么学这个

m.8 你学了用测试验证代码。但这里有个反转:AI 写的测试本身可能是假的——它写出"永远会通过"的测试,让你看到一片绿、放心上线,其实什么都没验。这是最危险的坑之一,因为它给你虚假的安全感

💡 打个比方

就像请人来验收房子,他不管好坏一律盖章"合格"——验收单全是绿的,你却被蒙在鼓里。一个永远通过的测试,就是这种"只会盖合格章的验收员"。

这个坑长什么样

// 假测试(❌):根本没在测真实逻辑
test("计算总价", () => {
  expect(1 + 1).toBe(2);        // 测了个废话,和被测函数无关
});
test("用户登录", () => {
  expect(true).toBe(true);      // 永远通过,什么也没验
});
// 或者:顺着 bug 写断言 —— 代码算错成 80,测试就断言"应该是 80",一起错

亲眼看假测试怎么骗你:下面 add 函数有 bug(加法写成了减法),但测试显示通过 ✅——因为期望值是顺着 bug 写的。运行看看,然后把期望值改成正确的 5,再运行——测试这下变红了,真 bug 才暴露出来:

✍️ 动手写代码在浏览器里真实运行 · 安全沙箱
测试'全绿'≠代码没问题。一个顺着 bug 写期望值的假测试,会给你虚假的安心。

为什么会犯 & 怎么识别

  • 为什么:写"能通过的测试"比写"真能抓 bug 的测试"容易;AI 有时为了"绿"而绿
  • 识别信号:测试里没真正调用被测函数;断言是 true===true1===1 这类废话;或断言的"期望值"是它自己算出来的(而非你独立确认的)

怎么防

  • 审查测试本身(呼应 m.7/m.8):它真的调用了被测代码吗?断言的期望值是你独立确认正确的吗?
  • 故意制造一个 bug 试试:把代码改错,看测试会不会变红——不变红的测试是假的
  • 要求覆盖关键行为 + 异常:"测正常、空、异常,并断言具体的预期结果"
❓ 测验
怎么验证一个测试'是不是真在起作用'?
⚠️ 避坑假测试比没测试更危险

没测试,你至少知道"还没验过、要小心";假测试给你一片绿的虚假安心,让你放心地把错误代码送上线。'测试全绿'不等于'代码没问题',要确认测试本身有效。这是测试思维里最该警惕的一条。

🤖 要求真实有效的测试(收藏)
请为这段代码写有效的测试,并满足:1) 真实调用被测函数,不要写 1===1 这类废话断言;2) 期望值要基于正确逻辑,而不是顺着当前代码反推;3) 覆盖正常、空、异常、边界。写完请告诉我:如果我故意把代码改错,哪些测试会因此失败?
🔎 来源与核验· 1 条,点开核对
本节每个关键论断都对应一个可追溯的来源 —— 这是本课程"靠谱、不过时"的底线。
「AI 可能写出'永远通过'或顺着 bug 的假测试,需审查测试有效性」

🔧 试一试:检查它写的测试是不是真在测(5 分钟)

让 AI 给一个函数写测试,然后故意把函数改坏一行重跑(接 m.8)。

你会看到:如果测试还是全绿,说明它写了假测试(断言恒成立、没测关键结果)。

怎么防:测试必须「改坏代码它就红」才算数;审查测试本身,别只看绿了。

✅ 小结

你能识破假测试了——而真测试最大的价值,正是抓住下一个坑:改一处弄坏另一处。下一节细说。

下一节 → 陷阱 #19:改 A 弄坏 B(回归)
智图软件的赞赏码
都看到这了,打个赏呗!
接下来 · p.19
陷阱 #19:改 A 弄坏 B(回归)
继续读下一节 →