自动化工具 Java 代码覆盖率调研报告

麦兜珊 · 2020年04月08日 · 最后由 jacky 回复于 2021年02月22日 · 5941 次阅读

jacoco 官网:https://jenkins.io/
jekins 官网:https://www.eclemma.org/jacoco/trunk/doc/

一、Demo 应用简介

1、涉及技术:

Springboot+maven+mybatis+mysql

2、提供的接口:


二、单元测试代码覆盖

1、jacoco 实现原理:

Offline 模式:
在测试前先对文件进行插桩,然后生成插过桩的 class 或 jar 包,测试插过桩的 class 和 jar 包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。

2、jacoco 运行方式:

针对 maven 项目,在 pom.xml 中添加依赖包,在编译时执行单元测试用例,最终的报告生成到 target 目录中

3、项目 pom.xml 配置:

<build>
   <plugins>
      <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <!--jacoco-->
 <plugin>
         <groupId>org.jacoco</groupId>
         <artifactId>jacoco-maven-plugin</artifactId>
         <version>0.8.2</version>
         <!--这里的execution ,每一个执行的goal,对应的id必须是唯一的-->
 <executions>
            <execution>
               <id>prepare-agent</id>
               <goals>
                  <goal>prepare-agent</goal>
               </goals>
            </execution>
            <execution>
               <id>report</id>
               <phase>prepare-package</phase>
               <goals>
                  <goal>report</goal>
               </goals>
            </execution>
            <execution>
               <id>post-unit-test</id>
               <phase>test</phase>
               <goals>
                  <goal>report</goal>
               </goals>
               <configuration>
                  <dataFile>target/jacoco.exec</dataFile>
                  <outputDirectory>target/jacoco-ut</outputDirectory>
               </configuration>
            </execution>
         </executions>
         <configuration>
            <systemPropertyVariables>
               <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
            </systemPropertyVariables>
         </configuration>
      </plugin>
   </plugins>
</build>

4、手动执行 jacoco 代码覆盖率报告:



5、与 Jekins jacoco plugin 插件集成:

job 名称:cssjacoco





三、实时代码覆盖率

1、jacoco 实现原理:

On-the-fly 插桩:
JVM 中通过-javaagent 参数指定特定的 jar 文件启动 Instrumentation 的代理程序,代理程序在通过 ClassLoader 装载一个 class 前判断是否转换修改 class 文件,将统计代码插入 class,测试覆盖率分析可以在 JVM 执行测试代码的过程中完成。

2、jacoco 运行方式:

jar 包方式启动:
java -javaagent:C:\Work\css\jacoco-0.8.2\lib\jacocoagent.jar=includes=,output=tcpserver,port=8086,address=  -jar css-0.0.1-SNAPSHOT.jar

镜像方式启动:
构建 docker 镜像:
在当前目录中新建 Dockerfile 文件,执行 docker build -t dockername:v1 .命令

执行完毕后查看是否镜像创建成功:docker images:

启动镜像:docker run -d -it -p 8089:8089 f2e3d36e34c4
http://221.122.129.111:8089/CRUD/ListUser

查询容器日志:docker logs -f 容器 id
查询启动的 docker 进程:docker ps -l
删除 docker 容器:docker rm 容器 id
删除 docker 镜像:docker rmi 镜像 id
导出容器:docker export 容器 id > 文件名.tar
进入 docker 内部:docker exec 4d70138f6755 /bin/sh
LInux 查询端口使用情况:netstat -anp|grep 8089

3、使用 ant 构建生成覆盖率报告:

jacocoant.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="JaCoCo" default="run" xmlns:jacoco="antlib:org.jacoco.ant">
    <!--Jacoco的安装路径-->
 <property name="jacocoAntPath" value="C:\Work\css\jacoco-0.8.2\lib/jacocoant.jar"/>
    <!--生成.exec文件的路径,Jacoco就是根据这个文件生成HTML报告的-->
 <property name="jacocoExecPath" value="C:\Work\css\jacocoresult\jacoco.exec"/>
    <!--生成覆盖率报告的路径-->
 <property name="jacocoReportPath" value="C:\Work\css\jacocoresult\jacocoReport"/>
    <!--远程服务的ip地址 -->
 <property name="server_ip" value="39.105.66.41"/>
    <!--前面javaagent配置的远程服务打开的端口,要跟上面配置的一样-->
 <property name="server_port_css" value="8086"/>
    <!--css项目源代码路径-->
 <property name="css_sourceaPath" value="C:\Work\css\css\src\main\java\"/>
    <!--css项目class文件路径-->
 <property name="css_classPath" value="C:\Work\css\css\target\classes\"/>
    <!--让ant知道去哪儿找Jacoco-->
 <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
        <classpath path="${jacocoAntPath}"/>
    </taskdef>
    <target name="run">
        <echo message="start..."/>
        <echo message="dump..."/>
        <antcall target="dump"/>
        <echo message="report..."/>
        <antcall target="report"/>
        <echo message="end..."/>
    </target>
    <!--dump任务:
 根据前面配置的ip地址,和端口号,访问目标服务,并生成.exec文件。
 reset=true时,会在dump出exec文件后,清空覆盖率数据;
 append=false时,dump出的exec文件会覆盖原有的exec文件;append=true时,dump出的exec文件
 追加至原有的exec文件;
 -->
 <target name="dump">
        <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoExecPath}/class_css.exec" port="${server_port_css}" append="true"/>
    </target>
    <!--jacoco任务:
 根据前面配置的源代码路径和.class文件路径,
 dump后生成的.exec文件,生成最终的html覆盖率报告。-->
 <target name="report">
        <jacoco:report>
            <executiondata>
                <file file = "C:\Work\css\jacocoresult\jacoco.exec\class_css.exec" />
            </executiondata>
            <structure name="JaCoCo Report">
                <!--group name 对应生成的报告中的列表名-->
 <group name="css_Demo">
                    <sourcefiles encoding="UTF-8">
                        <fileset dir="${css_sourceaPath}"/>
                    </sourcefiles>
                    <classfiles>
                        <fileset dir="${css_classPath}"/>
                    </classfiles>
                </group>
            </structure>
            <html destdir="${jacocoReportPath}" encoding="utf-8"/>
            <csv destfile="${jacocoReportPath}/report.csv"/>
            <xml destfile="${jacocoReportPath}/report.xml"/>
        </jacoco:report>
    </target>
</project>

执行 ant -f jacocoant.xml 生成代码覆盖率报告:

###4、与 Jekins jacoco plugin 插件集成:

环境配置:

Job 名称:jacoco_report





###5、不同使用场景下的设置
ant dump 任务属性:




共收到 4 条回复 时间 点赞

楼主这个更像是 jacoco 搭建教程?

先赞后看 支持一下
我也是用 java 做测试

simple 回复

就是一个简单的介绍,jacoco 有哪几种使用方式,怎么用

代码改动后重新部署,覆盖率会被清零,有没有解决方案?谢谢😂 😂 😂 😂

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册