# JAVA中检测代码覆盖率

author:周坤

createTime:2022-3-23

updateTime:

# 单元测试

  1. 在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>
    
  2. 然后编译时执行以下两条命令中的任意一条,在target目录下,会有一个site的文件夹及所有代码覆盖率情况,随着单元测试越充分,代码的覆盖率会升高,比如简单的函数调用,前后对比如下图

       mvn clean install
       mvn test jacoco:report
    

    img

    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");
        }
    
    }
    

    img

# 功能测试

  1. 虽然单元测试可以大体的知道测试代码的覆盖率情况,但并不那么全面,这样的话,就需要功能测试,如何得到功能测试的代码覆盖率,功能测试的代码覆盖率我们这里主要通过javaagent间接代理实现,然后通过apache-ant拉取部署服务的信息从而展示代码覆盖率。

  2. 部署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>
    
  3. 部署服务的脚本中,需要加上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
    
  4. 在服务上进行功能测试后,在本地执行两条命令成功后即可在/data/project/codeCoverage下得到代码覆盖率报告

    sh ant dump
    sh ant report
    
  5. 同时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>
    

    img

# 小结

  • 总体来说,结果是好的,但这种方式只适合java的代码,其它的暂时没有记录,后续再补充。