背景
Jacoco是主流的統(tǒng)計(jì)覆蓋率的工具。下面以java語言為例,展示從0開始,獲取代碼覆蓋率的過程。
展示平臺
Jenkins
其他:雖然jacoco本身也支持生成xml或者h(yuǎn)tml等多種形式的覆蓋率報告,但是都沒有jenkins用起來簡單順手,用戶界面友好
操作步驟
術(shù)語定義
- 服務(wù)器:被測服務(wù)所在機(jī)器
- 客戶端:跑完測試用例后,用來獲取覆蓋率的工具機(jī)器。一般就是jenkins的slave機(jī)器。如果slave機(jī)器無法直接連接到服務(wù)器,該怎么辦呢?后面有詳細(xì)介紹
安裝jacoco,啟動服務(wù)端
下載地址:https://www.jacoco.org/jacoco/index.html
按照對應(yīng)系統(tǒng)下載到壓縮包后,解壓后,放到服務(wù)器所在一個路徑例如/work/admin/test-qa-lib,在JVM啟動參數(shù)中增加如下,其中6300表示服務(wù)器上要開的監(jiān)聽端口,用于后續(xù)jacoco客戶端發(fā)出請求,請求服務(wù)中累積的覆蓋率數(shù)據(jù)。
-javaagent:/work/admin/test-qa-lib/jacoco/lib/jacocoagent.jar=includes=,output=tcpserver,address=,port=6300,append=false
例如一個完整的服務(wù)啟動腳本類似:
JACOCO_ARGS="-javaagent:/work/admin/test-qa-lib/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,address=*,port=6300,append=false"
JAVA_OPTS="$JAVA_OPTS $JACOCO_ARGS"
nohup java $JAVA_OPTS -server -jar XX你的服務(wù)jar包XX.jar &
客戶端上安裝也要安裝jacoco
記錄下安裝地址,暫時不用
客戶端上安裝ant,用來組織對jacoco的客戶端調(diào)用
下載地址 https://ant.apache.org/bindownload.cgi
wget https://mirror.bit.edu.cn/apache//ant/binaries/apache-ant-1.9.14-bin.zip
unzip apache-ant-1.9.14-bin.zip
mv apache-ant-1.9.14 ant
ln -s /home/admin/ant/ant/bin/ant /home/admin/bin/
在客戶端機(jī)器上準(zhǔn)備好build.xml,其中的絕對路徑是客戶端機(jī)器上jacoco的所在路徑
<?xml version="1.0" encoding="UTF-8"?>
<project name="coverage_service" xmlns:jacoco="antlib:org.jacoco.ant">
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="絕對路徑/jacoco-0.8.6/lib/jacocoant.jar"/>
</taskdef>
<target name="run">
<antcall target="dump"/>
<antcall target="merge"/>
</target>
<target name="dump">
<jacoco:dump address="服務(wù)所在機(jī)器的IP" reset="true" port="6300" destfile="./jacoco_0.exec" append="false"/>
</target>
<target name="merge">
<jacoco:merge destfile="./merged.exec">
<fileset dir="./" includes="*.exec"/>
</jacoco:merge>
</target>
</project>
配置jenkins
在jenkins的執(zhí)行腳本中填入
ant dump #dump數(shù)據(jù)后,達(dá)到清空歷史數(shù)據(jù)的目的。當(dāng)被測環(huán)境和其他人共用時,為了避免其他人的行為產(chǎn)生更多覆蓋數(shù)據(jù),必須加上清空的操作
mvn test
ant run
當(dāng)客戶端無法訪問到服務(wù)器時(可選,如果你的jenkins機(jī)器,能夠直接連接上服務(wù)所在機(jī)器的6300端口,可以跳過這一節(jié))
一般,所謂的客戶端就是jenkins機(jī)器。如果兩者不通時,還想用jenkins的代碼覆蓋率自動展示頁面的功能,可以采取如下方法
實(shí)質(zhì)執(zhí)行的時候,由于網(wǎng)絡(luò)不通,采取自動執(zhí)行用例,手動拷貝覆蓋率exec文件,自動展示的方式
- step1
Jenkins自動執(zhí)行用例 mvn test - step2
手動拷貝覆蓋率文件。將build.xml和手動腳本放在和服務(wù)所在的統(tǒng)一臺機(jī)器上(解決網(wǎng)絡(luò)問題),腳本的操作過程是執(zhí)行ant dump/ant merge/將目標(biāo)的class打包出來,最終生成我們所需的2個文件即merged.exec和estate-class.zip - step3 在jenkins上的腳本配置框里填入
cp /home/admin/merged.exec ./
cp /home/admin/service-class.zip ./
unzip -o service-class.zip -d classes - step4 將第二步step2里的merge.exec和estate-class.zip拷貝到j(luò)enkins的slave機(jī)器上,再啟動jenkins的任務(wù)即可。最后的效果,就是在jenkins上能夠基于jacoco插件看到覆蓋率的統(tǒng)計(jì)結(jié)果
測試報告分析
一般都會使用行覆蓋率來衡量測試用例的覆蓋程度。M代表Miss,是指沒有覆蓋到的部分, C代表Catch,代表已經(jīng)覆蓋的部分