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