什么是代码覆盖率,您如何衡量?


275

什么是代码覆盖率,您如何衡量?

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

Answers:


242

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

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

我们的团队使用Magellan(一套内部代码覆盖工具)。如果您是.NET商店,则Visual Studio具有集成的工具来收集代码覆盖率。您还可以滚动一些自定义工具,如本文所述。

如果您是C ++商店,英特尔有一些可以在Windows和Linux上运行的工具,尽管我没有使用过。我也听说过有GCC的gcov工具,但是我对此一无所知,也无法给您链接。

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

顺便说一句,虽然代码覆盖率是您进行多少测试的一个很好的指标,但不一定是您对产品测试的好程度的一个好的指标。您还应该使用其他指标以及代码覆盖率来确保质量。


40
“还有其他指标应与代码覆盖率一起使用,以确保质量。” 您能否说这些其他指标是什么?
士兵

您还可以使用Testwell CTC ++,它是针对C,C ++,C#和Java的相当完整的代码覆盖工具
B_PRIEUR

1
@Abdul在测量代码覆盖率时,应同时运行两种测试,并分别测量它们的代码覆盖率。至于“代码弧”-这些是代码执行分支,如if / then。
弗朗西·佩诺夫'16

1
@Maverick大多数人在谈论代码覆盖率时都会进行单元测试,但是在Microsoft,我们同时通过单元测试和集成测试来测量代码覆盖率。
弗朗西·佩诺夫(Francis Penov)'17

1
@darth_coder一般没什么。该应用程序也不会自动进行检测,并且如果没有什么可收集检测数据,则与新应用程序的存在无关。可能会影响事物的唯一情况是,应用程序在运行自动化测试的同时运行,并且导致检测到的OS代码在与自动化测试相同的过程中运行,从而可能显示正在运行的某些OS代码。测试未触及。
弗朗西·佩诺夫

189

代码覆盖率基本上可以测试测试覆盖了多少代码。因此,如果您具有90%的代码覆盖率,则意味着测试中没有覆盖10%的代码。我知道您可能会认为90%的代码已被覆盖,但是您必须从另一个角度来看。是什么阻止您获得100%的代码覆盖率?

一个很好的例子是:

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

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

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


5
最好的答案,将近10年前!该死的!:)
尼科斯

4
简单而有意义的答案:)
Parveen

是。唯一有意义的。即使我什至不愿意继续向下滚动。这是我停下来的地方。已收藏。
TheRealChx101 '19

64

只需记住,拥有“ 100%代码覆盖率”并不意味着所有内容都经过了完全测试-尽管这意味着每一行代码都经过了测试,但这并不意味着它们在每种(常见)情况下都经过了测试。

我将使用代码覆盖率来突出显示可能应该为其编写测试的代码。例如,如果运行我当前的单元测试时未执行任何代码覆盖工具显示myImportantFunction(),则可能应该对其进行改进。

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


1
-“ 100%的代码覆盖率”并不意味着所有内容都经过了完全测试-尽管这意味着每一行代码都经过了测试,但这并不意味着它们在每种(常见)情况下都经过了测试。情况”,这与数据输入和参数有关吗?我很难理解为什么如果一切都经过测试,就不等于完全经过测试。
阿卜杜勒

20
仅仅因为代码的每一行都在测试中的某个时刻运行,并不意味着您已经测试了可以在其下运行代码的所有可能情况。如果您刚刚使用了一个函数x并返回了该函数,并且x/x使用my_func(2)运行了测试,则覆盖率将达到100%(因为该函数的代码将已运行),但是当参数为0时,您将错过一个巨大的问题。也就是说,即使覆盖率达到100%,您也没有测试所有必要的方案。
史蒂夫

当未为所有方法编写单元测试用例时,您能否调查这种情况?代码覆盖率仍然是100%吗? stackoverflow.com/questions/43395968/...
萨钦·库马尔·

52

补充一些以前的答案:

代码覆盖率意味着测试集覆盖源代码的程度。即,测试用例集涵盖的源代码范围是多少。

如以上答案中所述,存在各种覆盖标准,例如路径,条件,函数,语句等。但是要覆盖的其他标准是

  1. 条件覆盖率:所有布尔表达式都将被评估为真和假。
  2. 决策覆盖范围:不仅布尔值表达式一次要评估是非,而且还要覆盖所有后续if-elseif-else主体。
  3. 循环覆盖率:意味着,每个可能的循环执行一次,不止一次和零次。同样,如果我们假设最大极限,那么在可行的情况下,测试最大极限时间,并且大于最大极限时间。
  4. 进入和退出范围:测试所有可能的呼叫及其返回值。
  5. 参数值覆盖率(PVC)。检查是否已测试参数的所有可能值。例如,字符串可以是以下任意一种:a)null,b)空,c)空格(空格,制表符,换行),d)有效字符串,e)无效字符串,f)单字节字符串,g )双字节字符串。无法测试每个可能的参数值可能会导致错误。仅测试其中之一可能会导致覆盖每一行,从而导致100%的代码覆盖率,但是由于仅测试了七个选项之一,因此,仅覆盖了14.2%的参数值。
  6. 继承覆盖率:如果是面向对象的源,则在返回基类引用的派生对象时,应该测试要评估的覆盖率(如果返回了同级对象)。

注意:静态代码分析将查找是否存在任何无法访问的代码或挂起的代码,即任何其他函数调用未涵盖的代码。还有其他静态覆盖。即使静态代码分析报告覆盖了100%的代码,但是如果测试了所有可能的代码覆盖率,它也不会提供有关测试集的报告。


2
在这里添加其他答案
HDave

14

在先前的答案中已经很好地解释了代码覆盖率。因此,这更是对问题第二部分的答案。

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

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

我们使用这些工具来

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

6

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

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


5

对于Perl,有出色的Devel :: Cover模块,我经常在模块上使用。

如果构建和安装是由Module :: Build管理的,则只需运行./Build testcover即可获得一个漂亮的HTML站点,该站点可告诉您每个子,行和条件的覆盖范围,并带有漂亮的颜色,可以轻松查看未涵盖哪个代码路径。


1

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.