跳转到主要内容

覆盖率幻觉:为什么 AI 生成的测试会继承代码的盲点

阅读需 1 分钟Tian PanTian Pan

一位小团队工程师花了三个月将测试生成委托给 AI。代码覆盖率从 47% 跃升至 72%,再到 98%。每次 PR 都返回绿色。然后生产环境崩了。用户注册中的竞态条件因数据库复制延迟导致重复邮箱。优惠码接口在代码无效时返回 null 而非零,导致支付计算对 4700 名客户静默出错。最终损失:4.7 万美元退款和 66 小时工程时间。测试并没有遗漏几个边界情况——它们覆盖了所写的代码,而非所部署的系统。

这就是覆盖率幻觉。随着 AI 辅助开发成为默认选项,落入这个陷阱正变得越来越容易。

行覆盖率真正衡量的是什么

行覆盖率是一个代理指标。它告诉你在测试运行期间哪些行被执行了,而不是这些执行是否验证了任何有意义的内容。一个测试可以触及函数的每一行,同时对函数输出是否正确毫无断言。

当你应用变异测试时,覆盖率与质量之间的差距就会显现。变异测试向代码引入小的刻意修改——将 > 翻转为 >=,将 + 换为 -——然后针对每个变异体运行测试套件。具有真正缺陷检测能力的测试套件会杀死大多数变异体;当行为改变时,测试失败。而覆盖率表演式的测试套件则让变异体存活。

一个有据可查的案例:一个测试套件实现了 100% 行覆盖率,变异得分为 4%。它执行了代码库中的每一行,却只捕获了 4% 的变异测试引入的缺陷。其余 96% 的变异——真实的行为变化——未被检测到,因为测试在检查代码是否运行,而非代码是否正确

这种差距并不是新问题。但 AI 生成的测试以一种特定方式使其在结构上更加严重。

封闭循环问题

当同一个模型同时生成你的实现和测试时,两个产物共享同一个关于代码应该做什么的心理模型。实现编码了假设,测试验证了相同的假设。如果假设是错误的,两者会以相同的方向出错。

考虑一个具体例子。一个实现在每次处理请求时递增计数器。一个测试验证计数器达到了预期数量。实现和测试都没有质疑的是:请求是否真正成功了。无论如何,计数器都会递增。代码和测试都基于"计数器递增等于成功"这一前提运作。这个前提从未从封闭循环内部受到质疑。

这不是语法或代码质量的失败。实现看起来是正确的,测试看起来是正确的,两者都能干净地编译和运行。失败发生在共享模型的层面:AI 从来没有理由质疑自己的假设是否有效,实现和测试都没有促使它这样做。

学术研究将此形式化为测试预言问题。LLM 生成的测试预言——测试断言的预期输出——捕获了代码所做的而非应该做的。当代码错误时,预言继承了错误。一项针对 Defects4J 基准中 17 个 Java 项目的 2024 年实证研究发现,GPT-4 的测试编译成功率为 52.96%,远低于 Evosuite 的 85.71%。在失败中,30.68% 是未解析的符号,17.25% 是参数不匹配——幻觉直接烘焙进了测试产物。

生产中的三种失败模式

覆盖率幻觉以三种不同模式显现,每种都比上一种更难捕获。

断言实现而非行为的测试。 AI 生成的测试默认断言特定函数以特定参数被调用——模拟被调用、返回值匹配记录的输出、计数器改变。这验证了实现按原样运行,而非行为是否正确。这是测试版本的校对自己的写作:你读的是你打算写的,而非页面上实际有的内容。测试和代码共享作者的盲点。

会员专享

余下内容仅对会员开放。

会员可读完整内容 —— 每一个公开发布的观点背后,那些框架、决策与推理的全貌。

  • 完整文章,包含未公开存档的部分
  • 可落地的工作框架,附带权衡与决策依据
  • 新文章抢先看,先于公开发布

随时取消 · 一次订阅,畅读全部

参考资料

保持联系,关注我获取更多内容

阅读需 11 分钟

为什么 AI 生成的注释腐烂得比代码还快

AI 智能体为每个函数生成流利的文档字符串,它们往往只是在转述代码逻辑,而非编码意图。一旦代码发生变动,注释就会说谎——而下一位读者往往会相信谎言而非代码。这是一套面向 AI 辅助时代的代码审查规范。

insider
ai-engineering
阅读需 10 分钟

那个由智能体编写的、实际上什么也没测的测试

编程智能体生成的测试套件能够通过测试、提高覆盖率,却抓不住任何 Bug。本文探讨了为什么智能体编写的测试会演变为同义反复,以及变异测试和红绿 TDD 准则如何让它们重新起到约束行为的作用。

ai-engineering
testing
阅读需 9 分钟

你的评测套件是一座博物馆:生产故障应当成为明天的测试用例

静态评测框架会随着产品的增长而过时——它们只能测试作者预设的场景。以生产为驱动的反馈闭环能够自动将真实故障转化为永久性回归测试,使评测套件始终与实际用户行为保持一致。

insider
llm
阅读需 9 分钟

AI 代码审查实践:自动化 PR 分析真正能发现什么,又持续遗漏什么

AI代码审查工具在拼写错误和空指针检查方面的准确率为70-85%,但遗漏语义错误的概率高达85-90%。本文提供实证数据分析,并介绍避免自动审批沦为橡皮图章的工作流设计。

insider
code-review
阅读需 10 分钟

真正能阻断 PR 合并的提示词回归测试

大多数团队声称在测试他们的提示词。但几乎没有团队建立了能让构建失败的 CI 门控。这里有一个轻量级框架,可以在不烧掉 API 预算的情况下改变这一局面。

insider
ai-engineering