什么是代码覆盖率以及您如何衡量它?

时间:2008-10-12 02:35:18

标签: testing computer-science code-coverage

什么是代码覆盖率以及如何衡量代码覆盖率?

我被问到有关我们自动测试代码覆盖率的问题。似乎在自动化工具之外,它更多的是艺术,而不是科学。有没有关于如何使用代码覆盖的真实示例?

10 个答案:

答案 0 :(得分:206)

代码覆盖率是在自动化测试运行时执行代码行/块/弧的度量。

使用专用工具收集代码覆盖率,以检测二进制文件以添加跟踪调用并针对已检测产品运行一整套自动化测试。一个好的工具不仅可以为您提供执行代码的百分比,还可以深入查看数据并查看在特定测试期间执行的代码行。

我们的团队使用Magellan - 一套内部代码覆盖工具。如果您是.NET商店,Visual Studio已集成了用于收集代码覆盖率的工具。您还可以滚动一些自定义工具,例如this article描述。

如果您是C ++商店,英特尔有一些tools适用于Windows和Linux,但我还没有使用它们。我也听说有GCC的gcov工具,但我对此一无所知,也无法给你一个链接。

关于我们如何使用它 - 代码覆盖率是我们每个里程碑的退出标准之一。我们实际上有三个代码覆盖度量标准 - 来自单元测试(来自开发团队),场景测试(来自测试团队)和组合覆盖的覆盖范围。

BTW,虽然代码覆盖率是衡量您正在进行多少测试的一个很好的指标,但它并不一定是您测试产品的良好指标。您还应该使用其他指标以及代码覆盖率来确保质量。

答案 1 :(得分:155)

代码覆盖率基本上测试了测试中涵盖了多少代码。因此,如果你有90%的代码覆盖率,那么有10%的代码不在测试范围内。我知道你可能会认为90%的代码都被覆盖了,但你必须从不同的角度来看。什么阻止你获得100%的代码覆盖率?

一个很好的例子是:

if(customer.IsOldCustomer()) 
{
}
else 
{
}

现在,在上面的代码中有两个路径/分支。如果您总是点击“是”分支,那么您不会覆盖其他部分,它将显示在代码覆盖率结果中。这很好,因为现在您知道未涵盖的内容,您可以编写测试来覆盖其他部分。如果没有代码覆盖,那么你只是坐在定时炸弹上爆炸。

NCover是衡量代码覆盖率的好工具。

答案 2 :(得分:53)

请记住,拥有“100%代码覆盖率”并不意味着所有内容都经过全面测试 - 虽然这意味着每行代码都经过测试,但并不意味着它们在每种(常见)情况下都经过测试。< / p>

我会使用代码覆盖来突出显示我应该编写测试代码的代码。例如,如果任何代码覆盖工具显示myImportantFunction()在运行我当前的单元测试时没有执行,那么它们应该可以改进。

基本上,100%的代码覆盖率并不意味着您的代码是完美的。使用它作为编写更全面(单元)测试的指南。

答案 3 :(得分:40)

补充以往许多答案中的几点:

代码覆盖率意味着您的测试集覆盖源代码的程度。即,测试用例集涵盖的源代码的程度。

如上面的答案所述,有各种覆盖标准,如路径,条件,功能,陈述等。但是要涵盖的其他标准是

  1. 条件覆盖:要评估的所有布尔表达式的真和假。
  2. 决策覆盖范围:不仅要对布尔表达式进行一次真实和假的评估,而是覆盖所有后续的if-elseif-else体。
  3. 循环覆盖:意味着,每个可能的循环都执行了一次,多次和零次。此外,如果我们假设最大限制,那么,如果可行的话,测试最大限制时间,并且超过最大限制时间。
  4. 进入和退出覆盖范围:测试所有可能的呼叫及其返回值。
  5. 参数值覆盖范围(PVC)。检查是否测试了参数的所有可能值。例如,字符串可以是以下任何一种:a)null,b)空,c)空格(空格,制表符,新行),d)有效字符串,e)无效字符串,f)单字节字符串,g )双字节字符串。未能测试每个可能的参数值可能会留下错误。仅测试其中一个可能会导致100%的代码覆盖率,因为每行都被覆盖,但由于只测试了七个选项中的一个,意味着参数值的覆盖率仅为14.2%。
  6. 继承覆盖:对于面向对象的源,当返回由基类引用的派生对象时,如果返回兄弟对象,则应测试要评估的coverage。
  7. 注意:静态代码分析将查找是否存在任何无法访问的代码或挂起的代码,即任何其他函数调用未涵盖的代码。还有其他静态覆盖。即使静态代码分析报告涵盖100%代码,如果测试了所有可能的代码覆盖率,它也不会提供有关测试集的报告。

答案 4 :(得分:13)

以前的答案已经很好地解释了代码覆盖率。所以这更像是对问题第二部分的回答。

我们使用了三种工具来确定代码覆盖率。

  1. JTest - 基于JUnit构建的专有工具。 (它也会生成单元测试。)
  2. Cobertura - 一个开源代码覆盖工具,可以轻松地与JUnit测试结合生成报告。
  3. Emma - 另一个 - 我们使用的这个目的与单元测试略有不同。当最终用户访问Web应用程序时,它已用于生成覆盖报告。这与Web测试工具(例如:Canoo)相结合,可以为您提供非常有用的覆盖率报告,告诉您在典型的最终用户使用期间覆盖了多少代码。
  4. 我们使用这些工具

    • 评论开发人员编写了良好的单元测试
    • 确保在黑盒测试期间遍历所有代码

答案 5 :(得分:6)

代码覆盖率只是测试代码的一种度量。可以测量多种覆盖标准,但通常是程序中的各种路径,条件,功能和语句构成总覆盖范围。代码覆盖率指标只是执行每个覆盖标准的测试的百分比。

至于我如何跟踪项目的单元测试覆盖率,我使用静态代码分析工具来跟踪。

答案 6 :(得分:5)

对于Perl,我经常在我的模块上使用优秀的Devel::Cover模块。

如果构建和安装由Module :: Build管理,您只需运行./Build testcover即可获得一个漂亮的HTML网站,告诉您每个子,线和条件的覆盖率,漂亮的颜色使其易于查看哪个代码路径没有被覆盖。

答案 7 :(得分:0)

在前面的答案中,代码覆盖率已得到很好的解释。如果您在iOSOSX平台上工作,我只是添加一些与工具相关的知识,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的代码覆盖范围。

答案 8 :(得分:0)

对于PHP,您应该看看Sebastian Bergmann的Github

为PHP代码覆盖率信息提供收集,处理和呈现功能。

https://github.com/sebastianbergmann/php-code-coverage

答案 9 :(得分:0)

代码覆盖率测试的目的是弄清楚有多少代码被测试。代码覆盖率工具生成一个报告,显示有多少应用程序代码已经运行。代码覆盖率以百分比来衡量,越接近 100% 越好。这是一个白盒测试的例子。以下是一些用于代码覆盖率测试的开源工具:

  1. Simplecov - 对于 Ruby
  2. Coverlet - 对于 .NET
  3. Cobertura - 对于 Java
  4. Coverage.py - 用于 Python
  5. Jest - 用于 JavaScript
相关问题