打开网易新闻 查看精彩图片

2023年,谷歌内部一份被泄露的OKR文档显示:某核心产品线的测试覆盖率目标从85%直接拉满到100%。三个月后,这支团队的工程师在匿名论坛吐槽:「我们花了40%的工时写测试,线上事故只少了3%。」

这不是孤例。100%测试覆盖率正在成为软件行业最昂贵的自我感动。

覆盖率100%≠代码没bug,就像体检项目全做了≠身体没病

覆盖率100%≠代码没bug,就像体检项目全做了≠身体没病

测试覆盖率(Test Coverage)衡量的是代码被测试执行的比例。100%意味着每一行代码都被至少跑过一次。听起来很完美?

谷歌工程师Titus Winters在2019年的技术演讲里打了个比方:「覆盖率告诉你哪块地板没铺地毯,但不告诉你地毯下面有没有老鼠洞。」他的团队曾遇到一个线上崩溃:某段代码100%被覆盖,但测试只验证了「正常输入」,没碰过边界条件。用户一个超长文件名,直接击穿。

更隐蔽的是「断言缺失」。代码跑了,但没检查跑出来的结果对不对。这就像医生给你做了CT,却根本没看片子就写「未见异常」。

2017年,微软Azure的一个团队公开复盘:他们把覆盖率从72%推到98%,缺陷逃逸率(漏到线上的bug)反而上升了12%。原因是工程师为了凑数字,写了大量「快乐路径」测试——只验证一切按预期走的情况,复杂分支和异常处理被选择性忽略。

追求100%的隐性账单:时间、士气与机会成本

追求100%的隐性账单:时间、士气与机会成本

Netflix的混沌工程团队做过测算:把覆盖率从90%拉到100%,边际成本是前90%的3.2倍。最后10%往往涉及异步回调、竞态条件、第三方依赖——写测试的时间可能比写功能本身还长。

Stripe的工程师Will Larson在博客写过一段经历:他的团队曾强制100%覆盖率,结果工程师开始「防御性编程」——把简单逻辑拆成更多函数,让每个片段更容易被覆盖。代码膨胀了23%,可读性断崖下跌。「我们不是在写软件,是在写测试的饲料。」

时间被吞噬的后果更直接。Shopify 2022年的工程调研显示:高覆盖率团队的新功能交付周期平均延长34%,工程师满意度评分低19%。有人自嘲:「我每天的工作是给已经能跑的代码写更多代码,证明它能跑。」

最讽刺的是维护成本。测试代码也是代码,会腐烂、会过时。当业务逻辑调整,工程师要同步改两套代码。Meta(原Facebook)2021年内部报告提到:某产品线的测试债务(Test Debt)积压了1400人日,团队干脆批量删除「低价值测试」,覆盖率从97%砍到81%,线上稳定性反而回升。

那些真正有效的团队,在测什么?

那些真正有效的团队,在测什么?

打开网易新闻 查看精彩图片

放弃100%执念不等于放弃质量。区别在于:测「哪里可能错」而非「哪里没测过」。

亚马逊AWS的S3团队在2018年分享过策略:他们用故障注入(Fault Injection)替代部分单元测试,主动模拟磁盘损坏、网络分区、时钟漂移。覆盖率只有78%,但「可用性测试」覆盖了所有用户付费路径。结果?S3的年度可用性从99.99%提升到99.999999999%(11个9)。

谷歌的Chromium项目(Chrome浏览器内核)采用分层策略:核心渲染引擎要求90%覆盖率,UI层只要求60%,但强制所有「崩溃上报」必须配套回归测试。他们的逻辑很直白:用户遇到的bug才是真的bug,没遇到的代码路径,覆盖它纯属行为艺术。

测试框架JUnit的创建者Kent Beck在2020年的一次访谈中被问到覆盖率目标,他的回答被引用了无数次:「我完全不关心百分比。我关心的是,当我修改代码时,有没有测试会尖叫着告诉我搞砸了。」

这种思路指向另一个指标:变异测试得分(Mutation Score)。不是看代码跑没跑,而是看测试能不能发现人为注入的bug。微软研究院2022年的实验显示:变异得分80%的测试套件,实际缺陷检测能力是覆盖率100%套件的1.7倍。

100%覆盖率真正的受益者,可能不是用户

100%覆盖率真正的受益者,可能不是用户

那为什么这个数字还在被追逐?

一个答案是「可量化的安全感」。CTO向董事会汇报时,「100%」比「我们重点覆盖了高风险模块」更容易被记住。另一个答案是责任转移:上线后出事了,可以指着覆盖率报表说「我们流程没问题」。

2023年,软件咨询公司Tricentis调研了全球1200家企业的质量工程实践。发现覆盖率超过95%的团队中,61%承认「存在为凑数字而写的测试」,但只有17%在内部复盘里主动提及。数字成了遮羞布。

更隐蔽的是工具厂商的推波助澜。多家测试SaaS公司的定价模型与「监控的代码行数」挂钩,100%覆盖率意味着更多付费节点。一位前SonarQube销售在离职后写道:「我们培训客户成功团队的第一课,是如何把『覆盖率缺口』翻译成『技术债务风险』。」

回到谷歌那支被100%覆盖率OKR压垮的团队。他们在2024年初做了件事:把目标改成「关键用户旅程零逃逸缺陷」,允许覆盖率在75%-90%区间浮动。半年后,线上事故下降41%,工程师离职率从年化34%降到12%。

他们的技术负责人后来在内部文档里写了一句被疯狂转发的话:「我们停止用测试的数量证明质量,开始用用户的沉默证明质量。」

如果你的团队明天把覆盖率目标从90%调到100%,你觉得工程师会先优化测试质量,还是先优化测试数量?