一、Jacoco概述
JaCoCo 是一个开源的覆盖率工具,它针对的开发语言是 java,其使用方法很灵活,可以嵌入到 Ant、Maven 中;可以作为 Eclipse 插件,可以使用其 JavaAgent 技术监控 Java 程序等等。
很多第三方的工具提供了对 JaCoCo 的集成,如 sonar、Jenkins 等。
JaCoCo 包含了多种尺度的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage),分支(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstract methods)、类覆盖(classes)。
二、JaCoCo 基本概念
jacoco 支持多种覆盖率的统计,包括:
- 行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
- 类覆盖率:度量计算 class 类文件是否被执行。
- 分支覆盖率:度量 if 和 switch 语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。
- 方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
- 指令覆盖:计数单元是单个 java 二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。
- 圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。
三、Maven 配置 Jacoco
3.1 添加依赖
<!-- jacoco -->
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
</dependency>
3.2 插件配置
<!-- jacoco 插件配置 -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>check</id>
<goals>
<goal>check</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
- 设定覆盖率检测的文件范围,configuration 加在 plugin 标签里,executions 外
<configuration>
<includes>
<!-- 对包含***的路径的测试类进行统计 -->
<include>com/unit/test/**</include>
</includes>
<excludes>
<!-- 排除包路径中包含***的测试类进行jacoco统计 -->
<exclude></exclude>
</excludes>
</configuration>
表示对指定目录下的包进行覆盖率测试,com/**/*表示对 com 下的所有文件进行覆盖率测试
- 你也可以这样排除一个包和它的所有子包/子包:
<exclude>com/**/*</exclude>
- 通配符语法
* Match zero or more characters
** Match zero or more directories
? Match a single character
- 指定覆盖规则
<configuration>
<!-- rules裏面指定覆蓋規則 -->
<rules>
<rule implementation="org.jacoco.maven.RuleConfiguration">
<element>BUNDLE</element>
<limits>
<!-- 指定方法覆蓋到50% -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>METHOD</counter>
<value>COVEREDRATIO</value>
<minimum>0.50</minimum>
</limit>
<!-- 指定分支覆蓋到50% -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>BRANCH</counter>
<value>COVEREDRATIO</value>
<minimum>0.50</minimum>
</limit>
<!-- 指定類覆蓋到100%,不能遺失任何類 -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>CLASS</counter>
<value>MISSEDCOUNT</value>
<maximum>0</maximum>
</limit>
</limits>
</rule>
</rules>
</configuration>
指定覆盖规则,只有在中配置了 check 才会生效,不满足覆盖条件的情况下 mvn install 命令将会执行失败
在执行 mvn 命令时,加上“org.jacoco:jacoco-maven-plugin:{版本号}:prepare-agent”参数即可。
示例:
mvn clean test org.jacoco:jacoco-maven-plugin:0.8.11:prepare-agent install -'Dmaven.test.failure.ignore'=true -e -X
【-Dmaven.test.failure.ignore=true】建议加上,否则如果单元测试失败,就会直接中断,不会产生.exec 文件
四、执行结果
执行完毕后,打开target/site/jacoco,效果如下
用浏览器打开index.html,即可看到各个文件的行和分支覆盖情况
五、注意事项
注意:确保各个地方Java版本一致