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ÿ…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
