場景需求
由于項目的需要,當(dāng)前我們開發(fā)的服務(wù)端代碼和接口以及集成測試代碼不是寫在同一個項目下喧笔,當(dāng)測接口時胸墙,我們發(fā)送一個http request請求到Linux服務(wù)端撩嚼,然后服務(wù)端返回一個response祖驱,這樣的情況如何做代碼覆蓋率統(tǒng)計握恳?
前提條件
- 安裝ant,并且設(shè)置環(huán)境變量
- 下載jacoco的jar包 點擊下載
服務(wù)端設(shè)置(Linux)
現(xiàn)在的springboot應(yīng)用非常多捺僻,其本身自帶tomcat乡洼,網(wǎng)上很多都是說修改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應(yīng)用使用如下方式運行:
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,默認(rèn)是file束昵。使用file的方式只有在停掉應(yīng)用服務(wù)的時候才能產(chǎn)生覆蓋率文件拔稳,而使用tcpserver的方式可以在不停止應(yīng)用服務(wù)的情況下下載覆蓋率文件
客戶端設(shè)置(Windows)
在客戶端運行ant dump之前,這時可以對服務(wù)端進(jìn)行接口以及功能測試妻怎,這時所有的調(diào)服務(wù)端接口操作都會記錄代碼覆蓋率壳炎。
結(jié)合Jenkins生成report
在目錄D:\test-resourse\
下新建一個文件夾trap
泞歉,trap
文件夾下新建一個build.xml
文件逼侦,文件內(nèi)容如下:
<?xml version="1.0" ?>
<project name="Jacoco" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
//此處的value里面的路徑,對應(yīng)上面下載的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對應(yīng)
<jacoco:dump address="30.11.227.26" port="8044" reset="true" destfile="${integrationJacocoexecPath}" append="false"/>
</target>
</project>
接著在build.xml
文件目錄下運行ant dump
命令就會在當(dāng)前目錄下出現(xiàn)一個.exec
后綴名結(jié)尾的文件榛丢,出現(xiàn)如下圖所示的代表運行成功
本地生成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就是根據(jù)這個文件生成最終的報告的-->
<property name="jacocoexecPath" value="[yourPath/]jacoco.exec"/>
<!--生成覆蓋率報告的路徑-->
<property name="reportfolderPath" value="[storageReportPath]"/>
<!--遠(yuǎn)程Tomcat服務(wù)的ip地址-->
<property name="server_ip" value="100.44.44.144"/>
<!--前面配置的遠(yuǎn)程Tomcat服務(wù)打開的端口晰赞,要跟上面配置的一樣-->
<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任務(wù):
根據(jù)前面配置的ip地址,和端口號选侨,
訪問目標(biāo)Tomcat服務(wù)掖鱼,并生成.exec文件。-->
<target name="dump">
<jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
</target>
<!--jacoco任務(wù):
根據(jù)前面配置的源代碼路徑和.class文件路徑援制,
根據(jù)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
目錄下運行如下命令
//先執(zhí)行
ant dump
//再執(zhí)行
ant report
這時會在build.xml
配置文件reportfolderPath
屬性配置的路徑下生成幾個文件褐墅,其中有一個index.html
文件,將其打開就是覆蓋率報告