在idea中使用JaCoCo插件統計單元測試覆蓋率的實現

在後臺工程師開發完新代碼交給QA進行測試時,軟件測試人員一般都會要求後臺開發對單元測試的覆蓋率達到一定的標準;例如我們的標準是分支覆蓋率達到50%以上,函數覆蓋率達到50%以上。

在idea中查看覆蓋率挺簡單的,idea中支持三種插件來查看覆蓋率,每種插件統計明細各有千秋,分別是idea自帶插件、JaCoCo、Emma。

在idea中打開一個測試類,點擊右上角“Edit Configurations”按鈕,如下圖所示:

然後會彈出一個框,左側菜單欄顯示JUnit欄目,右邊我們選擇“Code Coverage”選項卡,下面有一個”choose coverage runner“下拉菜單,默認是idea自帶的,我們可以切換成其他的(隻不過需要在pom中配置一下),如下圖所示:

idea默認自帶的插件,統計出來的覆蓋率隻包含classes、method、line,不太詳細,不能滿足我們的要求;所以一般使用JaCoCo插件來統計,我們切換成JaCoCo插件以後,緊接著在maven的pom文件中這樣配置:

(1)添加依賴

<dependency>
 <groupId>org.jacoco</groupId>
 <artifactId>jacoco-maven-plugin</artifactId>
 <version>0.8.2</version>
</dependency>

(2)配置plugins

<plugin>
 <groupId>org.jacoco</groupId>
 <artifactId>jacoco-maven-plugin</artifactId>
 <version>0.8.2</version>
 <configuration>
  <destFile>target/coverage-reports/jacoco-unit.exec</destFile>
  <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
  <includes>
   <include>**/service/**</include>
   <include>**/controller/**</include>
   <!--<include>**/service/impl/*.class</include>-->
  </includes>
  <!-- rules裡面指定覆蓋規則 -->
  <rules>
   <rule implementation="org.jacoco.maven.RuleConfiguration">
    <element>BUNDLE</element>
    <limits>  
     <!-- 指定方法覆蓋到50% -->
     <limit implementation="org.jacoco.report.check.Limit">
      <counter>METHOD</counter>
      <value>COVEREDRATIO</value>
      <minimum>0.50</minimum>
     </limit>
     <!-- 指定分支覆蓋到50% -->
     <limit implementation="org.jacoco.report.check.Limit">
      <counter>BRANCH</counter>
      <value>COVEREDRATIO</value>
      <minimum>0.50</minimum>
     </limit>
     <!-- 指定類覆蓋到100%,不能遺失任何類 -->
     <limit implementation="org.jacoco.report.check.Limit">
     <counter>CLASS</counter>
     <value>MISSEDCOUNT</value>
     <maximum>0</maximum>
     </limit>
    </limits>
   </rule>
  </rules>
 </configuration>
 <executions>
  <execution>
   <id>jacoco-initialize</id>
   <goals>
    <goal>prepare-agent</goal>
   </goals>
  </execution>
  <!--這個check:對代碼進行檢測,控制項目構建成功還是失敗-->
  <execution>
   <id>check</id>
   <goals>
    <goal>check</goal>
   </goals>
  </execution>
  <!--這個report:對代碼進行檢測,然後生成index.html在 target/site/index.html中可以查看檢測的詳細結果-->
  <execution>
   <id>jacoco-site</id>
   <phase>package</phase>
   <goals>
    <goal>report</goal>
   </goals>
  </execution>
 </executions> 
</plugin>

如果你想使用idea自帶的插件,查看簡單的覆蓋率數據,可以直接在測試類上右鍵點擊”Run ‘xxxxxTest’ with Coverage”,如下圖所示:

當JaCoCo插件配置好以後,要獲得 JaCoCo的統計數據,就要執行mvn install 命令。執行完以後,target/site/jacoco/目錄下會生成一個index.html文件,這是統計數據總覽頁面,可以在瀏覽器打開查看,如下圖所示:

由於我們在pom文件的plugin裡面配置瞭rule規則和check 目標,所以在覆蓋率不滿足的情況下,mvn install是不會成功的,並且會報錯:

另一個需要註意的是我在rule中配置的規則,有的是 COVEREDRATIO,有的是MISSEDCOUNT,這說明有的統計的是覆蓋率,有的統計的是丟失率(也即未覆蓋到的),你可別看錯瞭。

配置JaCoCo插件一定註意和JDK版本的對應關系,如果你用的是jdk1.8,則插件一定要用最新版,要不然會報如下錯誤:

Caused by: java.lang.RuntimeException: Class java/util/UUID could not be instrumented.
 at org.jacoco.agent.rt.internal_5d10cad.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:138)
 at org.jacoco.agent.rt.internal_5d10cad.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:99)
 at org.jacoco.agent.rt.internal_5d10cad.PreMain.createRuntime(PreMain.java:51)
 at org.jacoco.agent.rt.internal_5d10cad.PreMain.premain(PreMain.java:43)
 ... 6 more
Caused by: java.lang.NoSuchFieldException: $jacocoAccess
 at java.lang.Class.getField(Class.java:1542)
 at org.jacoco.agent.rt.internal_5d10cad.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:136)
 ... 9 more
FATAL ERROR in native method: processing of -javaagent failed
Exception in thread "main" 

補充:Intellij IDEA run coverage之覆蓋率測試

一.選擇覆蓋率報表工具

二.運行測試用例

三.查看覆蓋率報表

四.下載查看報表

點擊這個

勾選open

查看報表

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀: