- 什么是Jacoco
Jacoco是一個開源的代碼覆蓋率工具,可以嵌入到Ant 、Maven中,並提供了EclEmma Eclipse插件,也可以使用JavaAgent技術監控Java程序。很多第三方的工具提供了對Jacoco的集成,如sonar、Jenkins等 - 什么是代碼覆蓋率
代碼覆蓋(Code coverage)是軟件測試中的一種度量,描述程式中源代碼被測試的比例和程度,所得比例稱為代碼覆蓋率。
代碼覆蓋率是衡量測試質量的一個重要指標。在對一個軟件產品進行了單元測試、組裝測試、集成測試以及接口測試等繁多的測試之后,我們能不能就此對軟件的質量產生一定的信心呢?這就需要我們對測試的質量進行考察。如果測試僅覆蓋了代碼的一小部分,那么不管我們寫了多少測試用例,我們也不能相信軟件質量是有保證的。相反,如果測試覆蓋到了軟件的絕大部分代碼,我們就能對軟件的質量有一個合理的信心。 - Jacoco的功能
- 覆蓋率計數器
Jacoco使用一系列的不同的計數器來做覆蓋率的度量計算。所有這些計數器都是從java的class文件中獲取信息,這些class文件可以(可選)包含調試的信息在里面。即使在沒有源碼的情況下,這種方法也可以實時有效地對應用程序進行度量和分析。在大部分情況下,收集到的信息可以映射到源碼,可視化到每一行代碼的粒度。但這種方法還是有一些限制。這些class文件必須使用調試信息來編譯,這樣才可以計算行的覆蓋率和提供出源碼的高亮。但不是所有的JAVA語言的結構都可以直接編譯成一致的二進制代碼。在這種情況下,java 編譯器會創建所謂的“合成”代碼,會導致產生一些不期望得到的覆蓋率結果。 - 指令覆蓋率
Jacoco最小的計數單元是單個java二進制代碼指令。指令覆蓋率提供了代碼是否被執行的信息。這個度量完全獨立源碼格式,並且總是可用,即使class文件里面沒有調試信息。 - 分支覆蓋率
Jacoco也計算分支的覆蓋率,包括所有的if和switch語句。這個度量計算一個方法里面的總分支數,確定執行和不執行的分支數量。分支覆蓋率總是可用的,即使class文件里面沒有調試信息。注意異常處理是不在分支度量里面統計的
- Demo
代碼結構

pom.xml文件內容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xxx.tutorial</groupId>
<artifactId>jacoco-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<jacoco.version>0.7.5.201505241946</jacoco.version>
<junit.version>4.12</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<skipMain>true</skipMain>
<skip>true</skip>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<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>
</executions>
</plugin>
</plugins>
</build>
</project>
被測代碼


測試代碼


testng.xml配置

執行testng.xml 並 執行 mvn test查看測試報告
測試報告目錄

測試報告及詳情


全覆蓋:在該行的所有指令已執行(綠色背景)
部分覆蓋:只有在該行的指示的一部分已經被執行(黃色背景)
沒有覆蓋:在該行任何指令執行(紅色背景)
