什么是代码覆盖率,你如何衡量它?
Posted
技术标签:
【中文标题】什么是代码覆盖率,你如何衡量它?【英文标题】:What is code coverage and how do YOU measure it? 【发布时间】:2010-09-16 17:42:29 【问题描述】:什么是代码覆盖率以及如何衡量它?
有人问我这个关于我们自动化测试代码覆盖率的问题。似乎在自动化工具之外,它更像是艺术而不是科学。是否有任何关于如何使用代码覆盖率的真实示例?
【问题讨论】:
【参考方案1】:代码覆盖率测试的目的是弄清楚有多少代码正在被测试。代码覆盖率工具生成一份报告,显示已运行了多少应用程序代码。代码覆盖率以百分比来衡量,越接近 100% 越好。这是一个白盒测试的例子。以下是一些用于代码覆盖率测试的开源工具:
-
Simplecov - 红宝石
Coverlet - 适用于 .NET
Cobertura - 用于 Java
Coverage.py - 用于 Python
Jest - 用于 javascript
【讨论】:
【参考方案2】:代码覆盖率基本上告诉您有多少代码被测试覆盖。例如,如果你有 90% 的代码覆盖率,这意味着 10% 的代码没有被测试覆盖。
我知道你可能会想,如果 90% 的代码都被覆盖了,那就足够了,但你必须换个角度看。是什么阻止您获得 100% 的代码覆盖率?
一个很好的例子是这样的:
if(customer.IsOldCustomer())
else
现在,在上面的代码中,有两个路径/分支。如果您总是点击“YES”分支,则您没有覆盖“else”部分,它将显示在代码覆盖率结果中。这很好,因为现在您知道没有涵盖的内容,您可以编写一个测试来涵盖“其他”部分。如果没有代码覆盖,你只是坐在定时炸弹上,等待爆炸。
NCover 是衡量代码覆盖率的好工具。
【讨论】:
最佳答案,大约 10 年前!该死! :) 简单而有意义的答案:) 是的。唯一说得通的。即使我什至懒得继续向下滚动。这就是我停下来的地方。已收藏。 描述得真好!【参考方案3】:对于 PHP,你应该看看 Sebastian Bergmann 的 Github
为 php 代码覆盖率信息提供收集、处理和呈现功能。
https://github.com/sebastianbergmann/php-code-coverage
【讨论】:
【参考方案4】:在前面的答案中,代码覆盖率已经得到很好的解释。如果您在ios
和OSX
平台上工作,我只是添加一些与工具相关的知识,Xcode 提供了测试和监控代码覆盖率的工具。
参考链接:
https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/07-code_coverage.html
https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51
两者都是学习和探索 Xcode 代码覆盖率的有用链接。
【讨论】:
【参考方案5】:对前面许多答案的几点补充:
代码覆盖率是指测试集覆盖源代码的程度。即测试用例集涵盖的源代码到什么程度。
正如上面的答案中提到的,有各种覆盖标准,如路径、条件、函数、语句等。但要覆盖的其他标准是
-
条件覆盖:所有布尔表达式都将被评估为真假。
决策覆盖范围:不仅是布尔表达式要计算一次真假,而且要覆盖所有后续的 if-elseif-else 主体。
循环覆盖率:表示每个可能的循环是否已执行一次、多次和零次。此外,如果我们假设最大限制,那么在可行的情况下,测试最大限制次数,并且比最大限制次数多一倍。
进入和退出覆盖率:测试所有可能的调用及其返回值。
参数值覆盖率 (PVC)。检查是否测试了参数的所有可能值。例如,字符串通常可以是以下任何一种:a) null,b) 空,c) 空格(空格、制表符、换行符),d) 有效字符串,e) 无效字符串,f) 单字节字符串,g ) 双字节字符串。未能测试每个可能的参数值可能会留下错误。仅测试其中一个可能会导致 100% 的代码覆盖率,因为覆盖了每一行,但由于仅测试了七个选项中的一个,这意味着只有 14.2% 的参数值覆盖率。
继承覆盖率:在面向对象源的情况下,当返回基类引用的派生对象时,如果返回同级对象,则应测试覆盖率。
注意:静态代码分析会发现是否有任何无法访问的代码或挂起的代码,即没有被任何其他函数调用覆盖的代码。以及其他静态覆盖。即使静态代码分析报告 100% 的代码被覆盖,如果所有可能的代码覆盖率都已测试,它也不会提供有关您的测试集的报告。
【讨论】:
对其他答案很好的补充【参考方案6】:在前面的答案中已经很好地解释了代码覆盖率。所以这更像是对问题第二部分的回答。
我们使用了三种工具来确定代码覆盖率。
-
JTest - 基于 JUnit 构建的专有工具。 (它也会生成单元测试。)
Cobertura - 一个开源代码覆盖率工具,可以轻松与 JUnit 测试结合以生成报告。
Emma - 另一个 - 我们用于与单元测试略有不同的目的。它已用于在最终用户访问 Web 应用程序时生成覆盖率报告。这与网络测试工具(例如:Canoo)相结合,可以为您提供非常有用的覆盖率报告,告诉您在典型的最终用户使用期间覆盖了多少代码。
我们使用这些工具来
审查开发人员编写了良好的单元测试 确保在黑盒测试期间遍历所有代码【讨论】:
【参考方案7】:代码覆盖率只是对被测试代码的衡量。有多种覆盖率标准可以衡量,但通常是程序中的各种路径、条件、函数和语句构成了总覆盖率。代码覆盖率指标只是执行这些覆盖率标准的测试的百分比。
就我如何跟踪项目的单元测试覆盖率而言,我使用静态代码分析工具来跟踪。
【讨论】:
【参考方案8】:代码覆盖率衡量在运行自动化测试时执行了多少行/块/弧。
代码覆盖率是通过使用专门的工具来检测二进制文件以添加跟踪调用并针对检测的产品运行全套自动化测试来收集的。一个好的工具不仅可以为您提供已执行代码的百分比,还可以让您深入研究数据并准确查看在特定测试期间执行了哪些代码行。
我们的团队使用Magellan - 一套内部代码覆盖工具。如果您是 .NET 商店,Visual Studio 已集成工具来收集代码覆盖率。您还可以滚动一些自定义工具,例如 this article 描述。
如果你是一家 C++ 商店,英特尔有一些tools 可以在 Windows 和 Linux 上运行,尽管我没有使用过它们。我也听说有 GCC 的 gcov 工具,但我对此一无所知,无法给您链接。
至于我们如何使用它 - 代码覆盖率是我们每个里程碑的退出标准之一。我们实际上有三个代码覆盖率指标 - 单元测试覆盖率(来自开发团队)、场景测试(来自测试团队)和组合覆盖率。
顺便说一句,虽然代码覆盖率是衡量您进行了多少测试的好指标,但它不一定是衡量您测试产品的好坏的好指标。您还应该使用其他指标以及代码覆盖率来确保质量。
【讨论】:
“您还应该使用其他指标以及代码覆盖率来确保质量。”您能说说这些其他指标是什么吗? 你也可以使用Testwell CTC++,它是一个相当完整的C、C++、C#和Java代码覆盖工具 @Troopers 突变测试是衡量测试范围的另一种方法。【参考方案9】:对于 Perl,我经常在我的模块中使用出色的 Devel::Cover 模块。
如果构建和安装由 Module::Build 管理,您可以简单地运行 ./Build testcover
来获得一个漂亮的 HTML 站点,它会告诉您每个子、行和条件的覆盖率,漂亮的颜色可以很容易地查看哪些代码路径没有被覆盖。
【讨论】:
【参考方案10】:请记住,“100% 代码覆盖率”并不意味着所有内容都经过全面测试 - 虽然这意味着每一行代码都经过测试,但这并不意味着它们在每种(常见)情况下都经过测试..
我会使用代码覆盖来突出显示我可能应该为其编写测试的代码。例如,如果任何代码覆盖工具显示 myImportantFunction() 在运行我当前的单元测试时没有执行,它们可能应该得到改进。
基本上,100% 的代码覆盖率并不意味着您的代码是完美的。使用它作为编写更全面(单元)测试的指南。
【讨论】:
-“100% 代码覆盖率”并不意味着所有内容都经过了完全测试——虽然这意味着每一行代码都经过了测试,但这并不意味着它们在每种(常见)情况下都经过了测试。 .-“在每种(常见)情况下”这与数据输入和参数有关吗?我很难理解为什么如果一切都经过测试,它并不等同于完全经过测试。 仅仅因为您的代码的每一行都在您的测试中的某个时间点运行,这并不意味着您已经测试了代码可以运行的所有可能场景。如果你只有一个函数,它接受x
并返回x/x
并且你使用 my_func(2) 运行测试,你将有 100% 的覆盖率(因为函数的代码已经运行)但是你错过了一个大问题当参数为 0 时。 IE。即使覆盖率为 100%,您还没有测试所有必要的场景。以上是关于什么是代码覆盖率,你如何衡量它?的主要内容,如果未能解决你的问题,请参考以下文章