jacoco代码覆盖率工具
- 一、jacoco介绍
- 二、常见的java代码覆盖率工具
- 三、为什么选择jacoco
- 四、jacoco的特点
- 五、Jacoco 支持的覆盖率指标
- 六、那些暂未支持的覆盖率指标
- 七、jacoco技术原理
- 八、Jacoco 下载与配置
- 九、jacoco主要文件
- 十、jacoco使用流程
- 十一、jacoco单元测试实战
- 1、单元测试的代码覆盖率统计方法
- 2、maven项目进行单元测试
一、jacoco介绍
JaCoCo 是一个免费的Java 代码覆盖库,它是由EcIEmma 团队根据多年来使用和集成现有库的经验教训创建的。
二、常见的java代码覆盖率工具
- jacoco(单元、集成测试)
- emma(base on jacoco)
- cobertura(单元测试)
三、为什么选择jacoco
有几种可用的Java 开源覆盖技术。在实现Eclipse插件EclEmma 时,观察到它们都不是真正为集成而设计的。它们中的大多数专门适用于特定工具(Ant 任务、命令行、IDE插件),并且不提供允许嵌入不同上下文的文档化API。两个最好的和广泛使用的开源工具是EMMA和Cobertura。这两个工具都不再由原作者积极维护,也不支持当前的Java 版本。由于缺乏回归测试,维护和功能添加很困难
四、jacoco的特点
- 覆盖率分析指标丰富 Coverage analysis ofinstructions(CO),branches(C1),lines,methods, types and cyclomatic complexity.
- 可以不依赖源代码 Based on Java byte code
- 集成方式灵活 Simple integration
- 开发框架无关 Framework agnostic
- 兼容所有的 java 版本 Compatible with all released Java class file versions.
- java kotlin scala等多jvm语言支持 Support for different JVM languages.
- 多种报告格式 Several report formats(HTML,XML, CSV).
- 允许远程控制 Remote protocol andJMX
- 有独立的工具与 ant maven 的集成支持
五、Jacoco 支持的覆盖率指标
- 指令覆盖率 Instructions
- 分支覆盖率 Branches(重要)
- 圈复杂度覆盖率 CyclomaticComplexityV(G)Gant2p:度量路径是否覆盖
- 代码行覆盖率Lines (重要)
- 方法覆盖率 Methods
- 类覆盖率 Classes
六、那些暂未支持的覆盖率指标
- 条件覆盖率(Condition coverage)每一个逻辑表达式中的每一个条件(无法再分解的逻辑表达式)是否都有运行到成立及不成立的情形
- 条件/判断覆盖率(Condition/decision coverage)需同时满足判断覆盖率和条件覆盖率
- 修改条件/判断覆盖 modifed condition/decision coverage,简称 MC/DC影响判断结果的条件中,每个变量都出现至少二次,其中至少一次其值为真,至少一次其值为假
- 循环覆盖率(Loop coverage)所有循环是否都有运行过零次、一次及一次以上的测试
- 参数值覆盖率(Parameter Value Coverage)对于一个方法的所有参数,是否有运行过其中最常见的数值?
七、jacoco技术原理
主推on-the-fly
- offine插桩模式应用场景
- 不支持java agent; Runtime environments that do not support Java agents.(比如android)
- 不支持配置jvm 参数;Deployments where itis not possible to confgure JVM options.
- 字节码不兼容的平台;Bytecode needs to be converted for another VM like the AndroidDalvik VM.
- 与其他 agent 冲突;Conflicts with other agents that do dynamic classfle transformation
八、Jacoco 下载与配置
官网: jacoco.org/jacoco
JACOCO HOME设置环境变量,方便后续引用,你可以修改为你的jacoco本地地址
export JACOC0_HOME=/root/jacoco-0.8.9
九、jacoco主要文件
文件 | 用途 |
---|---|
lib/jacocoagent.jar | on the fly 运行时插桩用到的java agent |
lib/jacococli.jar | jacoco的命令行工具 |
十、jacoco使用流程
文档:https://www.jacoco.org/jacoco/trunk/doc/cli.html
- instruments
- instruments by on the fly 启动被测应用时添加java agent
- instruments by offline 直接对class文件进行插桩
- testcase 执行测试
- dump 导出覆盖率数据
- merge 覆盖率数据合并
- report生成报告
十一、jacoco单元测试实战
1、单元测试的代码覆盖率统计方法
- 通过构建工具插件集成 ant maven gradle
- 执行测试
- 生成报告
2、maven项目进行单元测试
- 官方文档:https://www.jacoco.org/jacoco/trunk/doc/maven.html
- 具体步骤:
- pom文件里安装插件,具体配置见下面
- clean清理
- pre agent配置agent
- test执行测试
- jacoco:report生成报告
- 这几个可以合成一个命令:
mvn clean test jacoco:report
- 这几个可以合成一个命令:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.13-SNAPSHOT</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>default-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>BUNDLE</element>
<limits>
<limit>
<counter>COMPLEXITY</counter>
<value>COVEREDRATIO</value>
<minimum>0.60</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
- 实战1,选择一个简单的项目:
git clone https://github.com/SonarSource/sonar-scanning-examples.git
cd sonar-scanning-examples/sonarqube-scanner-maven/maven-basic
mvn clean test jacoco:report
# 不依赖jacoco插件安装
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent test org.jacoco: jacoco-maven-plugin:report
open target/site/jacoco/index.html
把这个文件打开,长的如下:
点进去
- 实战2:选择个复杂的。步骤跟上面差不多,就是多添加了一点参数
cd $START SPRING IO HOME/start-site
mvn clean jacoco:prepare-agent test jacoco:report -Dmaven.gitcommitid.skip=true Dtest=JavaVersionProjectDescriptionCustomizerTests#java8IsMandqtoryMaven
open target/site/jacoco/index.html
#不依jacoco插件安装
# gitcommitid.skip=true 跳过commitid校验
# Dtest=JavaVersionProjectDescriptionCustomizerTests 只跑单个文件
mvn clean org.jacoco:jacoco-maven-plugin:LATEST:prepare-agent test org.jacoco:jacoco-maven-plugin:LATEST:report -Dmaven.gitcommitid.skip=true -Dtest=JavaVersionProjectDescriptionCustomizerTests#java8IsMandatoryMaven
open target/site/jacoco/index.html
看结果