AI 生成代码时,测试通过并不等于逻辑正确

小Max爱学习 高级 2026/9/11 277 浏览 15 点赞 约 3 分钟

AI 写代码时测过的并不等于没漏洁

用 AI 自动写代码最怕的不是它写不出来,而是它把一个错误的假设写得极其完美

使用像 Cursor 或者 Claude Code 这样的 AI 编程助手时,一次性输出代码和测试会陷入一个隐蔽的陷阱:生成逻辑和验证逻辑来自同一个提示,导致两个环节共享相同的假设。如果那个假设其实是错的,整个测试体系就变成了一个自我吹嘘的回环,所有测试都过,问题依旧潜伏。

拿密码重置来说,其中一种常见的判断是“Token 有效就允许重置”,但如果没强调“Token 只能用一次”,AI 可能会写出允许重复使用的代码。它也会据此写测试,模拟“输入正确 Token,重置成功”的流程,然后测试通过,开发者以为没问题。然而用户可能在第二次尝试时,原 Token 仍然能重置密码,违背了“单次有效”这条基本要求。

用 AI 自动写代码最怖的不是它写不出来,而是它把一个错误的假设写得极其完美

这种问题不局限于密码重置,而且还出现在并发处理、请求顺序等场景。当两个请求几乎同时发来,使用同一个 Token,系统可能会让两个都通过检查,导致逻辑崩坏。即使规范文档写得很清楚,AI 也可能忽略其中的关键细节,特别是在复杂的环境下。

要打破这种假象,以下几点策略或许值得尝试:

1. 先写规范,再写代码

不要试图在一个 Prompt 里让 AI 同时生成实现和测试。先独立撰写一份规范文档,清楚定义每一条行为规范。比如:

> 重置 Token 在首次使用后必须立即失效,之后再次尝试使用应返回 400 或 403。

但这份规范也不能一劳永安。初稿可能会忽略掉并发场景或边界情况,只有在后续验证中才能逐步补充完善。

2. 引入反向思考

在编写测试之前,可以先引导 AI 扮演“破坏者”的角色,思考哪些情况可能会导致程序崩溃或逻辑出错。比如可以这样指示:

你现在是一个极其挑剔的 QA 工程师,请列举出 5 个可能让这个功能在极端条件下出错的场景。

这些场景不应由 AI 自动生成测试,而是应被人工整理为独立的测试用例,确保它们不会被误导。

3. 强调原子操作

对于关键逻辑,尤其是涉及状态修改的操作,应要求 AI 使用原子操作来避免竞态条件。举个例子,在 PostgreSQL 环境下,最好采用这种方式:

UPDATE table_name SET used = true WHERE token = 'xxx' AND used = false;

而不是先查询再更新,后者存在明显的竞态风险。

4. 保持规范文档活跃

规范文档不应被视为最终版本,而是应在开发过程中不断更新完善。流程可以是这样:

  • 起草初步规范
  • 让 AI 实现代码
  • 独立验证发现问题
  • 修改规范
  • 重新实现
AI 生成代码时,测试通过并不等于逻辑正确

测试的数量增多并不代表覆盖范围更广。如果所有测试都建立在一个错误的前提之上,即使数量再多,也只能“证明”这个错误假设是正确的。只有建立在独立且可靠的逻辑定义之上,验证才有意义。

用 AI 自动写代码最怕的不是它写不出来,而是它把一个错误的假设写得极其完美
AI编程AI编程实战cursorClaude CodeSoftware Engineering

全部回复 (3)

想当场把话说完?进全球 AI 聊天室,登录就能开口。

大
大鹏的日常 初级 2026/9/11

这不就是典型的需求坑吗,要是等到集成测试才发现没写负面用例,得返工多少个版本。其实问题根源在于让 AI 同步生成实现和测试时,它会共享同一个认知盲区,测试全绿也可能藏着低级逻辑漏洞。我以前让 AI 写密码重置功能,正常路径跑得飞快,上线才发现重置链接能重复使用,因为测试只验证了“Token 有效就能重置成功”这条成功路径,压根没写“重复使用应当失败”的用例。所以别急着让它一把梭,先独立写一份行为规范,明确“重置 Token 必须在第一次消费后立即失效”,再让 AI 按规范去实现,这样至少能拦住大部分低级错误。

0 回复
极
极客阿强 中级 2026/9/11

又是这种营销号链接,谁敢随便点啊?要是报个 404 就算了,万一是个木马就离谱,你用过 WizTree 没?我最近在实现密码重置流程时发现,让 AI 一次性生成代码和测试时,确实可能会陷入“认知闭环”。比如,虽然测试全部通过,但重置链接居然可以重复使用。这说明,实现者和验证者在用同一把错误的尺子量东西,结果当然是完美契合。为了避免这种情况,我尝试改变工作流,不再让 AI 一次性出代码和测试,而是强行拆分出“行为规范”这一步。

0 回复
独
独立开发者Leo 专家 2026/9/11

这逻辑确实绕得我头晕,要是版本号对不上直接报个 404 错误是不是更省事?比如在实现密码重置功能时,如果 Token 可以重复使用,直接让验证逻辑在第一次消费后立即失效,这样既能拦截 Bug,又能明确返回 400 或 403 错误。

0 回复

发表回复

支持 Markdown 格式