什么是代码覆盖率,你如何衡量它?
什么是代码覆盖率,你如何衡量它? 我被问到关于我们的自动化testing代码覆盖率的这个问题。 似乎是在自动化工具之外,它比艺术更具艺术性。 任何人都有他们如何使用代码覆盖率的真实世界的例子?
代码覆盖率是在自动化testing运行的同时执行代码的多less行/块/弧的度量。
代码覆盖率是通过使用专门的工具来收集二进制文件来添加跟踪调用和运行一套完整的自动化testing对照仪表产品。 一个好的工具不仅可以让你执行代码的百分比,而且还可以让你钻取数据,并在特定的testing过程中确切地看到哪些代码行被执行。
我们的团队使用Magellan – 一套内部的代码覆盖工具。 如果你是一个.Net商店,VS已经集成了工具来收集代码覆盖。 您也可以滚动一些自定义工具,如本文所述。
如果你是一个C ++商店,英特尔有一些运行Windows和Linux的工具 ,但我没有使用它们。 我也听说有gcc的gcov工具,但是我对它一无所知,不能给你一个链接。
至于我们如何使用它 – 代码覆盖率是我们每个里程碑的退出标准之一。 实际上,我们有三个代码覆盖率指标 – 来自unit testing(来自开发团队),情景testing(来自testing团队)和覆盖范围的覆盖率。
顺便说一句,虽然代码覆盖率是衡量你在做多lesstesting的一个很好的指标,但它不一定是testing你的产品的好程度。 您还应该使用其他指标以及代码覆盖率来确保质量。
代码覆盖率基本上testing你的代码在testing中覆盖了多less。 所以,如果你有90%的代码覆盖率,那么就意味着有10%的代码没有被testing覆盖。 我知道你可能会认为90%的代码被覆盖了,但你必须从另一个angular度来看。 什么阻止你获得100%的代码覆盖率?
一个很好的例子是:
if(customer.IsOldCustomer()) { } else { }
现在,在上面的代码中有两个path/分支。 如果你总是打“YES”分支,那么你不覆盖else部分,它将显示在Code Coverage结果中。 这是很好的,因为现在你知道什么没有覆盖,你可以写一个testing来覆盖其他部分。 如果没有代码覆盖,那么你只是坐在计时炸弹爆炸。
NCover是测量代码覆盖率的好工具。
请记住,拥有“100%代码覆盖率”并不意味着所有的testing都是完全的 – 而这意味着每一行代码都经过了testing,并不意味着它们在每个(常见)情况下都经过了testing。
我将使用代码覆盖来突出显示我应该编写testing的代码片段。 例如,如果任何代码覆盖工具显示myImportantFunction()在运行我的当前unit testing时未执行,则应该改进它们。
基本上,100%的代码覆盖并不意味着你的代码是完美的。 用它作为编写更全面(单元)testing的指南。
赞扬上面的许多答案的几点。
代码覆盖率意味着testing集覆盖源代码的程度如何。 即testing用例集涵盖的源代码的程度如何。
正如上面的答案中所提到的那样,有各种各样的覆盖标准,例如path,条件,function,陈述等等
- 条件覆盖:所有布尔expression式都要被评估为true和false。
- 决策覆盖范围:不仅仅是布尔expression式的真实和错误评估一次,而是覆盖所有后续的if-elseif-else正文。
- 循环覆盖:意味着,每个可能的循环都被执行一次,多次和零次。 另外,如果我们有最大限制的假设,那么,如果可行的话,testing最大限制时间,并且比最大限制时间多一个。
- 进入和退出覆盖范围:testing所有可能的调用及其返回值。
- 参数值覆盖率(PVC)。 检查是否testing了所有可能的参数值。 例如,一个string可以是以下任何一种:a)空,b)空,c)空格(空格,制表符,新行),d)有效string,e)无效string,f)单字节string,g )双字节string。 未能testing每个可能的参数值可能会留下一个错误。 只testing其中的一个可能导致100%的代码覆盖率,因为每条线都被覆盖,但是由于只有七个选项中的一个被testing,意味着只有14.2%的参数覆盖率。
- inheritance覆盖:对于面向对象的源代码,当返回由基类引用的派生对象时,覆盖度评估,如果返回了兄弟对象,应该被testing。
注:静态代码分析将查找是否有任何不可达的代码或挂起的代码,即代码不被任何其他函数调用覆盖。 还有其他的静态覆盖。 即使静态代码分析报告了100%的代码被覆盖,但是如果所有可能的代码覆盖率都被testing,它并不会给出有关您的testing集的报告。
代码覆盖率在上面的答案中已经有很好的解释。 所以这更多的是对问题第二部分的回答。
我们已经使用了3个工具来确定代码覆盖率。
- JTest – 一个build立在JUnit 之上的专有工具。 (它也产生unit testing)
- Cobertura – 一个开源的代码覆盖工具,可以很容易地与JUnittesting结合起来生成报告。
-
艾玛 – 另一个 – 我们用这个比unit testing的目的略有不同。 它被用来在最终用户访问networking应用时生成覆盖报告。 这与networkingtesting工具(例如:Canoo)相结合,可以为您提供非常有用的覆盖率报告,告诉您在典型的最终用户使用过程中覆盖了多less代码。
我们使用这些工具来
- 。 回顾开发者已经编写好的unit testing
- 。 确保在黑盒testing期间遍历所有代码
代码覆盖率只是testing代码的一个度量。 有多种可以测量的覆盖标准,但通常是程序中的各种path,条件,function和声明,构成整个覆盖范围。 代码覆盖率度量只是执行每个覆盖条件的testing的百分比。
至于如何跟踪我的项目的unit testing覆盖率,我使用静态代码分析工具来跟踪。
对Perl而言,我的模块上经常使用Devel :: Cover模块。
如果构build和安装由Module :: Build来pipe理,那么你可以简单地运行./Build testcover
来获得一个很好的HTML网站,它告诉你每个子./Build testcover
,行和条件的覆盖范围,使用漂亮的颜色可以很容易地看到哪个代码path没有被覆盖。