Jacoco覆蓋率工具使用調研


JaCoCo Java Code Coverage Library

Jacoco是一個開源的覆蓋率工具。Jacoco可以嵌入到Ant 、Maven中,並提供了EclEmma Eclipse插件,也可以使用Java Agent技術監控Java程序。很多第三方的工具提供了對Jacoco的集成,如sonar、Jenkins、IDEA. 

 


官方地址 http://www.eclemma.org/jacoco/

 

Java Counters

Jacoco包含了多種尺度的覆蓋率計數器,包含指令級(Instructions,C0 coverage),分支(Branches,C1 coverage)、圈復雜度(Cyclomatic Complexity)、行(Lines)、方法(non-abstract methods)、類(classes)。

如下所示,標示綠色的為分支覆蓋充分,標黃色的為部分分支覆蓋,標紅色的為未執行該分支。

Integration

Jacoco團隊提供了如下的一些集成工具的支持

 

Java API 
Command Line
Apache Ant
Apache Maven
Eclipse EclDmma Plugin

 

jacoco-maven-plugin

 

 

Jacoco總體上提供了比較完整的文檔,但是Maven項目如果需要支持Jacoco,配置起來比較復雜,不如Cobertura方便。為了能夠跑通該插件,調研了很多文章,其中‘Creating Code Coverage Reports for Unit And Integration Tests with The JaCoCo Maven Plugin’幫助最大。

具體的maven配置如下,執行mvn test即可得到。

 

 <!-- jacoco plugin -->
  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.4.201312101107</version>
    <executions>
      <execution>
        <!--
        在maven的initialize階段,將Jacoco的runtime agent作為VM的一個參數
        傳給被測程序,用於監控JVM中的調用。
        -->
        <id>default-prepare-agent</id>
        <goals>
          <goal>prepare-agent</goal>
        </goals>

        <configuration>
            <destFile>
                ${project.build.directory}/coverage-reports/jacoco.exec
            </destFile>
            <propertyName>surefireArgLine</propertyName>
        </configuration>

      </execution>

        <!-- 
        在程序的verify階段,執行report測試的程序。
        文件的輸入為perpare-agent階段中設置或者默認的jacoco.exec.
        參數 includes和excludes可用來選定report中過濾的類。   
        -->
      <execution>
        <id>default-report</id>
        <phase>test</phase>
        <goals>
          <goal>report</goal>
        </goals>

        <configuration>
            <dataFile>${project.build.directory}/coverage-reports/jacoco.exec</dataFile>
            <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
        </configuration>

      </execution>

     </executions>
  </plugin>

<!--
使用 maven-surefire-plugin來執行單元測試。
將surefireArgLine賦值給argLine參數,以保證在測試執行時Jacoco agent處於運行狀態。
-->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <argLine>${surefireArgLine}</argLine>
    </configuration>
  </plugin>
</plugins>

 

 

 

動態監測Web項目的覆蓋率

Jacoco使用Java Agent 動態插樁,來監控文件執行的覆蓋率數據。Jacoco 代理可以收集執行信息,並且當JVM退出時dump,輸出數據的方式有3種:

 

 

  • 1,文件,當JVM退出時將執行數據寫到本地
  • 2,TCP Socket Server,以外部工具的形式連接JVM,通過socket獲取執行數據。
  • 3,TCP Sockect Client,程序啟動時Agent連接到TCP端點,通過request將執行數據輸出。

 

Java Agent 可以通過如下的JVM參數來啟動:

-javaagent:[yourpath/]jacocoagent.jar=[opt1]=[val1],[opt2]=[val2]

 

shutdown jvm時獲取dump數據

 

Jacoco插件通過agent獲取覆蓋率信息文件,為了保證插件可以連接到Jacoco agent,我們必須正確配置Jacoco agent和應用一起首先運行起來。 

在shutdown時,獲取dump數據,在tomcat的catalina.sh中JAVA_OPTS中增加如下參數 

 

-javaagent:[yourpath/]jacocoagent.jar=includes=com.xxx.*,output=xxx

 

其中,output=file/tcpserver/tcpclient: 
                  覆蓋率數據輸出的形式,分別為file,tcpserver,tcpclient.

對應的Jenkins插件見https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin

以客戶端形式運行

在tomcat的catalina.sh中JAVA_OPTS中增加如下參數

-javaagent:[yourpath/]jacocoagent.jar=includes=com.baidu.*, output=tcpserver,port=6300,address= 220.181.111.148

 

這樣會在220.181.111.148地址的6300端口上提供client訪問,並且能dump出此時的覆蓋率文件。

使用這種方式,不需要停止jvm,只需要請求測試環境提供的端口地址即可。

這種調用方式,在Jacoco的網站上提供了生成報告等的API。

 

具體請查看: http://blog.csdn.net/kittyboy0001/article/details/26400091

 


免責聲明!

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



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