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


免責聲明!

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



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