1. 程式人生 > >jacoco 生成單測覆蓋率報告

jacoco 生成單測覆蓋率報告

## 一、jacoco 簡介 jacoco 是一個開源的覆蓋率工具,它針對的開發語言是 java。其使用方法很靈活,可以嵌入到 ant、maven 中;可以作為 Eclipse 外掛;可以作為 javaAgent 探針監控 java 程式等等。 很多第三方的工具提供了對 jacoco 的整合,如 sonar、jenkins 等等。 jacoco 包含了多種尺度的覆蓋率計數器,包含指令級覆蓋(Instructions,C0coverage)、分支覆蓋(Branches,C1coverage)、圈複雜度(CyclomaticComplexity)、行覆蓋(Lines)、方法覆蓋(non-abstract methods)、類覆蓋(classes),其含義如下: - 行覆蓋率:度量被測程式的每行程式碼是否被執行,判斷標準行中是否至少有一個指令被執行。 - 類覆蓋率:度量計算 class 類檔案是否被執行。 - 分支覆蓋率:度量 if 和 switch 語句的分支覆蓋情況,計算一個方法裡面的總分支數,確定執行和不執行的分支數量。 - 方法覆蓋率:度量被測程式的方法執行情況,是否執行取決於方法中是否有至少一個指令被執行。 - 指令覆蓋:計數單元是單個 java 二進位制程式碼指令,指令覆蓋率提供了程式碼是否被執行的資訊,度量完全獨立原始碼格式。 - 圈複雜度:在(線性)組合中,計算在一個方法裡面所有可能路徑的最小數目,缺失的複雜度同樣表示測試案例沒有完全覆蓋到這個模組。 ## 二、jacoco 和 maven 整合 ### 2.1 mvn 命令增加引數 在執行 mvn 命令時,加上 "org.jacoco:jacoco-maven-plugin:prepare-agent" 引數即可。示例: ``` mvn clean test org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent install -Dmaven.test.failure.ignore=true ``` 其中,jacoco-maven-plugin 後面跟的是jacoco的版本。"-Dmaven.test.failure.ignore=true" 建議加上,否則如果單元測試失敗,就會直接中斷,不會產生 .exec 檔案。 執行以上命令後,會在當前目錄的 target 目錄下產生一個jacoco.exec檔案,該檔案就是覆蓋率的檔案。 總體說來,這種方式比較簡單,在與 jenkins 整合時也非常方便。 ### 2.2 在 pom 檔案中使用 jacoco 外掛 首先,需要新增 jacoco 的依賴: ``` 0.8.5 ``` ``` org.jacoco jacoco-maven-plugin ${jacoco.version} test ``` 接著,我們需要配置 jacoco-maven-plugin 和 maven-surefire-plugin 內容: ``` maven-surefire-plugin -javaagent:${settings.localRepository}/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar=destfile=${project.basedir}/target/coverage-reports/jacoco-unit.exec true
org.jacoco jacoco-maven-plugin 0.8.5 target/coverage-reports/jacoco-unit.exec target/coverage-reports/jacoco-unit.exec
**/service/** BUNDLE    METHOD
COVEREDRATIO 0.50
BRANCH COVEREDRATIO 0.50 CLASS MISSEDCOUNT 0
pre-test prepare-agent post-test test report
``` <includes>或<excludes>標籤的值應該是相對於目錄 /classes/ 的編譯類的類路徑(而不是包名),用來指定哪些類需要進行單元測試。 另外 maven 的測試類需要遵循相應的規範命名,否則無法執行測試類,無法生成測試報告以及覆蓋率報告。jacoco 使用的是 maven-surefire-plugin 外掛,它的預設測試類名規範是: - Test*.java:以 Test 開頭的 Java 類; - *Test.java:以 Test 結尾的 Java 類; - *TestCase.java:以 TestCase 結尾的 Java 類; 或者可以在pom中自定義測試類: ``` org.apache.maven.plugins maven-surefire-plugin **/*Tests.java **/*Test.java **/Abstract*.java ``` <rules> 指定篩選規則。 接著執行 mvn test 生成 index.html,即覆蓋率報告 ![](https://img2020.cnblogs.com/blog/1153954/202005/1153954-20200507145600498-1897605575.png)

推薦閱讀: 1. ant 整合 jacoco:[http://eclemma.org/jacoco/trunk/doc/ant.html](http://eclemma.org/jacoco/trunk/doc/ant.html) 2. eclipse 使用 jacoco:[http://www.eclemma.org/](http://www.eclem