当前位置: 首页 > news >正文

JDK多版本集成 Jacoco 配置指南

JDK多版本集成 Jacoco 配置指南

本篇相关 JDK 版本配置如下:

  • JDK8

  • JDK11

  • JDK17

Jacoco 是什么

Jacoco 是一个用于Java程序的代码覆盖率报告工具。它通过动态分析(在代码执行时收集数据)来生成代码覆盖率报告文件。Jacoco 支持多种覆盖率标准,包括行覆盖率、分支覆盖率和复杂度覆盖率。

代码覆盖率

代码覆盖率是指单元测试覆盖了多少程序代码,是评估测试的有效性和代码质量的关键指标。

代码覆盖率的重要性
  • 质量保证:代码覆盖率是衡量软件测试完整性的关键指标。高覆盖率意味着代码的大部分都经过了测试,减少了出错的可能性。

  • 发现未测代码:通过查看覆盖率报告文件能够识别哪些代码没有被测试到,从而可以针对性地增加测试用例。

  • 重构和维护假如某一个方法不能单测,那么说明这个方法是需要重构的。在重构过程中,高覆盖率有助于减少引入新错误的风险。

为什么要用 Jacoco

  • 易于集成:Jacoco 可以集成到Java项目中,支持Maven、Gradle等构建工具。

  • 非侵入式:Jacoco 在运行时收集信息,无需修改代码。

  • 多种覆盖率指标:Jacoco 提供了行覆盖、分支覆盖等多种覆盖率指标。

  • 生成详细报告:能生成单测覆盖率报告,浏览器打开index.html即可看到哪些代码被覆盖,整体覆盖率多少等。

JDK8 集成 Jacoco 生成单测覆盖率报告

版本

  • Java:8

  • Spring Boot:2.2.2.RELEASE

  • Jacoco:0.8.10

pom.xml依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>
</dependency>静态Mock依赖,用于测试静态方法
<dependency><groupId>org.powermock</groupId><artifactId>powermock-api-mockito2</artifactId><version>2.0.9</version>
</dependency>
<dependency><groupId>org.powermock</groupId><artifactId>powermock-module-junit4</artifactId><version>2.0.9</version>
</dependency>

Tips:powermock 2.0.9 版本不能与 junit5 集成。

pom.xml插件配置

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>1.8</source><target>1.8</target></configuration>
</plugin>
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.0.0-M5</version><configuration><!-- 执行单测 --><skip>false</skip></configuration>
</plugin>
<plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>${org.jacoco.version}</version><configuration><includes><include>com/**/*</include></includes></configuration><executions><execution><id>pre-test</id><goals><goal>prepare-agent</goal></goals></execution></executions>
</plugin>

pom.xml启动类构建配置

<build><finalName>项目名</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>${org.jacoco.version}</version><executions><execution><id>report-aggregate</id><phase>test</phase><goals><goal>report-aggregate</goal></goals></execution></executions></plugin></plugins>
</build>

单元测试代码必须写在如下工程目录:src/test/java,不允许写在业务代码目录下。源码构建时会跳过此目录,而单元测试框架默认是扫描此目录。

单测怎么写,参考之前的文章:Mockito单测之道

运行命令生成单测报告:mvn test。

在项目编译后的 target 文件夹中找到生成单测覆盖率报告文件:index.html

点击可以看到覆盖率相关参数:

指标参数解释:

  • Instructions(指令)
    • 指令覆盖率是基于最低级别的代码执行——Java字节码指令。即使一行代码包含了多个Java字节码指令,这些指令可能会部分被执行。

  • Branches(分支)
    • 衡量在条件语句(如 ifswitch)中执行的分支数。用于评估条件语句的覆盖程度。

  • Cyclomatic Complexity(圈复杂度)
    • 测试用例覆盖了多少种可能的执行路径或决策点(如if条件、循环等)。

  • Lines(行)
    • 有多少行代码被测试用例执行过。

  • Methods(方法)
    • 检查类中的每个方法是否至少被测试用例执行过一次。

  • Classes(类)
    • 如果一个类中至少有一个方法被测试覆盖,那么这个类就被认为是覆盖的。

JDK11 集成 Jacoco 生成单测覆盖率报告

版本

  • Java:11

  • Spring Boot:2.2.2.RELEASE

  • Jacoco:0.8.10

配置调整较少,但对应的单测代码需要微调。

pom.xml插件配置

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>11</source><target>11</target></configuration>
</plugin>
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.0.0-M5</version><configuration><!-- 执行单测 --><skip>false</skip></configuration>
</plugin>
<plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>${org.jacoco.version}</version><configuration><includes><include>com/**/*</include></includes></configuration><executions><execution><id>pre-test</id><goals><goal>prepare-agent</goal></goals></execution></executions>
</plugin>

