Christof Jori

8 分钟 阅读 · 08 Jun 2026

AI 生成代码的 QA:上线前会出什么问题,以及如何排查

用 Lovable、Cursor、Claude Code 或 Replit 做出的 AI 原型,能在一个周末把你带到一个能跑的 demo。它带不了你到生产环境。"在我屏幕上能跑""扛得住真实用户、真实负载和一次安全审查" 之间的那道缝,正是 AI 生成代码悄悄失效的地方。这是我们对 AI 辅助构建在上线前所跑的 QA 流程,以及我们最常见到的失效模式。

这些都不是反对用 AI 来构建。我们自己也用 AI 构建。这是在说:要像测试任何即将触碰真实金钱、真实数据和真实用户的代码那样,去测试它的产出。

上线了一个 AI 原型?

 预约一次生产就绪评审

为什么 AI 生成的代码在生产环境会出问题?

AI 编码工具只优化一件事:产出一个能跑、且符合 prompt 的东西。它们不优化那些决定软件能否在用户接触下存活的东西。模型看不到你的威胁模型、你的数据量、你的边界情况,也看不到你的合规义务。它把 happy path 写得不错,几乎跳过其余一切,因为没人去问。

结果就是:demo 干净、出错可预测的代码。这些故障不是随机的。它们每次都聚在同样的地方,而这正是它们可被测试的原因。

AI 生成的代码实际会在哪里出问题?

这是我们在每个 AI 辅助构建上逐项过的清单,按出问题的频率排序。

  • 认证与授权的漏洞。登录页能用。那个阻止用户 A 读取用户 B 数据的检查缺失,或只在前端做。这是我们发现的最常见的严重缺陷,遥遥领先。
  • 从不校验的输入。表单什么都收。没有长度限制,没有类型检查,没有清洗。demo 数据是干净的,所以这个漏洞从没暴露。
  • 放错位置的密钥。API key、数据库 URL 和 token 被硬编码进客户端代码,或被提交进仓库。AI 工具把它们内联进去,因为这样示例才能跑起来。
  • 没有错误处理。happy path 覆盖了。一次失败的网络调用、一次超时或一个空结果,就抛出未处理的异常,屏幕一片空白。
  • 无法扩展的查询。把数据库调用塞进渲染里循环的代码,或为了数行数而拉整张表。10 条记录没事,10 万条就致命。
  • 竞态条件与重复提交。点两下生成两个订单。两个并行请求都通过余额检查,都扣了款。
  • 没人审过的依赖。模型引入了过时、被弃用或带有已知漏洞的包。
  • 会说谎的状态。UI 说支付成功了;后端从没记录过。乐观更新,却没有对账。
Christof Jori

"AI 不是故意写出不安全的代码。它写的是你要求的代码,以及你忘了要求的那些都没写。生产环境,就是你忘了要求的一切之和。"

AI 辅助构建的生产就绪清单

这是一次 Wavect 评审的结构。在你打电话给任何人之前,可以自己先跑一遍。

  1. 授权审计。对每个端点、每次数据读取,确认服务端会检查谁在请求、是否被允许。前端检查不算数。
  2. 输入边界测试。对每个入口点抛入畸形、超大和恶意的输入。确认它们被干净地拒绝,而不是被吞下。
  3. 密钥清扫。扫描仓库和客户端打包产物,找 key、token 和凭证。把泄露的全部轮换,并挪到服务端。
  4. 失败路径覆盖。强制每个外部调用失败,确认应用优雅降级而不是崩溃。
  5. 负载与查询评审。在真实数据量下对数据库做性能剖析。在 N+1 查询和无界读取干掉你之前,先干掉它们。
  6. 并发测试。对一切写入金钱或状态的地方,发起并行和重复请求。在缺失的地方补上幂等性。
  7. 依赖与许可扫描。检查每个包是否有已知漏洞和不兼容的许可。
  8. 回归套件。把原型从没有过的测试补上,这样下一次 AI 辅助的改动就不会悄悄弄坏已经能用的东西。关于为什么在 AI 写代码时这一点更重要、而非更不重要,参见测试驱动开发

这是我们软件 QA 服务的核心。交付的不是一份满是抱怨的 PDF,而是一个修好、测过的代码库,以及让它一直保持修好的测试套件。

我能不能直接让 AI 修它自己的代码?

部分可以。你一指到位置,AI 工具就会乐意加上一个校验检查,或把一个调用包进错误处理。它做不到的,是决定该去哪里看。它没有你的技术债模型,不记得各部分是按什么顺序搭起来的,也没有那种直觉去预判真实用户第二天会撞上的边界情况。找出这些漏洞是人的活。补上它们,越来越是人机共担的活。我们正是这样推进这类合作的。

让 AI 生成的代码达到生产就绪,需要多久?

对一个典型的 vibe-coded MVP,一轮聚焦的评审加加固跑下来是一到三周。波动由两件事决定:产品触碰多少真实金钱或敏感数据,以及 AI 在无人监督下跑了多远。一个处理支付和个人数据的周末原型,需要的 QA 不止一个周末。一个只读的内部工具则少得多。我们在先看一眼之后再定范围,而不是在那之前。

代码什么时候已经救不回来了?

少见,但确实会发生。如果数据模型从根上就错了,或同一个坏模式被复制到了上百个文件里,那重建核心比打补丁更便宜。我们会在第一通电话里就告诉你这一点,而不是收你一个月的钱去修一个本该重新浇筑的地基。在这件事上诚实,对所有人都更便宜。

最终思考

AI 生成的代码不是更差的代码。它是没被审过的代码。那个花了一个周末的原型,跳过了每个生产系统都需要的那几周加固,而这几周的账单不会因为第一稿是模型写的就消失。它只是挪到了上线那天,在那时它最贵。

在你把真实用户放到一个 AI 辅助构建面前之前,先把清单过一遍。如果授权、输入和失败路径那几节让你心里发慌,那就是信号:在上线前、而不是事故后,找第二双眼睛来看一看。

上线了一个 AI 原型?

 预约一次生产就绪评审
Christof Jori

8 分钟 阅读 · 08 Jun 2026