测试覆盖性分析报告
昨天下午三点十七分,测试我们那个跑了四个月的覆盖支付模块终于崩了。崩得毫无预兆,性分析报像一记闷棍——用户点击“确认支付”后,测试页面直接白屏,覆盖日志里连个异常都没留下。性分析报事后查了半天,测试原因简单到让人想抽自己:一个只在“余额不足”分支里才会触发的覆盖回调函数,没被任何测试用例覆盖到。性分析报那个分支,测试写了三个月,覆盖从没被执行过。性分析报 这让我重新翻开了那份覆盖性报告。测试老实说,覆盖覆盖率数字挺好看——行覆盖92%,性分析报分支覆盖87%。可数字好看有什么用?崩的那个点恰好落在剩余8%的行和13%的分支里。覆盖率是统计学的安慰剂,它告诉你“大部分代码跑过了”,却从不告诉你“哪块代码没跑过”。而真正咬人的,永远是那些没跑过的角落。 我见过最典型的覆盖性陷阱,是“假覆盖”。测试用例确实执行了某一行,但执行时传入的全是正常值、预设值、理想值。比如一个处理用户年龄的函数,测试里传了18、25、60,全通过。但没人传-1,没人传0,没人传200。那行代码里有个 做覆盖性分析,真正该盯的不是百分比,而是风险地图。我习惯把代码分成三类:核心交易链路、异常处理分支、配置/兼容性代码。第一类必须100%覆盖,哪怕多写十个用例也值;第二类至少覆盖所有能想到的异常输入,包括边界值、空值、超长字符串;第三类——说实话,很多项目里这类代码根本没测试,但恰恰是它们最容易在线上出幺蛾子。举个例子,我们那个支付模块的崩溃,就属于第二类:余额不足的分支,测试时总用“余额充足”的账号跑,那个分支自然永远执行不到。 另一个容易忽略的点是数据状态组合。单个分支测了,但两个分支叠加的状态没测。比如“用户已登录 + 订单已取消 + 支付渠道异常”这三者同时成立时,代码会走哪条路?很多测试用例是孤立的,每个条件单独测一遍,但条件之间的排列组合才是真正的雷区。我统计过,我们项目里超过60%的线上bug,都发生在两个以上状态变量同时非正常取值时。覆盖性分析如果不做组合覆盖,等于白做。 最后说点实在的。覆盖率报告不是给质检看的,是给下一个改代码的人看的。你写了一段没人测过的逻辑,三个月后另一个同事接手,他改了一行if条件,以为只是小改动,结果把那个从未被执行的分支激活了——然后线上炸了。所以,覆盖性分析的核心产出不是那张饼图,而是一份“未覆盖风险清单”,上面写着:这段代码为什么没测?是条件太苛刻?还是逻辑本身已死?如果是前者,补用例;如果是后者,删代码。别让死代码躺在那里,它迟早会活过来咬你一口。 那个支付模块的修复只花了一个小时,但补那个分支的测试用例,我们写了整整两天。两天里我一直在想:如果三个月前,那份覆盖报告能标注出“此分支未覆盖,且涉及真实资金操作”,谁会允许它上线?没人会。但报告没写,就没人知道。覆盖性分析的意义,从来不是汇报时的那页PPT,而是让每一个未覆盖的角落都暴露在阳光下——哪怕它会让你难看。测试覆盖性分析报告
if (age > 150) throw new Error(),它执行了吗?执行了,但走的是false分支,true分支从未被触碰。这就是行覆盖率的谎言——它只统计“这行代码跑没跑”,不关心“这行代码的所有可能路径跑没跑”。
-
上一篇
-
下一篇