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⽀持多种覆盖率的统计,包括:
1. ⾏覆盖率:度量被测程序的每⾏代码是否被执⾏,判断标准⾏中是否⾄少有⼀个指令被执⾏。
2. 类覆盖率:度量计算class类⽂件是否被执⾏。
3. 分⽀覆盖率:度量if和switch语句的分⽀覆盖情况,计算⼀个⽅法⾥⾯的总分⽀数,确定执⾏和不执⾏的分⽀数量。
4. ⽅法覆盖率:度量被测程序的⽅法执⾏情况,是否执⾏取决于⽅法中是否有⾄少⼀个指令被执⾏。
5. 指令覆盖:计数单元是单个java⼆进制代码指令,指令覆盖率提供了代码是否被执⾏的信息,度量完全独⽴源码格式。
6. 圈复杂度:在(线性)组合中,计算在⼀个⽅法⾥⾯所有可能路径的最⼩数⽬,缺失的复杂度同样表⽰测试案例没有完全覆盖到这个
模块。
三、JaCoCo使⽤⽅式
3.1 Apache Ant⽅式
参见
3.2 命令⾏⽅式
参见
⼤概的命令:
-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]
其他参数可以查看上⾯的链接
接⼝测试时,我们也是使⽤该⽅式来进⾏,具体的说明会在下⾯另外说明
3.3 Apache Maven⽅式
参见
这种⽅式适合Maven的项⽬。
3.4 Eclipse EclDmma Plugin⽅式
maven下载教程参见
该⽅式主要和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 -st.failure.ignore=true
其中,jacoco-maven-plugin后⾯跟的是jacoco的版本;【-st.failure.ignore=true】建议加上,否则如果单元测试失败,就会直接中断,不会产⽣.exec⽂件
执⾏以上命令后,会在当前⽬录下的target⽬录产⽣⼀个⽂件,该⽂件就是覆盖率的⽂件:
总体说来,这种⽅式⽐较简单,在与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="port.check.Limit">
<counter>METHOD</counter>
<value>COVEREDRATIO</value>
<minimum>0.50</minimum>
</limit>
<!-- 指定分⽀覆蓋到50% -->
<limit implementation="port.check.Limit">
<counter>BRANCH</counter>
<value>COVEREDRATIO</value>
<minimum>0.50</minimum>
</limit>
<!-- 指定類覆蓋到100%,不能遺失任何類 -->
<limit implementation="port.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></dataFile>
<outputDirectory>target/jacoco-ut</outputDirectory>
</configuration>
</execution>
在这⾥,我们将单元测试结果的输出⽬录确定为target/jacoco-ut⽬录下~