代码覆盖率


Jacoco是一个开源的覆盖率工具。Jacoco 可以嵌入到 Ant 、Maven 中,(还可以配置到gradle中,不过官方并没有提供相应文档)并提供了 EclEmma Eclipse 插件,也可以使用 Java Agent 技术监控 Java 程序。很多第三方的工具提供了对 Jacoco 的集成,如:Sonar、Jenkins、IDEA.

什么是代码覆盖率

代码覆盖(英语:Code coverage)是软件测试中的一种度量,描述程序中源代码被测试的比例和程度,所得比例称为代码覆盖率。摘自--百度百科

无论是单元测试、API测试还是功能性测试,最终都是调用了产品的代码;如何评价这些测试的效率?这些测试是否真正全部或者大部分覆盖了产品的代码,这个时候,代码覆盖率(code coverage)就是一个比较有价值的参考指标了。

覆盖率

我们常用UnitTest对代码进行功能性测试,计算代码覆盖率,从质量的角度来说,肯定是希望能够全部进行覆盖的,但是从实际出发,进行全覆盖也是不现实的,并且把测试覆盖率作为质量目标没有任何意义,而我们应该把它作为一种发现未被测试覆盖的代码的手段。从现有的覆盖率检测工具来看,即使覆盖率到达了100%,也不能保证代码全部分支被覆盖到。(从这个角度来看,好像代码覆盖率这个概念只是给出了我们custom code被测试的一个比列而已,那么测试结果的好坏貌似并不是这里改讨论的话题耶)

代码覆盖率的意义

  1. 分析未覆盖部分的代码,从而反推在前期测试设计是否充分?没有覆盖到的代码是否是测试设计的盲点,为什么没有考虑到?是需求/设计不够清晰,测试设计的理解有误?还是工程方法应用后造成的策略性放弃等等,方便之后进行测试用例设计补充。
  2. 检测出程序中的废代码,可以逆向反推在代码设计中思维混乱点,提醒设计/开发人员理清代码逻辑关系,提升代码质量。
  3. 代码覆盖率高不能说明代码质量高,但是反过来看,代码覆盖率低,代码质量不会高到哪里去,可以作为测试自我审视的重要工具之一。
    目前Java常用覆盖率工具Jacoco、Emma和Cobertura、Clover(商用).但是Emma和Cobertura已经停止维护。

Jacoco用于计量覆盖率

Jacoco 包含了多种尺度的覆盖率计数器,包含指令级(Instructions,C0 coverage),分支(Branches,C1 coverage)、圈复杂度(Cyclomatic Complexity)、行(Lines)、方法(Non-abstract Methods)、类(Classes)。
Instructions:Jacoco 计算的最小单位就是字节码指令。指令覆盖率表明了在所有的指令中,哪些被执行过以及哪些没有被执行。这项指数完全独立于源码格式并且在任何情况下有效,不需要类文件的调试信息。
Branches:Jacoco 对所有的 if 和 switch 指令计算了分支覆盖率。这项指标会统计所有的分支数量,并同时支出哪些分支被执行,哪些分支没有被执行。这项指标也在任何情况都有效。异常处理不考虑在分支范围内。
Cyclomatic Complexity:Jacoco 为每个非抽象方法计算圈复杂度,并也会计算每个类、包、组的复杂度。根据 McCabe 1996 的定义,圈复杂度可以理解为覆盖所有的可能情况最少使用的测试用例数。这项参数也在任何情况下有效。
Lines:该项指数在有调试信息的情况下计算。
Methods:每一个非抽象方法都至少有一条指令。若一个方法至少被执行了一条指令,就认为它被执行过。因为 Jacoco 直接对字节码进行操作,所以有些方法没有在源码显示(比如某些构造方法和由编译器自动生成的方法)也会被计入在内。
Classes:每个类中只要有一个方法被执行,这个类就被认定为被执行。同 Methods一样,有些没有在源码声明的方法被执行,也认定该类被执行。


覆盖率的两种使用方式:检测单元测试覆盖率、检测集成测试覆盖率

检测单元测试覆盖率

本地项目使用gradle构建,需要在build.gradle中配置以下内容:

apply plugin: 'jacoco'

compileTestJava.enabled = true

//报告配置
jacocoTestReport {
    reports {
        xml.enabled true
        csv.enabled true
        html.destination file("build/myReport/jacoco/jacocoHTML")
    }
}

然后在项目根目录编译,

gradle build

在项目根目录中可看到生成了build文件夹;
截止到此,我们只能得到一个覆盖率的html,在路径/build/reports/tests/test/index.html,如下图所示


代码覆盖率_第1张图片
image.png

如果想要得到具体每个类的覆盖率情况,我们需要在根目录执行,

gradle jacocoTestReport

然后会在/build/myReport/jacoco/jacocoHTML/中看到具体信息,如下图,


代码覆盖率_第2张图片
5718792-2eaa34294bb6389d.png

注意:
绿色部分:完全覆盖
黄色部分:条件覆盖
红色部分:未覆盖

你可能感兴趣的:(代码覆盖率)