1. 程式人生 > 實用技巧 >maven單測生成覆蓋率報告---Jacoco的使用

maven單測生成覆蓋率報告---Jacoco的使用

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

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