Jacoco 单元测试配置
前言
编写单元测试是开发健壮程序的有效途径,单元测试写的好不好可以从多个指标考量,其中一个就是单元测试的覆盖率。单元测试覆盖率可以看到我们的单元测试覆盖了多少代码行、类、分支等。查看单元测试覆盖率可以使用一些工具帮助我们计算,如 Idea 自带的单元测试工具、Jacoco 等。Jacoco 是一款开源的单元测试工具,可以方便地整合到 Maven 中,提供了更丰富的配置及通过规则,可以生成单元测试报告,也可以方便地和自动化流水线整合。所以更推荐使用 Jacoco 作为单元测试工具。

配置
Maven 配置
可以通过 Maven 插件的方式整合 Jacoco,这样使用 mvn test 命令就可以生成 Jacoco 的测试报告了。
要配置 Jacoco,在 build 中添加 Jacoco 插件即可。
<build><plugins><!-- Jacoco --><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><configuration><!-- 排除文件 --><excludes><exclude>**/*Test.class</exclude><exclude>**/*Configuration.class</exclude><exclude>**/*Properties.class</exclude></excludes></configuration><executions><execution><id>jacoco-prepare-agent</id><goals><goal>prepare-agent</goal></goals></execution><execution><id>jacoco-report</id><phase>test</phase><goals><goal>report</goal></goals><configuration><!--定义输出的文件夹--><outputDirectory>target/test-report</outputDirectory><footer>火眼9988</footer></configuration></execution></executions></plugin></plugins>
</build>
上面定义了两个执行,prepare-prepare-agent 是准备 Jacoco 的运行时代理,而 jacoco-report 则是生成报告。
然后执行 mvn test 或通过 IDE 的 Maven 面板执行测试,完成后就会在指定目录下生成 jacoco 的报告。默认会生成 csv 和 html 格式的,csv 可以用于自动化流水线整合,而 html 的可以用浏览器打开查看。
定义通过规则
我们可以使用 Jacoco 方便地配置通过规则,只有满足特定规则才能通过测试,否则 test 执行会失败。
添加一个 execution 即可,在 rule 中定义我们的通过规则。
<execution><id>jacoco-check</id><goals><goal>check</goal></goals><configuration><rules><rule><element>BUNDLE</element><excludes><exclude>**/*Test.class</exclude><exclude>**/*Configuration.class</exclude><exclude>**/*Properties.class</exclude></excludes><limits><limit><counter>LINE</counter><value>COVEREDRATIO</value><minimum>0.8</minimum></limit></limits></rule></rules></configuration>
</execution>
上面定义了一条规则,包含一个限制:行覆盖率最低为 80%,这里可查看完整案例。
其中 rule 标签定义了一条规则,element 定义了规则对应的范围,可选值有:
- BUNDLE:表示整个模块,是默认值
- PACKAGE:表示代码包
- CLASS:表示类
- SOURCEFILE:源文件
- METHOD:表示方法
每个规则可以定义多条限制(limit),每个限制有一个特定的指标:
- INSTRUCTION:字节码指令,是最细粒度的指标,默认值
- LINE:代码行,一行代码可能有多个字节码指令
- BRANCH:分支,if 或 switch 包含了多个分支
- COMPLEXITY:圈复杂度,是代码复杂度的衡量标准,简单来说越大越复杂,需要的测试用例越多,详细算法可参考百科
- METHOD:方法
- CLASS:类
为每个指标的值定义一个最大值或最小值。
- TOTALCOUNT:总数
- COVEREDCOUNT:覆盖的数量
- MISSEDCOUNT:未覆盖的数量
- COVEREDRATIO:覆盖率,范围从 0.0 到 1.0, 默认值
- MISSEDRATIO:未覆盖率,范围从 0.0 到 1.0
excludes 标签定义要排除的文件。
例如,下面的规则定义了 INSTRUCTION 的覆盖率至少 80%,且没有类未被覆盖。
<rules><rule><element>BUNDLE</element><limits><limit><counter>INSTRUCTION</counter><value>COVEREDRATIO</value><minimum>0.80</minimum></limit><limit><counter>CLASS</counter><value>MISSEDCOUNT</value><maximum>0</maximum></limit></limits></rule>
</rules>
规则的详细配置可参考官方文档。
Idea IDE 配置
Idea IDE 除了支持自带的单元测试工具外,也支持使用 Jacoco。在配置中搜索 jacoco,Java 覆盖率中选择运行程序为 Jacoco 即可(不同的版本可能略有差别)。

