Java代碼覆蓋率

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. 注入方式
注入方式.png
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/
下載JaCoCo.png
2. Jacoco以壓縮包的形式傳到服務(wù)器然后解壓唯蝶,jacoco從網(wǎng)站上下載下來(lái)是zip格式九秀,通過(guò)unzip 包名.zip進(jìn)行解壓
3. 解壓后,打開(kāi)文件夾粘我,里面有如下的文件
JaCoCo文件.png
4. lib文件下是.jar鼓蜒,其中會(huì)用到的是jacocoagent.jar痹换,jacococli.jar
image.png
5. 在啟動(dòng)jar的時(shí)候使用-javaagent作為一個(gè)選項(xiàng)來(lái)啟動(dòng)程序
  1. 當(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

    image.png

    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

  2. 沒(méi)有使用Tomcat的機(jī)器聂受,可以在通過(guò)命令啟動(dòng)程序時(shí),將-javaagent作為一個(gè)參數(shù)使用烤镐。


    IDEA截圖.png

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
隨機(jī)結(jié)果截圖.png

三祟辟、注意事項(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毅整,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绽左,更是在濱河造成了極大的恐慌悼嫉,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拼窥,死亡現(xiàn)場(chǎng)離奇詭異戏蔑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鲁纠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門总棵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人改含,你說(shuō)我怎么就攤上這事情龄。” “怎么了捍壤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵骤视,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我白群,道長(zhǎng)尚胞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任帜慢,我火速辦了婚禮笼裳,結(jié)果婚禮上唯卖,老公的妹妹穿的比我還像新娘。我一直安慰自己躬柬,他們只是感情好拜轨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著允青,像睡著了一般橄碾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颠锉,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天法牲,我揣著相機(jī)與錄音,去河邊找鬼琼掠。 笑死拒垃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓷蛙。 我是一名探鬼主播悼瓮,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼艰猬!你這毒婦竟也來(lái)了横堡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冠桃,失蹤者是張志新(化名)和其女友劉穎命贴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腊满,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡套么,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碳蛋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胚泌。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肃弟,靈堂內(nèi)的尸體忽然破棺而出玷室,到底是詐尸還是另有隱情,我是刑警寧澤笤受,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布穷缤,位于F島的核電站,受9級(jí)特大地震影響箩兽,放射性物質(zhì)發(fā)生泄漏津肛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一汗贫、第九天 我趴在偏房一處隱蔽的房頂上張望身坐。 院中可真熱鬧秸脱,春花似錦、人聲如沸部蛇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涯鲁。三九已至巷查,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抹腿,已是汗流浹背岛请。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幢踏,地道東北人髓需。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像房蝉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子微渠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容