1. JaCoCo是一個(gè)開(kāi)源的覆蓋率工具,它針對(duì)的開(kāi)發(fā)語(yǔ)言是Java丐箩,使用方法靈活摇邦,可以嵌入到Ant,Maven中屎勘,也可作為Eclipse施籍,Idea的插件,可以使用其JavaAgent技術(shù)監(jiān)控Java程序等概漱。
2. JaCoCo包含了多種尺度的覆蓋率計(jì)數(shù)器丑慎,包含指令級(jí)覆蓋,分支覆蓋瓤摧,圈復(fù)雜度竿裂,行覆蓋,方法覆蓋照弥,類覆蓋腻异。
3. 注入方式
1) Jacoco在字節(jié)碼注入時(shí)使用的是ASM技術(shù)修改字節(jié)碼方法,可以修改.jar文件这揣,.class文件字節(jié)碼文件
2) Jacoco同時(shí)支持on-the-fly和offline兩種插樁方式
3) On-the-fly插裝:
JVM通過(guò)-javaagent參數(shù)指定特定的jar文件啟動(dòng)instrumentation的代理程序悔常,代理程序通過(guò)class loader裝載一個(gè)class前判斷是否轉(zhuǎn)換修改class文件,將統(tǒng)計(jì)代碼插入class给赞,測(cè)試覆蓋率分析可在JVM執(zhí)行測(cè)試代碼的過(guò)程中完成
4) Offline:
在測(cè)試前先對(duì)文件進(jìn)行插樁机打,然后生成插過(guò)樁的class或jar包,測(cè)試插過(guò)樁的class和jar包后塞俱,會(huì)生成動(dòng)態(tài)覆蓋信息到文件姐帚,最后統(tǒng)一對(duì)覆蓋信息進(jìn)行處理,并生成報(bào)告
4. 一些情況下不支持on-the-fly障涯,需要使用offline提前對(duì)字節(jié)碼進(jìn)行插樁:
a) 運(yùn)行環(huán)境不支持Java agent
b) 部署環(huán)境不允許設(shè)置JVM參數(shù)
c) 字節(jié)碼需要被轉(zhuǎn)換成其他的虛擬機(jī)如Android Dalvik VM
d) 動(dòng)態(tài)修改字節(jié)碼過(guò)程中和其他agent沖突
e) 無(wú)法自定義用戶加載
5. 官網(wǎng)地址
一罐旗、 部署
1. 下載Jacoco,網(wǎng)址:https://www.eclemma.org/jacoco/
2. Jacoco以壓縮包的形式傳到服務(wù)器然后解壓唯蝶,jacoco從網(wǎng)站上下載下來(lái)是zip格式九秀,通過(guò)unzip 包名.zip進(jìn)行解壓
3. 解壓后,打開(kāi)文件夾粘我,里面有如下的文件
4. lib文件下是.jar鼓蜒,其中會(huì)用到的是jacocoagent.jar痹换,jacococli.jar
5. 在啟動(dòng)jar的時(shí)候使用-javaagent作為一個(gè)選項(xiàng)來(lái)啟動(dòng)程序
-
當(dāng)項(xiàng)目使用Tomcat的時(shí)候,在Tomcat下有一個(gè)bin文件夾都弹,下面有Catalina.sh文件可以來(lái)使用-Javaagent娇豫,通過(guò)vim Catalina.sh來(lái)打開(kāi)該文件,點(diǎn)擊i(英文鍵盤下)進(jìn)入編輯模式畅厢,加上如下圖所示的JAVA_OPTS(JVM運(yùn)行參數(shù)的變量)冯痢,-javaagent參數(shù)接受的參數(shù)和參數(shù)的含義詳解:https://www.eclemma.org/jacoco/trunk/doc/agent.html
a) –Javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]
option:支持的參數(shù),如includes
value:賦予參數(shù)的值
b) includes:應(yīng)包含在執(zhí)行分析中的類名列表框杜。列表?xiàng)l目由冒號(hào)(:)隔開(kāi)浦楣,可以使用通配符(和?)。(所有課程)
c) output:用于寫(xiě)入覆蓋數(shù)據(jù)的輸出方法咪辱,有4個(gè)選項(xiàng)file振劳,tcpserver,tcpclient和none,默認(rèn)是file油狂。file:在VM終止時(shí)历恐,執(zhí)行數(shù)據(jù)將寫(xiě)入destfile屬性中指定的文件;tcpserver:代理偵聽(tīng)由address和port屬性指定的TCP端口上的傳入連接选调,執(zhí)行數(shù)據(jù)寫(xiě)入此TCP連接夹供;tcpclient:?jiǎn)?dòng)時(shí),代理連接到address和port屬性指定的TCP端口仁堪,執(zhí)行數(shù)據(jù)被寫(xiě)入TCP連接哮洽;none:不要任何輸出。
d) address:IP地址弦聂,是服務(wù)器的IP地址鸟辅,如果是在此服務(wù)器上執(zhí)行dump,report操作就寫(xiě)127.0.0.1莺葫,默認(rèn)也是127.0.0.1
e) port:端口匪凉,默認(rèn)是6300。如果在本機(jī)使用端口不被占用(>1024)就可以捺檬;如果是別的機(jī)器訪問(wèn)需要是開(kāi)放的端口再层。
f) 在Catalina.sh文件配置JAVA_OPTS時(shí),需要先關(guān)掉Tomcat堡纬,配置成功后重啟Tomcat -
沒(méi)有使用Tomcat的機(jī)器聂受,可以在通過(guò)命令啟動(dòng)程序時(shí),將-javaagent作為一個(gè)參數(shù)使用烤镐。
a) 用到的參數(shù)同上
6. 項(xiàng)目就運(yùn)行起來(lái)了蛋济,jacoco代理以tcpserver輸出模式運(yùn)行,需要執(zhí)行dump命令來(lái)生成jacoco.exec文件(.exec文件的名字可以自己命名)
java -jar D:/CodeCoverageTest-Data/JaCoCo/lib/jacococli.jar dump --destfile D:/CodeCoverageTest-Data/JaCoCo/test0.exec --address 127.0.0.1 --port 8282
a) java –jar [yourpath/]jacococli.jar dump [--option1] values1 [--option2] values2
option是參數(shù)
value是參數(shù)值
a) --destfile:執(zhí)行數(shù)據(jù)的輸出文件路徑
b) --address:需和上面-javaagent的一樣
c) --port:需和上面-javaagent的一樣
7. 需要看報(bào)告的時(shí)候炮叶,執(zhí)行
java -jar D:/CodeCoverageTest-Data/JaCoCo/lib/jacococli.jar report D:/CodeCoverageTest-Data/JaCoCo/test111.exec --classfiles D:/CodeCoverageTest-Data/JaCoCo --html D:/CodeCoverageTest-Data/JaCoCo --name test2 --address 127.0.0.1 --port 8282
a) java –jar [yourpath/]jacococli.jar report [yourpath/]jacoco.exec [--option1] values1 [--option2] values2
jacoco.exec是dump時(shí)的位置
option是參數(shù)
value是參數(shù)值
b) --classfiles:是編譯過(guò)后的.class文件的地址碗旅,目錄地址寫(xiě)到classes文件夾下就可自動(dòng)識(shí)別字節(jié)碼文件
c) --sourcefiles:源文件的地址渡处,目錄地址寫(xiě)到j(luò)ava文件夾下就可自動(dòng)識(shí)別源文件
d) --html:html報(bào)告的輸出路徑
e) --name:報(bào)告的名字
8. 按照html的路徑可找到報(bào)告,名字為index.html
三祟辟、注意事項(xiàng):
1医瘫、 每次新的版本需要測(cè)試時(shí),需要清理掉上次的記錄川尖,以免對(duì)本次測(cè)試產(chǎn)生影響登下,刪掉對(duì)應(yīng)的.exec文件,和report文件
2叮喳、 在版本測(cè)試周期中,可能遇到多次部署環(huán)境的情況缰贝,為了保證覆蓋率的準(zhǔn)確性馍悟,需要合并每一次的覆蓋率報(bào)告
a) java –jar [yourpath/]jacococli.jar merge [yourpath/]jacoco1.exec [yourpath/]jacoco2.exec [option] value
需要合并的.exec文件的路徑都寫(xiě)好
--destfile:用于將合并行數(shù)據(jù)寫(xiě)入的文件
b) 再通過(guò)report命令打出實(shí)體報(bào)告
// 在啟動(dòng)jar 的時(shí)候使用-javaAgent作為一個(gè)選項(xiàng)來(lái)啟動(dòng)程序。通過(guò)配置VM啟動(dòng)項(xiàng)剩晴,編輯Catalina.sh來(lái)打開(kāi)該文件
JAVA_OPTS=“-Javaagent:/[jacocoagentPath]=includes=[報(bào)名/類名/通配符*和锣咒?],output=tcpserver,port=[端口號(hào)],address=[IPPath] -Xverify:none”
// 項(xiàng)目啟動(dòng)起來(lái)之后,jacoco代理以tcpServer輸出模式運(yùn)行赞弥,需要執(zhí)行dump命令來(lái)生成.exec文件
java -jar D:/CodeCoverageTest-Data/JaCoCo/lib/jacococli.jar dump --destfile D:/CodeCoverageTest-Data/JaCoCo/test0.exec --address 127.0.0.1 --port 8282
//查看報(bào)告的時(shí)候
java –jar [yourpath/]jacococli.jar report [yourpath/]jacoco.exec --sourcefiles [編譯后的classPath] values1 [--option2] values2