您的位置:首页 > 其它

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

2017-09-20 17:19 525 查看
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

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

完整的命令:

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文件生成代码覆盖率报告
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