我們通常通過接口自動化來進行上線前驗證,保障當前迭代的改動不影響原有接口的正常運行,這就需要接口的覆蓋率較高,才能起到重要的價值。通過jacoco進行覆蓋率統計,可以清晰地統計出接口覆蓋率情況,並且能夠根據覆蓋的代碼情況進一步完善接口自動化。話不多說,接下來我們就來看下如何用jacoco進行接口覆蓋率統計。
1、首先需要在需要統計的服務對應的機器上安裝jacoco和ant
下載jacoco和ant壓縮包:
ant直接解壓,解壓後,會自動生成一個ant的文件夾;
jacoco需要自己先新建一個文件夾,然後把壓縮包放進去解壓。
然後將ant加入環境變量:
vim ~/.bashrc
然後執行命令:
source ~/.bashrc
即時生效。
然後運行ant -v
表明安裝成功。
2、在服務的tomcat啓動項上增加如下配置:
-javaagent:/xxxx/jacoco/lib/jacocoagent.jar=includes=com.xxx.*,output=tcpserver,port=8125,address=127.0.0.1
其中,端口可隨意指定,只要不跟其他端口衝突即可,如果是本機,ip須是127.0.0.1
然後重啓服務,會自動監聽本機的port端口
3、在服務器上增加build.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project name="JaCoCo" default="run" xmlns:jacoco="antlib:org.jacoco.ant">
<!--Jacoco的安裝路徑-->
<property name="jacocoAntPath" value="/home/用戶/xxx/tools/jacoco/lib/jacocoant.jar"/>
<!--最終生成.exec文件的路徑,Jacoco就是根據這個文件生成最終的報告的-->
<property name="jacocoExecPath" value="/home/用戶/xxx/codeCoverage/study/jacocoExec"/>
<!--生成覆蓋率報告的路徑-->
<property name="jacocoReportPath" value="/home/用戶/xxx/codeCoverage/study/report"/>
<!--遠程tomcat服務的ip地址 xxx.xx.xxx.163(172.16.1.31)-->
<property name="server_ip" value="127.0.0.1"/>
<!--前面配置的遠程tomcat服務打開的端口,要跟上面配置的一樣-->
<property name="server_port" value="8125"/>
<!--源代碼路徑-->
<property name="srcPath" value="/home/用戶/sourceSrc/xxx/src/main/java"/>
<!--service.class文件路徑-->
<property name="classesPath" value="/home/用戶/xxx/instance1/approot/testhf/BOOT-INF/classes"/>
<!--讓ant知道去哪兒找Jacoco-->
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${jacocoAntPath}"/>
</taskdef>
<target name="run">
<echo message="start..."/>
<echo message="dump..."/>
<antcall target="dump"/>
<echo message="merge..."/>
<antcall target="merge"/>
<echo message="report..."/>
<antcall target="report"/>
<echo message="end..."/>
</target>
<!--dump任務:
根據前面配置的ip地址,和端口號,訪問目標tomcat服務,並生成.exec文件。-->
<target name="dump">
<jacoco:dump address="${server_ip}" reset="true" destfile="${jacocoExecPath}/study_jacoco.exec" port="${server_port}" append="false"/>
</target>
<target name="merge">
<jacoco:merge destfile="${jacocoExecPath}/merged.exec">
<fileset dir="${jacocoExecPath}" includes="*.exec"/>
</jacoco:merge>
</target>
<!--jacoco任務:
根據前面配置的源代碼路徑和.class文件路徑,
根據dump後,生成的.exec文件,生成最終的html覆蓋率報告。-->
<target name="report">
<jacoco:report>
<executiondata>
<file file="${jacocoExecPath}/merged.exec"/>
</executiondata>
<structure name="JaCoCo Report">
<group name="xxxx coverage">
<sourcefiles encoding="UTF-8">
<fileset dir="${srcPath}"/>
</sourcefiles>
<classfiles>
<fileset dir="${classesPath}/com/netease/edu"/>
</classfiles>
</group>
</structure>
<html destdir="${jacocoReportPath}" encoding="utf-8"/>
<csv destfile="${jacocoReportPath}/report.csv"/>
<xml destfile="${jacocoReportPath}/report.xml"/>
</jacoco:report>
</target>
</project>
其中,上面的port必須和tomcat啓動項中的端口保持一致。
然後執行ant -f build.xml即可生成報告。
4、持續集成
多個服務可能在多臺服務器上,在同一個服務器上時,注意端口不要衝突,在多個服務器上,每次都去服務器上執行不方便,可在jenkins持續集成機器上編寫腳本,通過remotessh的方式進入各個機器執行腳本並拷貝報告到job機器上,展示覆蓋率結果。
此處拷貝report文件夾,需要將目標路徑文件夾的權限爲777纔行,否則會拷貝失敗~
5、覆蓋率報告如下:
進入代碼中可看到哪些語句被覆蓋了,哪些還未被覆蓋,然後作爲依據補充接口自動化用例。