maven+jacoco+sonar


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支持多種覆蓋率的統計,包括:

  1. 行覆蓋率:度量被測程序的每行代碼是否被執行,判斷標准行中是否至少有一個指令被執行。
  2. 類覆蓋率:度量計算class類文件是否被執行。
  3. 分支覆蓋率:度量if和switch語句的分支覆蓋情況,計算一個方法里面的總分支數,確定執行和不執行的 分支數量。
  4. 方法覆蓋率:度量被測程序的方法執行情況,是否執行取決於方法中是否有至少一個指令被執行。
  5. 指令覆蓋:計數單元是單個java二進制代碼指令,指令覆蓋率提供了代碼是否被執行的信息,度量完全 獨立源碼格式。
  6. 圈復雜度:在(線性)組合中,計算在一個方法里面所有可能路徑的最小數目,缺失的復雜度同樣表示測 試案例沒有完全覆蓋到這個模塊。

三、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目錄下~

轉載:https://www.cnblogs.com/fnlingnzb-learner/p/10637802.html

 

增量覆蓋率的思想:

1. 獲取測試完成后的 exec 文件(二進制文件,里面有探針的覆蓋執行信息);
2. 獲取基線提交與被測提交之間的差異代碼;
3. 對差異代碼進行解析,切割為更小的顆粒度,我們選擇方法作為最小緯度;
4. 改造 JaCoCo ,使它支持僅對差異代碼生成覆蓋率報告;

 

jacoco原理:https://www.cnblogs.com/forfreewill/articles/13627983.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM