1. jacoco简述
- 一个开源的覆盖率工具
- 很多第三方的工具提供了对JaCoCo的集成,如sonar、Jenkins等
- 目前只支持JDK 1.5及以上
- 官网地址:https://www.eclemma.org/jacoco/
- github地址:https://github.com/jacoco/jacoco
说明:
- 为啥只能使用JDK 1.5及以上,因为jacoco使用的java代理,而java代理是jdk 1.5才有的
- 背景:最早的时候是EMMA做的覆盖率工具,后来不维护了,就出现了EclEmma团队产出的jacoco(灵感来自EMMA)
2. jacoco覆盖率统计
- 行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
- 类覆盖率:度量计算class类文件是否被执行。
- 分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。
- 方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
- 指令覆盖:计数单元是单个java二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。
- 圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。
3. jacoco使用方法
- Apache Ant方式 http://eclemma.org/jacoco/trunk/doc/ant.html
- 命令行方式 http://www.eclemma.org/jacoco/trunk/doc/agent.html
- Apache Maven方式 http://www.eclemma.org/jacoco/trunk/doc/maven.html
- Eclipse Plugin方式 http://www.eclemma.org/
4. jacoco原理
前面提到使用的是java代理
而java代理的原理,就是java编译之后,生成.class文件,真正运行的是这些字节码文件,而java代理,就是对这个字节码文件进行修改后运行(生成一个新的文件,一般以$Proxy开头)
这样jacoco就可以利用这个原理,进行文件插桩,运行结束后,即可记录代码运行的位置,然后生产覆盖率报告
JaCoCo同时支持on-the-fly和offline的两种插桩模式
- on-the-fly插桩:JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成
- Offline模式:在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。
重点说明一下Apache Maven方式使用
1. 环境准备
- 依赖
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</version>
</dependency>
- 插件
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
2. 特殊配置 - 指定和剔除目录
<configuration>
<!-- 指定覆盖目录 -->
<includes>
<include>com/**/*</include>
</includes>
<!-- 剔除覆盖目录 -->
<excludes>
<exclude>com/src/**/*</exclude>
</excludes>
</configuration>
3. 特殊配置 - 指定输出目录
<configuration>
<!-- 指定文件存储路径 -->
<dataFile>target/jacoco.exec</dataFile>
<outputDirectory>target/jacoco-temp</outputDirectory>
</configuration>
4. 特殊配置 - 覆盖规则
注:这个调试过,没有生效,有哪位大神知道使用方式,给我留言,谢谢?
<configuration>
<rules>
<rule implementation="org.jacoco.maven.RuleConfiguration">
<element>BUNDLE</element>
<limits>
<!-- 指定方法覆盖到80% -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>METHOD</counter>
<value>COVEREDRATIO</value>
<minimum>0.8</minimum>
</limit>
<!-- 指定指令覆盖到80% -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>INSTRUCTION</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum>
</limit>
<!-- 指定行覆盖到80% -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.8</minimum>
</limit>
<!-- 指定类覆盖到100%,不能遗失任何类 -->
<limit implementation="org.jacoco.report.check.Limit">
<counter>CLASS</counter>
<value>MISSEDCOUNT</value>
<maximum>0</maximum>
</limit>
</limits>
</rule>
</rules>
</configuration>
5. 启动
mvn clean install / mvn clean package
6. 覆盖率文件生成
7. 文件内容
单元测试未覆盖到和覆盖到到情况:
说明:
- 绿色:行覆盖充分
- 红色:未覆盖的行
- 黄色菱形:分支部分覆盖
- 绿色菱形:分支完全覆盖
附带一份测试代码:
百度云盘链接: https://pan.baidu.com/s/1Ho6ilpm1wEmCQDfhA9PN4w
提取码: stmf