一、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.jaron the fly 运行时插桩用到的java agent
lib/jacococli.jarjacoco的命令行工具

十、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

在这里插入图片描述
看结果
在这里插入图片描述

  • 如果在执行过程中想卡分支覆盖率指标,可以在execution中找到check进行相关配置,类似sonarqube的quality gates
    在这里插入图片描述

十二、jacoco集成测试实战

1、集成测试覆盖率统计流程
  • instruments插桩并启动
  • test执行测试,手工测试,自动化测试
  • dump导出覆盖率数据
  • merge覆盖率数据合并
  • report生成报告
2、案例演示
1、演练环境
#请使用Java 17运行
git clone https://github.com/spring-io/start.spring.io.git
cd staft.spring.io#设置一个变量,保存起来方便后续引用
export START_SPRING_IO_HOME=$PWD
./mvnw clean package -Dmaven.gitcommitid.skip=true -Dmaven.test.skip=true
#启动被测应用
java -jar $START_SPRING_IO_HOME/start-site/target/start-site-exec.jar
2、配置环境变量
vim /etc/profile
#修改为你的本地对应地址,每个人可能不同
export JACOCO_HOME=$HOME/ke/shift_left/jacoco-0.8.6
export START_SPRING_IO_HOME=$HOME/ke/shift_left/start.spring.io
3、运行时插桩
java -javaagent:$JACOCO_HOME/lib/jacocoagent.jar=output=tcpserver 
-jar $START_SPRING_IO_HOME/start-site/target/start-site-exec.jar
4、on-the-fly 运行时插桩的多种模式
#本地文件模式
java -javaagent:$JACOCO_HOME/lib/jacocoagent.jar-jar $START_SPRING_IO_HOME/start-site/target/start-site-exec.jar
#tcxserver模式 默认6300端
java-javaagent:$JACOCO_HOME/lib/jacocoagent,jar=output=tcpserver -jar $START_SPRING_IO_HOME/start-site/target/start-site-exec.jar
5、dump导出覆盖率数据
#删除之前的exec文件,不然会自动合并以前的结果
rm jacoco_tcpserver.exec
java -jar $JACOCO_HOME/lib/jacococli.jar \
dump \
--address 127.0.0.1--port 6300 \
--reset \
--destfile jacoco_tcpserver.exec
6、report生成覆盖率报告
#生成无源代码的报告
java -jar $JACOCO_HOME/lib/jacococli.jar \
report jacoco tcpserver.exec \
--html jacoco_html \
--classfiles $START_SPRING_IO_HOME/start-site/target/classes/ 

java -jar $JACOCO_HOME/lib/jacococli.jar \
report jacoco_tcpserver.exec \
--html jacoco_html \
--classfiles $START_SPRING_IO_HOME/start-site/target/start-site-exec.jar \
--classfiles $START_SPRING_IO_HOME/start-site/target/start-site.jar

#生成有源代码的报告
java -jar $JACOCO_HOME/lib/jacococli.jar \
report jacoco_tcpserver.exec \
--html jacoco_html \
--classfiles $START_SPRING_IO_HOME/start-site/target/lasses/ \
--sourcefiles $START_SPRING_IO_HOME/start-site/src/main/java/

有源码的点进去可以看到代码覆盖率
**加粗样式**

掌握了如何获取集成测试覆盖率后,我们就可以根据覆盖率数据与未覆盖代码,来针对性的改进我们的手工测试与自动化测试了。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