什么是代码覆盖率?你如何衡量它?

有人问我这个关于自动化测试代码覆盖率的问题。似乎在自动化工具之外,它更像是艺术而不是科学。是否有任何关于如何使用代码覆盖的实际示例?


代码覆盖率只是对所测试代码的度量。有多种可以度量的覆盖标准,但通常是程序中的各种路径、条件、函数和语句构成了总覆盖。代码覆盖率度量是执行每种覆盖率标准的测试的百分比。

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


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

代码覆盖率是通过使用专门的工具来检测二进制文件,以添加跟踪调用,并对检测的产品运行一整套自动化测试来收集的。好的工具不仅可以告诉您执行的代码的百分比,还可以让您深入数据,并查看在特定测试中执行了哪些代码行。

我们的团队使用Magellan——一套内部代码覆盖工具。如果你是一个。net商店,Visual Studio有集成的工具来收集代码覆盖率。您还可以滚动一些定制工具,就像本文所描述的那样。

如果你是一个c++商店,英特尔有一些工具可以运行在Windows和Linux上,尽管我没有使用过它们。我也听说GCC有gcov工具,但我对它一无所知,也不能给你一个链接。

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

顺便说一句,虽然代码覆盖率是衡量你做了多少测试的一个很好的指标,但它不一定是衡量你测试产品的好坏的一个很好的指标。除了代码覆盖率,您还应该使用其他指标来确保质量。


代码覆盖率基本上告诉您测试中覆盖了多少代码。例如,如果您有90%的代码覆盖率,这意味着测试中没有覆盖10%的代码。

我知道您可能会想,如果覆盖了90%的代码,就已经足够好了,但是您必须从不同的角度看问题。是什么阻止您获得100%的代码覆盖率?

一个很好的例子是:

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

现在,在上面的代码中,有两个路径/分支。如果你总是点击“YES”分支,你没有覆盖“else”部分,它将显示在代码覆盖结果中。这很好,因为现在您知道了没有覆盖的内容,并且可以编写一个测试来覆盖“else”部分。如果没有代码覆盖,您就只是坐在一个定时炸弹上,等待爆炸。

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


请记住,拥有“100%代码覆盖率”并不意味着所有内容都被完全测试了——虽然这意味着每一行代码都被测试了,但这并不意味着它们在每种(常见)情况下都被测试了。

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

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


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

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

JTest - a proprietary tool built over JUnit. (It generates unit tests as well.) Cobertura - an open source code coverage tool that can easily be coupled with JUnit tests to generate reports. Emma - another - this one we've used for a slightly different purpose than unit testing. It has been used to generate coverage reports when the web application is accessed by end-users. This coupled with web testing tools (example: Canoo) can give you very useful coverage reports which tell you how much code is covered during typical end user usage.

我们使用这些工具

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


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

如果构建和安装由Module:: build管理,你可以简单地运行./ build testcover来获得一个漂亮的HTML站点,它告诉你每个子、行和条件的覆盖率,漂亮的颜色可以很容易地看到哪些代码路径没有被覆盖。


对之前的许多答案进行了几点补充:

代码覆盖率意味着您的测试集覆盖源代码的程度。也就是说,源代码在多大程度上被测试用例集所覆盖。

正如在上面的回答中提到的,有各种各样的覆盖标准,比如路径、条件、函数、语句等。但要涵盖的其他标准是

Condition coverage: All boolean expressions to be evaluated for true and false. Decision coverage: Not just boolean expressions to be evaluated for true and false once, but to cover all subsequent if-elseif-else body. Loop Coverage: means, has every possible loop been executed one time, more than once and zero time. Also, if we have assumption on max limit, then, if feasible, test maximum limit times and, one more than maximum limit times. Entry and Exit Coverage: Test for all possible call and its return value. Parameter Value Coverage (PVC). To check if all possible values for a parameter are tested. For example, a string could be any of these commonly: a) null, b) empty, c) whitespace (space, tabs, new line), d) valid string, e) invalid string, f) single-byte string, g) double-byte string. Failure to test each possible parameter value may leave a bug. Testing only one of these could result in 100% code coverage as each line is covered, but as only one of seven options are tested, means, only 14.2% coverage of parameter value. Inheritance Coverage: In case of object oriented source, when returning a derived object referred by base class, coverage to evaluate, if sibling object is returned, should be tested.

注意:静态代码分析将发现是否有任何不可访问的代码或挂起的代码,即没有被任何其他函数调用覆盖的代码。还有其他静态报道。即使静态代码分析报告100%的代码被覆盖了,如果所有可能的代码覆盖率都被测试了,它也不会给出关于您的测试集的报告。


在前面的回答中,已经很好地解释了代码覆盖率。我只是补充了一些与工具相关的知识,如果你在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代码覆盖率的有用链接。


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

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

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


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

Simplecov -用于Ruby Coverlet -用于。net Cobertura -用于Java cover .py -用于Python Jest -用于JavaScript