场景需求
由于项目的需要,当前我们开发的服务端代码和接口以及集成测试代码不是写在同一个项目下,当测接口时,我们发送一个http request请求到Linux服务端,然后服务端返回一个response,这样的情况如何做代码覆盖率统计?
前提条件
- 安装ant,并且设置环境变量
- 下载jacoco的jar包 点击下载
服务端设置(Linux)
现在的springboot应用非常多,其本身自带tomcat,网上很多都是说修改tomcat的Catalina.sh文件来使用javaagent:
JAVA_OPTS="-javaagent:[yourPath/]jacocoagent.jar=includes=com.didispace.*,output=tcpserver,port=8044,address=30.11.227.26 -Xverify:none"
针对springboot应用使用如下方式运行:
java -javaagent:D:/tools/jacoco-0.7.9/lib/jacocoagent.jar=includes=com.didispace.*,output=tcpserver,port=8044,address=30.11.227.26 -jar Chapter1-1.0.0.jar
output有4个值,分别是file,tcpserver,tcpclient,mbean,默认是file。使用file的方式只有在停掉应用服务的时候才能产生覆盖率文件,而使用tcpserver的方式可以在不停止应用服务的情况下下载覆盖率文件
客户端设置(Windows)
在客户端运行ant dump之前,这时可以对服务端进行接口以及功能测试,这时所有的调服务端接口操作都会记录代码覆盖率。
结合Jenkins生成report
在目录D:\test-resourse\
下新建一个文件夹trap
,trap
文件夹下新建一个build.xml
文件,文件内容如下:
<?xml version="1.0" ?>
<project name="Jacoco" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
//此处的value里面的路径,对应上面下载的jar文件路径
<property name="jacocoantPath" value="D:/tools/jacoco-0.7.9/lib/jacocoant.jar"/>
<property name="integrationJacocoexecPath" value="./jacoco-integration.exec"/>
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${jacocoantPath}" />
</taskdef>
<target name="dump">
//此处的address地址即为程序/tomcat所在的linux机器地址,host与上文命令行host对应
<jacoco:dump address="30.11.227.26" port="8044" reset="true" destfile="${integrationJacocoexecPath}" append="false"/>
</target>
</project>
接着在build.xml
文件目录下运行ant dump
命令就会在当前目录下出现一个.exec
后缀名结尾的文件,出现如下图所示的代表运行成功
本地生成report
在trap
文件夹下新建一个localReport
文件夹,localReport
文件夹下新建一个build.xml
文件
<?xml version="1.0" ?>
<project name="jacoco" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
<!--Jacoco的安装路径-->
<property name="jacocoantPath" value="[yourPath/]jacocoant.jar"/>
<!--最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的-->
<property name="jacocoexecPath" value="[yourPath/]jacoco.exec"/>
<!--生成覆盖率报告的路径-->
<property name="reportfolderPath" value="[storageReportPath]"/>
<!--远程Tomcat服务的ip地址-->
<property name="server_ip" value="100.44.44.144"/>
<!--前面配置的远程Tomcat服务打开的端口,要跟上面配置的一样-->
<property name="server_port" value="8044"/>
<!--本地源代码路径-->
<property name="checkOrderSrcpath" value="[Srcpath]" />
<!--本地.class文件路径-->
<property name="checkOrderClasspath" value="[classPath]" />
<!--让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="gbk">
<fileset dir="${checkOrderSrcpath}" />
</sourcefiles>
</group>
</structure>
<html destdir="${reportfolderPath}" encoding="utf-8" />
</jacoco:report>
</target>
</project>
在刚才新建的build.xml
目录下运行如下命令
//先执行
ant dump
//再执行
ant report
这时会在build.xml
配置文件reportfolderPath
属性配置的路径下生成几个文件,其中有一个index.html
文件,将其打开就是覆盖率报告
网友评论