配置后在 IDE 中执行单元测试时,选择第三项“使用覆盖率运行…”,运行完成后即可打开覆盖率面板,可查看当前单元测试的覆盖率,代码编辑器中也会以颜色标记。
排除测试
如果在代码中使用 Lombok,会有很多生成的代码,这些往往不需要测试覆盖,但如果不覆盖的话会影响测试覆盖率。Jacoco 可以自动排除 Lombok 的 @Generated 注解标记的类或方法。要让 Lombok 为生成的代码添加注解,可在项目的根目录中添加配置文件 lombok.config。
然后添加一行配置。
lombok.addLombokGeneratedAnnotation = true
这样生成的代码就会带上 @Generated 注解,被 Jacoco 排除计算了。当然,如果自己的代码不用测试,又不想影响覆盖率,也可以添加这个注解。这里可以查看实际案例。
多模块聚合报告
如果我们的项目有多个模块,Jacoco 会在每个模块下生成一个单独的报告,能不能生成一个聚合的报告呢?Jacoco 也贴心地为我们提供了生成聚合报告的方法。
首先添加一个模块,专门用于生成聚合报告,可以只有一个 pom.xml 文件。
在该模块的 pom 中添加如下配置,report-aggregate 用于生成聚合的报告。
<build><plugins><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><executions><execution><id>jacoco-report-aggregate</id><phase>test</phase><goals><goal>report-aggregate</goal></goals><configuration><outputDirectory>target/test-report</outputDirectory><footer>火眼9988</footer></configuration></execution></executions></plugin></plugins>
</build>
也不要忘记在 pom 的 dependencies 中添加其他模块作为依赖。这里可查看完整案例。

