JaCoCo介紹
一、JaCoCo簡述
JaCoCo是一個開源的覆蓋率工具,它針對的開發語言是java,其使用方法很靈活,可以嵌入到Ant、Maven中;可以作為Eclipse插件,可以使用其JavaAgent技術監控Java程序等等。
很多第三方的工具提供了對JaCoCo的集成,如sonar、Jenkins等。
JaCoCo包含了多種尺度的覆蓋率計數器,包含指令級覆蓋(Instructions,C0coverage),分支(Branches,C1coverage)、圈復雜度(CyclomaticComplexity)、行覆蓋(Lines)、方法覆蓋(non-abstract methods)、類覆蓋(classes)
二、JaCoCo基本概念
jacoco支持多種覆蓋率的統計,包括:
行覆蓋率:度量被測程序的每行代碼是否被執行,判斷標准行中是否至少有一個指令被執行。
類覆蓋率:度量計算class類文件是否被執行。
分支覆蓋率:度量if和switch語句的分支覆蓋情況,計算一個方法里面的總分支數,確定執行和不執行的 分支數量。
方法覆蓋率:度量被測程序的方法執行情況,是否執行取決於方法中是否有至少一個指令被執行。
指令覆蓋:計數單元是單個java二進制代碼指令,指令覆蓋率提供了代碼是否被執行的信息,度量完全 獨立源碼格式。
圈復雜度:在(線性)組合中,計算在一個方法里面所有可能路徑的最小數目,缺失的復雜度同樣表示測 試案例沒有完全覆蓋到這個模塊。
三、JaCoCo使用方式
3.1 Apache Ant方式
參見 http://eclemma.org/jacoco/trunk/doc/ant.html
3.2 命令行方式
參見 http://www.eclemma.org/jacoco/trunk/doc/agent.html
大概的命令:
-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]
其他參數可以查看上面的鏈接
接口測試時,我們也是使用該方式來進行,具體的說明會在下面另外說明
3.3 Apache Maven方式
參見 http://www.eclemma.org/jacoco/trunk/doc/maven.html
這種方式適合Maven的項目。
3.4 Eclipse EclDmma Plugin方式
參見 http://www.eclemma.org/
該方式主要和eclipse集成,用戶可以直觀的看到覆蓋率的情況
四、maven配置JaCoCo
jacoco支持生成單元測試的覆蓋率和接口測試的覆蓋率,本節詳細描述如何用jacoco生成單元測試覆蓋率。
想要在單元測試時統計單元測試的覆蓋率,有兩種方式,大家可以各取
4.1 mvn命令增加參數
在執行mvn命令時,加上“org.jacoco:jacoco-maven-plugin:prepare-agent”參數即可。 示例:
mvn clean test org.jacoco:jacoco-maven-plugin:0.7.3.201502191951:prepare-agent install -Dmaven.test.failure.ignore=true
其中,jacoco-maven-plugin后面跟的是jacoco的版本; 【-Dmaven.test.failure.ignore=true】建議加上,否則如果單元測試失敗,就會直接中斷,不會產生.exec文件
執行以上命令后,會在當前目錄下的target目錄產生一個jacoco.exec文件,該文件就是覆蓋率的文件:
總體說來,這種方式比較簡單,在與jekins集成時也非常方便,推薦大家用這種方式進行配置。
4.2 在pom文件中添加jacoco插件
具體的配置方法如下:
1.添加依賴
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
</dependency>
2.配置plugins
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<configuration>
<includes>
<include>com/**/*</include>
</includes>
</configuration>
<executions>
<execution>
<id>pre-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
其中包含(includes)或排除(excludes)字段的值應該是相對於目錄/ classes /的編譯類的類路徑(而不是包名),使用標准通配符語法:
* Match zero or more characters
** Match zero or more directories
? Match a single character
你也可以這樣排除一個包和它的所有子包/子包:
<exclude>com/src/**/*</exclude>
這將排除某些包裝中的每個課程,以及任何孩子。例如,com.src.child也不會包含在報表中。
也可以在pom中指定篩選規則:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<configuration>
<includes>
<include>com/src/**/*</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>pre-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
此時運行mvn test生成index.html(即覆蓋率報告)位置在:
也可以指定輸出目錄:
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>target/jacoco.exec</dataFile>
<outputDirectory>target/jacoco-ut</outputDirectory>
</configuration>
</execution>
在這里,我們將單元測試結果的輸出目錄確定為target/jacoco-ut目錄下~