首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >AI 写的单测覆盖率 100%,可我埋的 3 个 bug 一个没抓住

AI 写的单测覆盖率 100%,可我埋的 3 个 bug 一个没抓住

原创
作者头像
GavinGeng
修改于 2026-10-25 13:09:10
修改于 2026-10-25 13:09:10
80
举报

周三晚上我盯着覆盖率报告,那行绿色的 100% 看得我有点慌。

事情是这样:手边有个订单金额的小模块,三四个函数,我故意埋了 3 个缺陷进去——折扣率超过 1 时算成负数、把一笔钱平分成 0 份时直接除零、年龄校验把 0 岁(新生儿)判成不合法。然后我让「AI」按函数签名和 docstring 生成了一套单测,自己又手写了一套基线。我想弄清楚一件事:那些能直接跑出来的覆盖率数字,到底能不能告诉我们测试靠不靠谱。

先上结果,省得你往下翻:

手写基线那套,行覆盖 100%、分支覆盖 100%,11 条用例,我埋的 3 个坑全被拦住(3/3);AI 生成那套,行覆盖同样是 100%、分支 95%,7 条用例跑完全绿,3 个坑一个没拦住(0/3)。

两个数字几乎一样,都是 100% 行覆盖。但手写那套红了 3 条,正好对应我埋的 3 个坑;AI 那套 7 条全绿,3 个 bug 一个没露出来。

我当时脑子里的念头是:这不科学,覆盖率不是越高越稳吗?翻完报告才反应过来——覆盖率只管「这行代码被执行过没有」,它压根不关心「执行完结果对不对」。AI 生成的测试几乎都走 happy path,比如折扣价只测了 200 打 9 折等于 180,断言还是 result is not None 这种,只要函数没崩就过。它把每个函数都摸了一遍,行覆盖自然拉满,可一个边界值都没碰,而 bug 全在边界上。

最让我后怕的,是年龄校验那个坑。年龄校验我写成了 0 < age <= 120,而不是 0 <=,新生儿 0 岁就被误杀。AI 的用例测了 25 岁(通过)、200 岁(正确拒绝),唯独没测 0。手写用例里我专门写了一条 is_valid_age(0) is True,啪一下红了,我才发现这行写错了。要是没有这条,这错就跟着上线了——而且覆盖率报告会干干净净写着 100%,谁都不会多看一眼。

原始报错贴一下,留个底:

  • discounted_price(100, 1.5) 期望抛 ValueError,实际返回 -50.0
  • split_even(100, 0) 直接 ZeroDivisionError
  • is_valid_age(0) 返回 False,应为 True

所以现在我的做法是:覆盖率数字当体检表看,不当合格证看。AI 写单测我认它省体力,骨架、样板、happy path 它一两秒就铺完,但断言和边界 case 一定自己补,尤其是那些「看起来不会出错」的边界。每写完一轮,我会挑一个最不起眼、AI 没测过的边界,手写一条硬怼上去。

你们写的单测,覆盖率过了之后,还会逐条看断言到底拦了什么错吗?我是被这 100% 绿得发慌之后,才开始较真的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档