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方式
該方式主要和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文件,該文件就是覆蓋率的文件:
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目錄下~
轉載:https://www.cnblogs.com/fnlingnzb-learner/p/10637802.html
增量覆蓋率的思想:
1. 獲取測試完成后的 exec 文件(二進制文件,里面有探針的覆蓋執行信息);
2. 獲取基線提交與被測提交之間的差異代碼;
3. 對差異代碼進行解析,切割為更小的顆粒度,我們選擇方法作為最小緯度;
4. 改造 JaCoCo ,使它支持僅對差異代碼生成覆蓋率報告;
jacoco原理:https://www.cnblogs.com/forfreewill/articles/13627983.html