目的
a. 度量單元測試覆蓋率借嗽;
b. 度量自動化測試(接口、UI)覆蓋率判沟;
c. 度量功能測試覆蓋率耿芹;
代碼覆蓋率是衡量測試質量的一個重要指標崭篡。
Jacoco簡介
JaCoCo是一個開源的覆蓋率工具(官網(wǎng)地址:http://www.eclemma.org/JaCoCo/),它針對的開發(fā)語言是java吧秕,其使用方法很靈活琉闪。可以嵌入到Ant砸彬、Maven中颠毙;可以作為Eclipse插件∩暗铮可以使用其JavaAgent技術監(jiān)控Java程序等蛀蜜。
JaCoCo可以集成sonar、Jenkins等增蹭。
Jacoco安裝
需要安裝的工具與版本
? Jacoco官網(wǎng)下載地址 https://www.eclemma.org/jacoco/滴某;
? Ant官網(wǎng)下載地址 https://ant.apache.org/bindownload.cgi;
注:Ant需要配置環(huán)境變量滋迈;
使用java agent方式啟動項目
1) Spring Boot項目
nohup java -javaagent:/disk1/jacoco-0.8.3/lib/jacocoagent.jar=includes=*,output=tcpserver,port=9006,address=*? -jar autoshell-0.0.1-SNAPSHOT.jar&
2) Tomcat部署項目
java -javaagent:/disk1/jacoco-0.8.3/lib/jacocoagent.jar=includes=*,output=tcpserver,port=9006,address=*? -jar autoshell-0.0.1-SNAPSHOT.jar&
將以上內容放到tomcat>bin>catalina.bat(linux環(huán)境為catalina.sh)霎奢,配置前需要停止服務。
? 以-javaagent開頭的杀怠,注意這中間不能有空格椰憋,否則會啟動失敗,后面跟著的是jacoco的安裝路徑中的jacocoagent.jar包的路徑赔退,
? includes配置包含在執(zhí)行分析中的類名列表橙依,我分析全部,因此使用*通配符硕旗〈捌铮可以只分析一個包下的代碼,也可以使用excludes排除不想要的包漆枚。
? output指的是用于寫入覆蓋數(shù)據(jù)的輸出方法创译,使用tcpserver代理偵聽由address和port屬性指定的TCP端口,并將執(zhí)行的數(shù)據(jù)寫入此TCP連接墙基,從而實現(xiàn)不停止項目運行實時生成代碼覆蓋率報告软族。
? port為端口號,需要明確的一點就是這個端口號不是項目的yml配置文件中配置的server.port端口號残制,不要搞混淆了立砸,選擇一個未被占用的即可。address配置連接的ip地址初茶,可以簡單理解為之前安裝ant的機器的ip地址颗祝。*號則表示此代理接受任何本地的連接,也就是說同一局域網(wǎng)下都可以。
? 其他屬性配置請參照官方文檔:https://www.eclemma.org/jacoco/trunk/doc/agent.html
注意:在tcpserver和 tcpclient模式下打開的端口和連接以及JMX接口不提供任何身份驗證機制螺戳。如果在生產環(huán)境上運行jacoco搁宾,請確保沒有不受信任的源可以訪問TCP服務器端口,或者jacoco TCP客戶端僅連接到受信任的目標倔幼。否則可能會泄露應用程序的內部信息或者可能發(fā)生DOS攻擊盖腿。
上傳源碼到服務器
將源碼與編譯后的文件上傳到項目服務器,若源碼變更需要同步更新凤藏。
ant build.xml配置
覆蓋度報告收集
1) 進入ant? build.xml目錄,執(zhí)行ant dump
訪問目標服務奸忽,并生成.exec文件堕伪;
2) 進入ant build.xml目錄,執(zhí)行ant report揖庄;
根據(jù)dump后,生成的.exec文件欠雌,生成最終的html覆蓋率報告
3) 查看覆蓋度報告
?Elment對應jacocoant.xml文件中配置的group name屬性蹄梢,也就是我項目中的一個子項目,點進去可以看到所有的包富俄,再點擊包可以看到里面的類文件禁炒,點擊類進入到方法列表,方法還可以點霍比,點了會直接進入到代碼當中幕袱,代碼會有顏色并高亮顯示,分支代碼的左邊還會有一顆帶顏色的鉆石
?Jacoco包含了多種尺度的覆蓋率計數(shù)器,包含指令級(Instructions,C0 coverage)悠瞬,分支(Branches,C1 coverage)们豌、圈復雜度(CyclomaticComplexity)、行(Lines)浅妆、方法(Non-abstract
Methods)望迎、類(Classes)。
?1. Instructions
Jacoco計算的最小單位就是字節(jié)碼指令凌外。指令覆蓋率表明了在所有的指令中辩尊,哪些被指令過以及哪些沒有被執(zhí)行。這項指數(shù)完全獨立于源碼格式并且在任何情況下有效康辑,不需要類文件的調試信息摄欲。
?2. Branches
Jacoco對所有的if和switch指令計算了分支覆蓋率。這項指標會統(tǒng)計所有的分支數(shù)量疮薇,并同時支出哪些分支被執(zhí)行胸墙,哪些分支沒有被執(zhí)行。這項指標也在任何情況都有效惦辛。異常處理不考慮在分支范圍內劳秋。在有調試信息的情況下,分支點可以被映射到源碼中的每一行,并且被高亮表示玻淑。
紅色鉆石:無覆蓋嗽冒,沒有分支被執(zhí)行。黃色鉆石:部分覆蓋补履,部分分支被執(zhí)行添坊。綠色鉆石:全覆蓋,所有分支被執(zhí)行箫锤。
? Cyclomatic Complexity
Jacoco為每個非抽象方法計算圈復雜度贬蛙,并也會計算每個類,包谚攒,組的復雜度阳准。根據(jù)McCabe1996的定義,圈復雜度可以理解為覆蓋所有的可能情況最少使用的測試用例數(shù)馏臭。這項參數(shù)也在任何情況下有效野蝇。
? Lines該項指數(shù)在有調試信息的情況下計算。因為每一行代碼可能會產生若干條字節(jié)碼指令括儒,所以我們用三種不同狀態(tài)表示行覆蓋率
紅色背景:無覆蓋绕沈,該行的所有指令均無執(zhí)行。黃色背景:部分覆蓋帮寻,該行部分指令被執(zhí)行乍狐。綠色背景:全覆蓋,該行所有指令被執(zhí)行固逗。
?Methods每一個非抽象方法都至少有一條指令浅蚪。若一個方法至少被執(zhí)行了一條指令,就認為它被執(zhí)行過抒蚜。因為JaCoco直接對字節(jié)碼進行操作掘鄙,所以有些方法沒有在源碼顯示(比如某些構造方法和由編譯器自動生成的方法)也會被計入在內。
?Classes每個類中只要有一個方法被執(zhí)行嗡髓,這個類就被認定為被執(zhí)行操漠。同5一樣,有些沒有在源碼聲明的方法被執(zhí)行饿这,也認定該類被執(zhí)行浊伙。
參考地址:http://www.reibang.com/p/4c728b39185e