jacoco 生成单测覆盖率报告
一、jacoco 简介
jacoco 是一个开源的覆盖率工具,它针对的开发语言是 java。其使用方法很灵活,可以嵌入到 ant、maven 中;可以作为 Eclipse 插件;可以作为 javaAgent 探针监控 java 程序等等。
很多第三方的工具提供了对 jacoco 的集成,如 sonar、jenkins 等等。
jacoco 包含了多种尺度的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage)、分支覆盖(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstract methods)、类覆盖(classes),其含义如下:
- 行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
- 类覆盖率:度量计算 class 类文件是否被执行。
- 分支覆盖率:度量 if 和 switch 语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的分支数量。
- 方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
- 指令覆盖:计数单元是单个 java 二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全独立源码格式。
- 圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测试案例没有完全覆盖到这个模块。
二、jacoco 和 maven 集成
2.1 mvn 命令增加参数
在执行 mvn 命令时,加上 "org.jacoco:jacoco-maven-plugin:prepare-agent" 参数即可。示例:
mvn clean test org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent install -Dmaven.test.failure.ignore=true
其中,jacoco-maven-plugin 后面跟的是jacoco的版本。"-Dmaven.test.failure.ignore=true" 建议加上,否则如果单元测试失败,就会直接中断,不会产生 .exec 文件。
执行以上命令后,会在当前目录的 target 目录下产生一个jacoco.exec文件,该文件就是覆盖率的文件。
总体说来,这种方式比较简单,在与 jenkins 集成时也非常方便。
2.2 在 pom 文件中使用 jacoco 插件
首先,需要添加 jacoco 的依赖:
<properties>
<jacoco.version>0.8.5</jacoco.version>
</properties>
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<scope>test</scope>
</dependency>
接着,我们需要配置 jacoco-maven-plugin 和 maven-surefire-plugin 内容:
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>
-javaagent:${settings.localRepository}/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar=destfile=${project.basedir}/target/coverage-reports/jacoco-unit.exec
</argLine>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<!--检查代码覆盖率的插件配置-->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<configuration>
<!--指定生成.exec文件的存放位置-->
<destFile>target/coverage-reports/jacoco-unit.exec</destFile>
<!--Jacoco是根据.exec文件生成最终的报告,所以需指定.exec的存放路径-->
<dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
<includes>
<include>**/service/**</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>
</plugins>
<includes>或<excludes>标签的值应该是相对于目录 /classes/ 的编译类的类路径(而不是包名),用来指定哪些类需要进行单元测试。
另外 maven 的测试类需要遵循相应的规范命名,否则无法运行测试类,无法生成测试报告以及覆盖率报告。jacoco 使用的是 maven-surefire-plugin 插件,它的默认测试类名规范是:
- Test*.java:以 Test 开头的 Java 类;
- *Test.java:以 Test 结尾的 Java 类;
- *TestCase.java:以 TestCase 结尾的 Java 类;
或者可以在pom中自定义测试类:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Tests.java</include>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/Abstract*.java</exclude>
</excludes>
</configuration>
</plugin>
<rules> 指定筛选规则。
接着运行 mvn test 生成 index.html,即覆盖率报告
推荐阅读:
- ant 集成 jacoco:http://eclemma.org/jacoco/trunk/doc/ant.html
- eclipse 使用 jacoco:http://www.eclemma.org/
最新文章
- ORACLE 创建与使用视图
- Windows7+VS2012下OpenGL 4的环境配置
- 移动App-UI配制篇
- Java集合类汇总记录-- apache.commons4(TreeList)
- YAML书写规范
- nohup在linux中的挂起
- js——作用域和闭包
- Mongodb系列- CRUD操作介绍
- Ajax 请求头中常见content-type
- 从零开始搭建自己的VueJS2.0+ElementUI单页面网站(一、环境搭建)
- filezilla通过root账户远程连接管理ubuntu server服务器文件
- STL之heap与优先级队列Priority Queue详解
- 使用yocs_cmd_vel_mux进行机器人速度控制切换
- ERP项目实施记录06
- python QT 编程之路
- Codeforces 985 E - Pencils and Boxes
- poj_3253 Fence Repair
- [XPath] XPath 与 lxml (五)XPath 实例
- php跨域
- 教你如何清除 MyEclipse/Eclipse 中 Web Browser 和 Switch Workspace 的历史记录
热门文章
- python字符串列表元组序列操作
- 将class 编译后文件内容输入到 文本文件中的命令
- web.xml配置参数context-param和init-param的区别
- OS X10.10.3正式版和Xcode 6.3正式版下载
- 【Java】InnerClass 内部类
- Linux服务器压力测试总结(CPU、Memory、IO等)
- 19.SpringCloud实战项目-SpringCloud整合Alibaba-Nacos配置中心
- ThreadLocal 是什么鬼?用法、源码一锅端
- pytorch seq2seq模型中加入teacher_forcing机制
- python数据结构之栈的构建