pom.xml启动类构建配置

<build><finalName>mgt-system-web</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>${org.jacoco.version}</version><executions><execution><id>report-aggregate</id><phase>test</phase><goals><goal>report-aggregate</goal></goals></execution></executions></plugin></plugins></build>

JDK17 集成 Jacoco 生成单测覆盖率报告

版本

  • Java:17

  • Spring Boot:3.0.2

  • Jacoco:0.8.10

pom.xml插件配置

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.xinluo.flup.FlupDddApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.2.2</version><configuration><skip>false</skip></configuration></plugin><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>${org.jacoco.version}</version><configuration><includes><include>com/**/*</include></includes></configuration><executions><execution><id>pre-test</id><goals><goal>prepare-agent</goal></goals></execution></executions></plugin></plugins><!-- 打包xml --><resources><resource><directory>src/main/java</directory><filtering>false</filtering><includes><include>**/xml/*.xml</include></includes></resource><resource><directory>src/main/resources</directory></resource></resources>
</build>

pom.xml启动类构建配置

<build><finalName>flup-web</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><includeSystemScope>true</includeSystemScope></configuration></plugin><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>${org.jacoco.version}</version><executions><execution><id>report-aggregate</id><phase>test</phase><goals><goal>report-aggregate</goal></goals></execution></executions></plugin></plugins>
</build>

总结

上述JDK8、JDK11 版本配置均能在 Jenkins 上集成单测。有个注意的点是:本地 JDK 版本应和 Jenkins 上配置的 JDK 版本一致。

从实战来看,编写单测的时间不亚于编码的时间,但从长远来看,对于整个软件的开发过程是有益的。单测也是确保代码质量和可维护性的关键工具。

Jacoco 在不同版本的 JDK 上的兼容性和在 Jenkins 上的集成能力成为我们优先考虑的覆盖率工具。从公司领导的角度来看,他们也需要这样的覆盖率指标来看单测标准的落地情况。然而,作为技术人员,我们不是为了堆覆盖率完成覆盖率数值的增长。在我来看,其本质还是通过单测(自测)提前发现问题,减少bug,尽量的去避免将来可能出现的生产事故。

参考资料

  • Jacoco官网:https://www.jacoco.org/

相关文章:

JDK多版本集成 Jacoco 配置指南

JDK多版本集成 Jacoco 配置指南 本篇相关 JDK 版本配置如下&#xff1a; JDK8 JDK11 JDK17 Jacoco 是什么 Jacoco 是一个用于Java程序的代码覆盖率报告工具。它通过动态分析&#xff08;在代码执行时收集数据&#xff09;来生成代码覆盖率报告文件。Jacoco 支持多种覆盖率标…...

容器及容器调度(云)

在云计算中&#xff0c;容器是一种轻量级、可执行的软件包&#xff0c;它包含应用程序及其全部依赖项&#xff0c;包括库、二进制文件、配置文件等。容器与虚拟机不同&#xff0c;因为它们不需要包含完整的操作系统&#xff1b;相反&#xff0c;所有容器都共享主机操作系统的内…...

实验七 子网的划分

实验七 子网的划分 实验目的掌握划分子网的方法实验内容划分给定IP地址的子网将划分后的子网应用到网络环境中实验要求每位同学从下表中至少选择一行进行子网划分,并填写所选择行的剩余部分。(注意:子网号全0的不用)标准IP地址 要求划 分子网数 借用的主机位数 子网掩码 第…...

Proteus仿真--射击小游戏仿真设计

本文介绍基于proteus射击小游戏仿真设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 K1-K4为4个按键&#xff0c;用于上移、下移、确认等&#xff0c;模拟单机游戏 仿真运行视频 Proteus仿真--射击小游戏仿真设计 附完整Proteus仿真资料代码资料 …...

docker的资源控制:

docker的资源控制&#xff1a; 对容器的使用宿主机的资源进行限制 cpu 内存 磁盘i/0 docker使用linux自带的功能cgroup control grouos是linux内核系统提供的一种可以限制&#xff0c;记录&#xff0c;隔离进程所使用的物理资源 control grouos是linux内核系统提供的一种可…...

Leo赠书活动-13期 【以企业架构为中心的SABOE数字化转型五环法】文末送书

Leo赠书活动-13期 【以企业架构为中心的SABOE数字化转型五环法】文末送书 ✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客…...

【人工智能 | 知识表示方法】状态空间法 语义网络,良好的知识表示是解题的关键!(笔记总结系列)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…...

华清远见嵌入式学习——QT——作业1

作业要求&#xff1a; 代码&#xff1a; ①&#xff1a;头文件 #ifndef LOGIN_H #define LOGIN_H#include <QWidget> #include <QLineEdit> //行编辑器类 #include <QPushButton> //按钮类 #include <QLabel> //标签类 #include <QM…...

MYSQL练习创建存储函数和存储过程

创建数据表&#xff0c;信息如下&#xff1a; 表结构&#xff1a; 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) 否 否 是 否 否 glass VARCHAR(50) 否 否 是 否…...

Java基础语法面试题

数据类型 Java有哪些数据类型 定义&#xff1a;Java语言是强类型语言&#xff0c;对于每一种数据都定义了明确的具体的数据类 型&#xff0c;在内存中分配了不同大小的内存空间。 分类&#xff1a; 基本数据类型 数值型 整数类型(byte,short,int,long) 浮点类型(float,dou…...

结合ColorUI组件开发微信小程序

1.自定义组件生命周期函数&#xff1a; Component({data: {},attached() {console.log("自定义组件生命周期函数 attached--先执行");this.getPos();},ready() {console.log("ready生命周期函数---在attached之后执行")},methods: {getPos() {var that th…...

如何搭建废品上门回收小程序

如今&#xff0c;随着环境保护意识的增强&#xff0c;废品的回收和再利用变得越来越重要。为了方便人们进行废品回收&#xff0c;搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …...

蓝牙配对、连接和删除汇总

目的&#xff1a;处理PC连接蓝牙设备的配对、连接和删除操作&#xff0c;以及常见故障。 命令行配对蓝牙设备并连接 要求&#xff1a;配对BLUET043蓝牙&#xff0c;密码为4444&#xff0c;然后连接该蓝牙。操作步骤如下&#xff1a; Step1.下载 修复工具&#xff0c;然后安装…...

Linux网络——高级IO

目录 一.五种IO模型 1.阻塞式IO 2.非阻塞式IO 3.信号驱动IO 4.多路转接IO&#xff1a; 5.异步IO 二.同步通信 vs 异步通信 三.设置非阻塞IO 1.阻塞 vs 非阻塞 2.非阻塞IO 3.实现函数SetNoBlock 四.I/O多路转接之select 1.初识select 2.select函数原型 3.socket就绪…...

Java注解详解

概述 注解是对程序代码进行标注和解释的一种方式。在Java中&#xff0c;注解提供了一种元数据形式&#xff0c;能够在程序中嵌入有关程序的信息&#xff0c;以便进行进一步的处理。注解通过使用符号来声明&#xff0c;如Override、Deprecated等。 注解和注释的区别 注释&…...

Android wifi 框架以及Enable流程

Android P相比于Android O的变化 多了WifiStateMachinePrime&#xff08;状态机的前处理机制&#xff09;&#xff0c;wifiService的相关cmd 不再是直接send 给WifiStateMachine&#xff0c;而是被送到WifiStateMachinePrime先进行处理后&#xff0c;再送往WifiStateMachine也…...

十五、机器学习进阶知识:K-Means聚类算法

文章目录 1、聚类概述2、K-Means聚类算法原理3、K-Means聚类实现3.1 基于SKlearn实现K-Means聚类3.2 自编写方式实现K-Means聚类 4、算法不足与解决思路4.1 存在的问题4.2 常见K值确定方法4.3 算法评估优化思路 1、聚类概述 聚类&#xff08;Clustering&#xff09;是指将不同…...

软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

目录 1、问题说明 2、使用Windbg查看崩溃时详细的函数调用堆栈...

搭乘“低代码”快车,引领食品行业数字化转型全新升级

数字化技术作为重塑传统行业重要的力量&#xff0c;正以不可逆转的趋势改变着企业经营与客户消费的方式。 在近些年的企业数字化服务与交流过程中&#xff0c;织信团队切实感受到大多数企业经营者们从怀疑到犹豫再到焦虑最终转为坚定的态度转变。 在这场数字化转型的竞赛中&a…...

Axure->Axure安装,Axure菜单栏和工具栏功能介绍,页面及概要区

Axure安装Axure菜单栏和工具栏功能介绍&#xff0c;页面及概要区 1.Axure安装 即时设计 - 可实时协作的专业 UI 设计工具 (js.design) 点击上方下载安装⬆ 打开软件点击帮助->管理授权-> 被授权人 Axure 授权密钥:gjqpIxSSUUqFwPoZPi8XwBBhRE2VNmOQsrord0JqShk4QCXxrw6…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...