达到 100% 的代码覆盖率并不能消除 Bug!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

服务热线

0898-08980898

© Copyright © k8凯发(中国)天生赢家·一触即发 版权所有

地址:江西省南昌市
电话:0898-08980898