1.什么是jacoco?
JaCoCo,即 Java Code Coverage,是一款开源的 Java 代码覆盖率统计工具。支持 Ant 、Maven、Gradle 等构建工具,支持 Jenkins、Sonar 等持续集成工具,支持 Java Agent 技术远程监控 Java 程序运行情况,支持Eclipse、IDEA等IDE,提供HTML,CSV 等格式的报表导出,轻量级实现,对外部库和系统资源的依赖性小,性能开销小。 JaCoCo 支持从 JDK1.0 版本到 JDK1.8 版本 的 Java 类文件。但是,JaCoCo 工具所需的JRE 版本最小为 1.5。另外,1.6及以上版本的测试中的类文件必须包含有效的堆栈映射帧。
它有以下功能特性:
指令(C0)、分支(C1)、行、方法、类型和圈复杂度的覆盖分析。
基于 Java 字节码,因此也可以在没有源文件的情况下工作。
通过基于实时检测的Java 代理进行简单集成。通过 API 可以实现其他集成场景,例如自定义类加载器。
与框架无关:基于 Java VM 的应用程序都可以顺利集成,例如普通 Java 程序、OSGi 框架、Web 容器或 EJB 服务器。
与所有已发布的 Java 类文件版本兼容。
支持不同 JVM 语言。
多种报告格式(HTML、XML、CSV)。
在任何时间点,可以使用远程协议和 JMX 控制从覆盖代理请求执行数据转储。
用于收集和管理执行数据并创建结构化覆盖率报告的Ant 任务。
Maven 插件,用于收集覆盖信息并在 Maven 构建中创建报告。
非功能特性:
简单的使用和与现有构建脚本和工具的集成。
良好的性能,最小的运行时开销,尤其是对于大型项目。
对外部库和系统资源的依赖最小的轻量级实现。
综合文档。
完整的API文档(JavaDoc)和 其他工具集成的示例。
基于JUnit 测试用例的完整功能测试覆盖的回归测试。
2.代码工程
实验目标
实验单元测试覆盖率检测
pom.xml
<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"><parent><artifactId>springboot-demoartifactId><groupId>com.etgroupId><version>1.0-SNAPSHOTversion>parent><modelVersion>4.0.0modelVersion><artifactId>jacocoartifactId><properties><maven.compiler.source>8maven.compiler.source><maven.compiler.target>8maven.compiler.target>properties><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-autoconfigureartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-testartifactId><scope>testscope>dependency>dependencies><build><plugins><plugin><groupId>org.jacocogroupId><artifactId>jacoco-maven-pluginartifactId><version>0.8.6version><executions><execution><goals><goal>prepare-agentgoal>goals>execution><execution><id>jacoco-reportid><phase>testphase><goals><goal>reportgoal>goals>execution><execution><id>jacoco-checkid><goals><goal>checkgoal>goals><configuration><rules><rule><element>PACKAGEelement><limits><limit><counter>LINEcounter><value>COVEREDRATIOvalue><minimum>0.0minimum>limit>limits>rule>rules>configuration>execution>executions>plugin><plugin><groupId>org.apache.maven.pluginsgroupId><artifactId>maven-surefire-pluginartifactId><version>3.0.0-M5version><configuration><forkedProcessExitTimeoutInSeconds>60forkedProcessExitTimeoutInSeconds><forkCount>1forkCount>configuration>plugin>plugins>build>project>
controller
package com.et.jacoco.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;import java.util.Map;@RestControllerpublic class HelloWorldController {@RequestMapping("/hello")public Map<String, Object> showHelloWorld(){Map<String, Object> map = new HashMap<>();map.put("msg", "HelloWorld");return map;}}
测试类
package com.et.jacoco;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;import org.springframework.http.MediaType;import org.springframework.test.context.junit.jupiter.SpringExtension;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import static org.hamcrest.core.StringContains.containsString;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@ExtendWith(SpringExtension.class)@WebMvcTest@AutoConfigureMockMvcpublic class HelloControllerTest {@Autowiredprivate MockMvc mvc;@Testpublic void getHello() throws Exception {mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(content().string(containsString("HelloWorld")));}}
以上只是一些关键代码,所有代码请参见下面代码仓库
代码仓库
https://github.com/Harries/springboot-demo
3.测试
执行mvn clean test 会自动在项目目录:target/site/jacoco/index.html 即可查看到图形化的测试报告,如下:

点击链接,你可以查看每个类的代码覆盖情况,如下:

四.总结
本文简单介绍 JaCoCo 最基本使用和上手,希望你可以通过官网探索更多的高级功能,关于覆盖率给你一些建议:
覆盖率指标大多数情况下仅作为参考,不要用它作为考核指标
不要过于追求覆盖率指标,100% 的覆盖率也不能代表你的项目没有 BUG
4.引用
https://www.jacoco.org/jacoco/trunk/doc/index.html
http://www.liuhaihua.cn/archives/710819.html