【CSDN 编者按】文章通过一个极端例子说明,100% 的代码覆盖率并不意味着项目中没有 bug。作者编写了一个具有 100% 代码覆盖率但仍有除零错误的火箭发射函数,以此证明高代码覆盖率无法保证软件质量。作者还解答了一些常见问题,强调提高代码覆盖率不能神奇地解决所有漏洞,建议关注其他质量指标如 PDWT、PBCNT、PTVB、PTD,并考虑形式验证等方法以减少关键任务软件中的漏洞。

原文链接:https://blog.codepipes.com/testing/code-coverage.html

未经允许,禁止转载!

作者 | Kostis Kapelonis       责编 | 夏萌

译者 | 明明如月

出品 | CSDN(ID:CSDNnews)

达到 100% 的代码覆盖率并不意味着项目中没有任何 bug。以下是一个可以证明这一点的极端例子。

96dfa849adc0cb5abd9cc52fc3ec2226.png

引言

我发现有很多人希望将代码覆盖率提高到不切实际的水平,或者认为达到 100% 的代码覆盖率就是消除所有 bug 实现完美软件的终极目标。
互联网上已经有很多文章解释了为什么这是一个谬误,但我最近想用一个实际的代码示例证明 100% 代码覆盖率并不意味着没有 bug。我相信当你们看到这段代码时,会有一种“恍然大悟”的感觉。

ed027ab16d5758551aa6d3e563dbc6d4.png

一个仅有一行代码的“应用程序”

下面是我编写一个只有一行代码的应用程序。

```go

func calculateVelocity(angle int, direction int)int{
return((3*(4*angle - direction))*3)/(7*(direction -(2* angle)))*-1
}

```

这是一个用于发射火箭的软件中的非常重要的方法,因此它需要非常健壮。
作为完美主义者,我为这个函数编写了 6 个单元测试。运行测试后,我们达到了 100% 的代码覆盖率!

5a27d850091d23aab49e9276508beea5.png

然而,第二天早上,我却在新闻中看到了火箭爆炸的消息。显然,这个函数存在一个漏洞:当 direction 是 angle 的两倍时,会发生除零错误。例如,当 direction 是 4,angle 是 2 时,火箭会爆炸:

panic: runtime error: integer divide by zero

这个例子表明,即使达到 100% 的代码覆盖率,应用程序仍然可能存在 bug。在一个包含 50,000 行代码的真实应用程序中,即使达到 100% 的代码覆盖率,仍可能存在 100 个、1000 个甚至 10,000 个漏洞。

因此,达到 100% 的代码覆盖率并不能保证软件质量,而且,认为从 90% 提升到 100% 就能消除所有漏洞的想法也是错误的。

31265299dbc2c0ef477ef3cb3587c7eb.png

常见问题解答

问:这篇文章没用,很多人都知道 100% 代码覆盖率不能消除漏洞。
答:新手开发者和一些被误导的团队管理者可能并不了解这一点。许多文章也错误地推崇 100% 代码覆盖率。我写这篇文章的目的是提供一个具体的实例,帮助大家更好地理解这个问题。

问:你的单元测试输入数据从哪里来的?
答:这些数据来源于业务分析师、质量保证工程师,或者朋友 Fred。关键在于,我利用这些数据实现了 100% 的代码覆盖率。

问:我一看到你的方法就发现了这个错误,并且会为此写一个单元测试。你的质量保证工程师遗漏了这个案例。
答:你可以为一行代码发现并编写测试,但能否为五行、五百行甚至五万行代码做到这一点呢?如果可以,那么你具备非凡的能力。实际上,如果能发现系统中的所有漏洞,就无需编写单元测试,直接修复代码即可。

问:所以你是说单元测试没有用吗?
答:当然不是。测试在捕捉回归错误和作为书面规范方面非常有用。我的观点是,通过增加代码覆盖率来减少漏洞是一个误解。

问:如果代码覆盖率不是衡量项目质量的好指标,我应该关注哪些指标呢?
答:我在我的测试指南中提出了几个有用但不太为人知的指标:PDWT、PBCNT、PTVB、PTD。

ea751c048b11406a50f349a111c7fc57.png

问:如果我想在关键的任务软件中减少漏洞,我该怎么办?
答:你应该考虑其他方法,比如形式验证和证明检查器。

问:听起来不错,但我仍然需要为我的新项目设定一个理想的代码覆盖率。如果不是 100%,我应该设定多少呢?
答:在不明确具体项目背景的情况下,建议的最低代码覆盖率应为 20%。这一建议基于帕累托原则,即 20% 的代码可能导致 80% 的漏洞。关于“关键代码”,你可以参考我在测试指南中的观点。

问:如果我的组织/经理/客户坚持所有项目达到 70%/ 80%/ 100%的代码覆盖率,我该怎么办?
答:可以把这篇文章发给他们。如果无法说服他们,也许可以考虑换一个组织、公司或客户合作?

推荐阅读:

▶耗时 3 个月改写一行代码,刚毕业程序员小哥成功消灭潜伏 7 年的 Bug!

▶苹果即将第三次被查,罚款或高达全球年收入10%!

▶警告!OpenAI 宣布全面封锁中国 API 接入


由 CSDN 和 Boolan 联合主办的「2024 全球软件研发技术大会(SDCon)」将于 7 月 4 -5 日在北京威斯汀酒店举行。

由世界著名软件架构大师、云原生和微服务领域技术先驱 Chris Richardson 和 MIT 计算机与 AI 实验室(CSAIL)副主任,ACM Fellow Daniel Jackson 领衔,BAT、微软、字节跳动、小米等技术专家将齐聚一堂,共同探讨软件开发的最前沿趋势与技术实践。

0111d093988bfcfc6a30da37d337397a.png

Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