目的
a. 度量單元測試覆蓋率;
b. 度量自動化測試(接口、UI)覆蓋率;
c. 度量功能測試覆蓋率;
代碼覆蓋率是衡量測試質(zhì)量的一個重要指標。
Jacoco簡介
JaCoCo是一個開源的覆蓋率工具(官網(wǎng)地址:http://www.eclemma.org/JaCoCo/),它針對的開發(fā)語言是java,其使用方法很靈活??梢郧度氲紸nt、Maven中;可以作為Eclipse插件。可以使用其JavaAgent技術(shù)監(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&
將以上內(nèi)容放到tomcat>bin>catalina.bat(linux環(huán)境為catalina.sh),配置前需要停止服務(wù)。

? 以-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接口不提供任何身份驗證機制。如果在生產(chǎn)環(huán)境上運行jacoco,請確保沒有不受信任的源可以訪問TCP服務(wù)器端口,或者jacoco TCP客戶端僅連接到受信任的目標。否則可能會泄露應(yīng)用程序的內(nèi)部信息或者可能發(fā)生DOS攻擊。
上傳源碼到服務(wù)器
將源碼與編譯后的文件上傳到項目服務(wù)器,若源碼變更需要同步更新。
ant build.xml配置

覆蓋度報告收集
1) 進入ant? build.xml目錄,執(zhí)行ant dump
訪問目標服務(wù),并生成.exec文件;

2) 進入ant build.xml目錄,執(zhí)行ant report;
根據(jù)dump后,生成的.exec文件,生成最終的html覆蓋率報告

3) 查看覆蓋度報告


?Elment對應(yīng)jacocoant.xml文件中配置的group name屬性,也就是我項目中的一個子項目,點進去可以看到所有的包,再點擊包可以看到里面的類文件,點擊類進入到方法列表,方法還可以點,點了會直接進入到代碼當中,代碼會有顏色并高亮顯示,分支代碼的左邊還會有一顆帶顏色的鉆石
?Jacoco包含了多種尺度的覆蓋率計數(shù)器,包含指令級(Instructions,C0 coverage),分支(Branches,C1 coverage)、圈復雜度(CyclomaticComplexity)、行(Lines)、方法(Non-abstract
Methods)、類(Classes)。
?1. Instructions
Jacoco計算的最小單位就是字節(jié)碼指令。指令覆蓋率表明了在所有的指令中,哪些被指令過以及哪些沒有被執(zhí)行。這項指數(shù)完全獨立于源碼格式并且在任何情況下有效,不需要類文件的調(diào)試信息。
?2. Branches
Jacoco對所有的if和switch指令計算了分支覆蓋率。這項指標會統(tǒng)計所有的分支數(shù)量,并同時支出哪些分支被執(zhí)行,哪些分支沒有被執(zhí)行。這項指標也在任何情況都有效。異常處理不考慮在分支范圍內(nèi)。在有調(diào)試信息的情況下,分支點可以被映射到源碼中的每一行,并且被高亮表示。
紅色鉆石:無覆蓋,沒有分支被執(zhí)行。黃色鉆石:部分覆蓋,部分分支被執(zhí)行。綠色鉆石:全覆蓋,所有分支被執(zhí)行。
? Cyclomatic Complexity
Jacoco為每個非抽象方法計算圈復雜度,并也會計算每個類,包,組的復雜度。根據(jù)McCabe1996的定義,圈復雜度可以理解為覆蓋所有的可能情況最少使用的測試用例數(shù)。這項參數(shù)也在任何情況下有效。
? Lines該項指數(shù)在有調(diào)試信息的情況下計算。因為每一行代碼可能會產(chǎn)生若干條字節(jié)碼指令,所以我們用三種不同狀態(tài)表示行覆蓋率
紅色背景:無覆蓋,該行的所有指令均無執(zhí)行。黃色背景:部分覆蓋,該行部分指令被執(zhí)行。綠色背景:全覆蓋,該行所有指令被執(zhí)行。
?Methods每一個非抽象方法都至少有一條指令。若一個方法至少被執(zhí)行了一條指令,就認為它被執(zhí)行過。因為JaCoco直接對字節(jié)碼進行操作,所以有些方法沒有在源碼顯示(比如某些構(gòu)造方法和由編譯器自動生成的方法)也會被計入在內(nèi)。
?Classes每個類中只要有一個方法被執(zhí)行,這個類就被認定為被執(zhí)行。同5一樣,有些沒有在源碼聲明的方法被執(zhí)行,也認定該類被執(zhí)行。
參考地址:http://www.itdecent.cn/p/4c728b39185e