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文件生成代码覆盖率报告
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文件生成代码覆盖率报告
相关文章推荐
- [k8s]k8s 1.9(on the fly搭建) 1.9_cni-flannel部署排错 ipvs模式
- WPF中的MVVM模式:How to render dynamic controls on the fly in MvvM pattern
- [k8s]debug模式启动集群&k8s常见报错集合(on the fly)
- 关于视觉跟踪中评价标准的相关记录(The Evaluation of Visual Tracking Results on OTB-100 Dataset)
- 做一只墙上的苍蝇(a fly on the wall)
- 关于MFC单选框的使用临时记录,稍后编辑
- 困兽之斗!使用JavaScript执行客户端的exe文件(excute the .exe file on client-side machine by JavaScript)
- 关于在普通宽带路由器下设定FTP服务器使用被动模式传输
- 关于数据库中使用 left join on ...and ...和 left join on ....where ...区别,和使用group by 要注意的情况
- Create Snazzy Web Charts and Graphics On the Fly with the .NET Framework
- 关于:“无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。”的问题
- 关于-NHibernate使用Criteria分页显示并返回记录总数
- 关于-NHibernate使用Criteria分页显示并返回记录总数
- 关于GTK theme engine的使用和GTK风格介绍
- On-the-fly Encryption with TrueCrypt --快速加密
- 关于数据集使用的问题记录
- 装饰者模式---使用装饰者模式实现带日志记录功能的数据库命令执行类
- 一个关于指针+记录数据类型的使用技巧
- [错误记录]关于指针传递获得数据使用错误问题....
- How to Create Text Image on the fly with ASP.NET