这样就可以获得我们项目的整体单元测试覆盖率了哦。
理解报告
如果能理解规则定义,报告就非常容易理解了。如上面的截图所示,报告表格各个列的意思为:
- Element:对应配置的 element,例如 BUNDLE 则是模块名
- Missed Instructions Cov:字节码指令覆盖率(下面的数字是未覆盖数量 of 总数)
- Missed Branches Cov:分支覆盖率(下面的数字是未覆盖数量 of 总数)
- Missed / Cxty:未覆盖的以及总的圈复杂度
- Missed / Lines:未覆盖的以及总的行数
- Missed / Methods:未覆盖的以及总的方法
- Missed / Classes:未覆盖的以及总的类
详情中可以看到每个文件的覆盖情况。其中,行的颜色代表的当前行的覆盖情况。红色代表未覆盖,黄色代码部分覆盖(分支条件没有全部执行到),绿色代码已覆盖。
赶紧整合试试吧!
相关文章:
Jacoco 单元测试配置
前言 编写单元测试是开发健壮程序的有效途径,单元测试写的好不好可以从多个指标考量,其中一个就是单元测试的覆盖率。单元测试覆盖率可以看到我们的单元测试覆盖了多少代码行、类、分支等。查看单元测试覆盖率可以使用一些工具帮助我们计算,…...
App Instance 架构示例
前言 在Unity程序设计过程中,我们处理的第一个对象是Application Instance。 它的主要职责是启动流程管理、卸载流程管理,次要职责是管理在内部的子系统生命周期。其他职责,提供或桥接应用程序的配置信息、及其他第三方接口。 它通常以单例的…...
【论文速读】| MoRSE:利用检索增强生成技术填补网络安全专业知识的空白
本次分享论文:MoRSE: Bridging the Gap in Cybersecurity Expertise with Retrieval Augmented Generation 基本信息 原文作者:Marco Simoni, Andrea Saracino, Vinod Puthuvath, Maurco Conti 作者单位:意大利比萨国家研究委员会信息学与…...
pip install albumentations安装下载超级细水管
albumentations 是一个用于图像增强的 Python 库,它提供了丰富的图像变换功能,可以用于数据增强,从而提高深度学习模型的泛化能力。 直接安装命令: pip install albumentations但是如果半夜遇到这种19kB/s的下载速度 为头发着想&…...
驱动开发系列07 - 驱动程序如何分配内存
一:概述 Linux 内核提供了丰富的内存分配函数、在本文中,我们将介绍在设备驱动程序中分配和使用内存的方法,以及如何优化系统的内存资源。由于内核为驱动程序提供了统一的内存管理接口。所以我们不会去讨论不同架构是如何管理内存的,文本不涉及分段、分页等问题,此外在本文…...
【Jackson】注解及其使用
Jackson库提供了多种注解(annotations),可以用来控制JSON序列化和反序列化的行为。这些注解允许你灵活地映射Java对象与JSON数据之间的关系。下面将详细介绍一些常用的Jackson注解及其用法。 1. JsonProperty 作用: 用于指定JSON属性与Java…...
LeetCode24 两两交换链表中的节点
前言 题目: 24. 两两交换链表中的节点 文档: 代码随想录——两两交换链表中的节点 编程语言: C 解题状态: 没画图,被绕进去了… 思路 思路还是挺清晰的,就是简单的模拟,但是一定要搞清楚交换的…...
AI OS
一,概念 AI OS, 或AI for OS,也就是近一年来伴随着人工智能的热度而衍生出的一个新的概念 - 人工智能操作系统。 为什么提出AI OS的概念? 这是因为人工智能技术的发展势头太过迅猛,尤其在深度学习、大模型等AI技术的突破后&…...
Dubbo 黑白名单机制详解
在微服务架构中,服务间的安全和流量控制是非常重要的。在众多 Java 微服务框架中,Apache Dubbo 作为一款高性能的 RPC 框架,提供了丰富的功能来管理服务调用。在 Dubbo 中,黑白名单机制是保障服务安全性和可控性的一个重要手段。本…...
配电房智能巡检机器人怎么选?
智能巡检机器人行业发展现状 2022年中国智能巡检机器人市场规模达到了15.66亿元。其中:电力智能巡检机器人规模14.88亿元,其他智能巡检机器人规模为0.78亿元。2023年中国智能巡检机器人市场规模约为19.71亿元。其中:电力智能巡检机器人规模…...
husky引发git commit报错的解决方案
在git commit的时候,有可能会遇到这样的报错,husky - pre-commit hook exited with code 1 (error) 出现这个问题的原因主要是,假如项目中采用 husky和lint-staged结合进行代码校验,那么,只要项目代码中有不规范的地方…...
韩顺平0基础学Java——第37天
p736-758 MySQL三层结构 1.所谓安装Mysql数据库,就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数据库。DBMS(database manage system) 2.一个数据库中可以创建多个表,以保存数据(信息)。 3.数据库管理系统(DBMS)、数据库和表的关系…...
Layer2区块链扩容方案(1)——总述
写在前面 这篇文章作为一个简单介绍,很多技术只是大致提及或者引用,之后会在详细学习后逐项解释。 补充知识 在了解扩容方案之前,我们最好了解一些相关的知识概念 EVM “EVM” 是“Ethereum Virtual Machine”(以太坊虚拟机&…...
AWS监控工具,监控性能指标
执行AWS监视是为了跟踪在AWS环境中主动运行的应用程序工作负载和资源,AWS监视器跟踪各种AWS云指标,以帮助提高在其上运行的应用程序的整体性能。 借助阈值突破警报系统,AWS应用程序监控在识别性能瓶颈来源方面起着至关重要的作用,…...
义务外贸wordpress独立站主题
健身器材wordpress网站模板 跑步机、椭圆机、划船机、动感单车、健身车、深蹲架、龙门架、健身器材wordpress网站模板。 https://www.jianzhanpress.com/?p4251 农业机械wordpress网站模板 植保机械、畜牧养殖机械、农机配件、土壤耕整机械、农业机械wordpress网站模板。 …...
初等数论精解【4】
文章目录 算术基本定理基础理论整数运算规则1. 加法性质2. 减法性质3. 乘法性质4. 除法性质5. 其他性质 整数运算的性质整数构成域吗 参考文献 算术基本定理 基础 任何一个大于1的整数可以被分解为素因数的连乘积。 a p 1 p 2 . . . . p n ≥ 1 ap_1\times p_2....\times…...
MongoDB教程(二十二):MongoDB固定集合
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、固定集…...
20240724----idea的Java环境卸载与安装
1.删除旧有的jdk https://blog.csdn.net/weixin_42168713/article/details/112162099 (补充:我把用户变量和java有关的都删了) 2.下载新的jdk百度网盘链接 链接:https://pan.baidu.com/s/1gkuLoxBuRAtIB1IzUTmfyQ 提取码…...
C语言 ——— 函数指针数组的讲解及其用法
目录 前言 函数指针数组的定义 函数指针数组的使用 前言 数组是存放一组相同类型数据的存储空间 关于指针数组的知识请见:C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 那么要将多个函数的地址存储到数组中,这个数组该如何定义…...
鸿蒙仓颉语言【cryptocj 库】(介绍与SHA、MD5、HMAC摘要算法)
cryptocj 库 介绍 cryptocj 是一个安全的密码库,包括常用的密码算法、常用的密钥生成和签名验证。 该库是对 C 语言的 openSSL 封装的仓颉加密算法 1 提供SHA、MD5、HMAC摘要算法。 前置条件:NA 场景: OHOS, Linuxÿ…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
