JaCoCo关于on-the-fly模式的使用记录

来源:互联网 发布:陈浩筹码分布源码公式 编辑:程序博客网 时间:2024/05/16 07:55
on-the-fly插桩:

JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。(摘取自https://testerhome.com/topics/5329)

首先我们需要两个jar包。jacocoagent和jacocoant。所有关于jacoco的包都可以去http://www.jacoco.org/jacoco/下载

jacocoagent:运行时启动tcp服务监控代码覆盖,dump出覆盖率数据
jacocoant:jacoco的任务是ant驱动的。所以这个包用来执行jacoco的任务,向tcp服务发送请求,如ant dump命令生成exec文件。

接着就是插桩了,我这里是一个单独的jar包,所以直接在原来启动jar的命令中增加:

-javaagent:/home/test/JaCoCo/jacocoagent.jar=output=tcpserver,port=8893,address=本机IP

  1. output:输出覆盖率数据的方式,tcpserver的意思就是开启一个tcp服务,动态监控覆盖率数据。用这种方式可以不停止服务就能动态dump覆盖率数据。否则就需要kill掉服务才能统计覆盖率了
  2. port:tcp服务的端口号
  3. address:tcp服务的ip地址,一般是本机地址(摘取自https://testerhome.com/topics/5329

完整的命令:

nohup $JAVA_HOME/bin/java-javaagent:/home/test/JaCoCo/jacocoagent.jar=output=tcpserver,port=8893,address=本机IP -jar xxx.jar --spring.cloud.config.profile=test --server.port=9401 --spring.application.index=0 &

插桩之后,再跑一下测试场景,就可以试试生成exec文件了

先下载ant了,在centos下面,直接yum install -y ant即可,安装完后,直接ant -version看成功了没

接着要生成build.xml文件,执行ant命令时,要确保build.xml文件再同一个路径下,ant相关的知识可以百度一下

下面是build.xml的具体内容:

<?xml version="1.0" ?>
<project name="Lengyu" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
  <!--Jacoco的安装路径-->
  <property name="jacocoantPath" value="/home/test/JaCoCo/jacocoant.jar"/>
  <!--最终生成.exec文件的路径,里面有覆盖率数据,Jacoco就是根据这个文件生成最终的报告的-->
  <property name="jacocoexecPath" value="/home/test/JaCoCo/jacoco.exec"/>
    <!--生成覆盖率报告的路径-->
  <property name="reportfolderPath" value="/home/test/JaCoCo/coverage/"/>
  <!--服务的ip地址-->
  <property name="server_ip" value="127.0.0.1"/>
  <!--前面配置的服务打开的端口,要跟jacocoagent一样-->
  <property name="server_port" value="8893"/>
  <!--源代码路径-->
  <property name="coreSrcpath" value="/home/test/source_code/subscribe-service/core/src/main/java" />
  <property name="commonSrcpath" value="/home/test/source_code/subscribe-service/common/src/main/java" />
  <property name="apiSrcpath" value="/home/test/source_code/subscribe-service/api/src/main/java" />
  <!--.class文件路径-->
  <property name="checkOrderClasspath" value="/home/test/source_code/subscribe-class/BOOT-INF/classes" />
  <!--让ant知道去哪儿找Jacoco-->
  <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
      <classpath path="${jacocoantPath}" />
  </taskdef>
  <!--dump任务:
      根据前面配置的ip地址,和端口号,
      访问目标tomcat服务,并生成.exec文件。-->
  <target name="dump">
      <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
  </target>


  <!--jacoco任务:
      根据前面配置的源代码路径和.class文件路径,
      根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
  <target name="report">
      <delete dir="${reportfolderPath}" />
      <mkdir dir="${reportfolderPath}" />


      <jacoco:report>
          <executiondata>
              <file file="${jacocoexecPath}" />
          </executiondata>


          <structure name="JaCoCo Report">
              <group name="Check Order related">
                  <classfiles>
                      <fileset dir="${checkOrderClasspath}" />
                  </classfiles>
                  <sourcefiles encoding="utf-8">
                      <fileset dir="${coreSrcpath}" />
                      <fileset dir="${commonSrcpath}" />
                      <fileset dir="${apiSrcpath}" />
                  </sourcefiles>
              </group>
          </structure>

注意上面的源码路径和.class文件路径都是可以有多个的,对应着<classfiles>和<sourcefiles>中的配置,曾经遇到过在report中有显示相关的类和方法但没有源码,是因为源码的路径不对,程序不会自己一级级去找对应的java文件,以这里为例就要指向到scr/main/java下面。

build.xml文件创建之后,使用命令ant dump生成exec文件(要确保jacocoagent服务是开启的),里面包括了代码覆盖的信息,接着直接ant report,根据exec文件生成代码覆盖率报告




原创粉丝点击