# JAVA中检测代码覆盖率
author:周坤
createTime:2022-3-23
updateTime:
# 单元测试
在pom.xml的文件中需要引入以下配置
<build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <executions> <execution> <goals> <goal>prepare-agent</goal> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
然后编译时执行以下两条命令中的任意一条,在target目录下,会有一个site的文件夹及所有代码覆盖率情况,随着单元测试越充分,代码的覆盖率会升高,比如简单的函数调用,前后对比如下图
mvn clean install mvn test jacoco:report
package com.example.demo; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class DemoApplicationTests { @Test void contextLoads() { HelloWord.printName("hello word"); } }
# 功能测试
虽然单元测试可以大体的知道测试代码的覆盖率情况,但并不那么全面,这样的话,就需要功能测试,如何得到功能测试的代码覆盖率,功能测试的代码覆盖率我们这里主要通过javaagent间接代理实现,然后通过apache-ant拉取部署服务的信息从而展示代码覆盖率。
部署jar包服务上需要安装jacoco ,而保存代码覆盖率的服务上则需要安装apache-ant并配置环境变量及在bin目录下添加build.xml文件的配置,如何安装我这里就不过多的介绍了,jacoco下载地址,apache-ant下载,以下是build.xml的配置参数。
<?xml version="1.0" encoding="UTF-8"?> <project name="plate_id_sample_service" xmlns:jacoco="antlib:org.jacoco.ant"> <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml"> <!-- 保存服务的jacoco路径信息--> <classpath path="/opt/tools/jacoco-0.8.7/lib/jacocoant.jar"/> </taskdef> <target name="dump"> <!-- address和port和部署jar包服务设置保持一致,destfile设置jacoco.exec保存地址 --> <jacoco:dump address="192.168.7.177" reset="true" port="8090" destfile="/opt/codeCoverage/jacoco/jacoco.exec"/> </target> <target name="report"> <jacoco:report> <executiondata> <file file="/opt/codeCoverage/jacoco/jacoco.exec"/> </executiondata> <structure name="Project"> <!-- 存放报告的具体文件夹 --> <group name="report"> <classfiles> <!--.class文件路径,可以放在客户端--> <fileset dir="/data/project/target/classes"/> </classfiles> <sourcefiles encoding="gbk"> <!--源代码路径,可以放在客户端--> <fileset dir="/data/project/src/main/java" /> </sourcefiles> </group> </structure> <!-- report文件保存地址 --> <html destdir="/data/project/codeCoverage"/> </jacoco:report> </target> </project>
部署服务的脚本中,需要加上javaagent相关的信息,java ... -jar区间的信息是需要加的,例如
/java/jdk1.8.0_141/bin/java -javaagent:/data/tools/jacoco-0.8.7/lib/jacocoagent.jar=includes=*,out put=tcpserver,port=8069,address=192.168.1.1 -jar project-version.jar
在服务上进行功能测试后,在本地执行两条命令成功后即可在/data/project/codeCoverage下得到代码覆盖率报告
sh ant dump sh ant report
同时jacoco + sonarqube 可以将单元测试代码覆盖率传到sonarqube服务上,sonarqube的安装这里也不介绍了,但sonarqube版本不一样,所使用的jdk版本也有所不同,这点需要注意,在代码中执行mvn clean verify sonar:sonar 前提是配置了sonarqube的地址信息
<properties> <!--手动生成的token地址--> <sonar.login>8a5732d8624e4f2ddab9e484a710874d4b999777</sonar.login> <!--sonarqube访问地址--> <sonar.host.url>http://192.168.1.1:9000</sonar.host.url> </properties>
# 小结
- 总体来说,结果是好的,但这种方式只适合java的代码,其它的暂时没有记录,后续再补充。