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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/236651.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker | 自定义网络

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列 ✨特色专栏: MySQL学习 🥭本文内容: Docker | 自定义网络 📚个人知识库: 知识库,欢迎大家访问 1.前言 大家好,我是Leo哥…

【K8s】Kubernetes CRD 介绍(控制器)

文章目录 CRD 概述1. 操作CRD1.1 创建 CRD1.2 操作 CRD 2. 其他笔记2.1 Kubectl 发现机制2.2 校验 CR2.3 简称和属性 3. 架构设计3.1 控制器概览 参考 CRD 概述 CR&#xff08;Custom Resource&#xff09;其实就是在 Kubernetes 中定义一个自己的资源类型&#xff0c;是一个具…

three.js 入门三:buffergeometry贴图属性(position、index和uvs)

环境&#xff1a; three.js 0.159.0 一、基础知识 geometry&#xff1a;决定物体的几何形状、轮廓&#xff1b;material&#xff1a;决定物体呈现的色彩、光影特性、贴图皮肤&#xff1b;mesh&#xff1a;场景中的物体&#xff0c;由geometry和materia组成&#xff1b;textu…

【MySQL系列】Centos安装MySQL

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

电镀污水处理设备有哪些

电镀污水处理设备是用来处理电镀过程中产生的废水&#xff0c;并将废水中的有害物质去除&#xff0c;使其达到排放标准的设备。通常&#xff0c;电镀污水处理设备包括以下几种类型&#xff1a; 1. 预处理设备&#xff1a;预处理设备通常包括过滤器、物理方法和化学方法等。过滤…

智能优化算法应用:基于混合蛙跳算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于混合蛙跳算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于混合蛙跳算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.混合蛙跳算法4.实验参数设定5.算法结果6.…

Android集成科大讯飞语音识别与语音唤醒简易封装

目录 一、语音唤醒部分 1、首先在科大讯飞官网注册开发者账号 2、配置唤醒词然后下载sdk 3、选择对应功能下载 4、语音唤醒lib包全部复制到工程目录下 5、把语音唤醒词文件复制到工程的assets目录 6、复制对应权限到AndroidManifest.xml中 7、唤醒工具类封装 二、语音识…

Java第二十一章

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissio…

node.js express cors解决跨域

目录 什么是跨域 示例 postman请求 前端请求 cors中间件解决跨域 流程 配置cors参数 什么是跨域 跨域&#xff08;Cross-Origin&#xff09;是指在 Web 开发中&#xff0c;当一个网页的源&#xff08;Origin&#xff09;与另一个网页的源不同时&#xff0c;就发生了跨域…

【USRP】LFTX / LFRX

LFTX/LFRX 设备概述 LFTX 子板利用两个高速运算放大器来允许 0-30 MHz 的传输。该板仅接受实模式信号。LFTX 非常适合 HF 频段的应用&#xff0c;或使用外部前端来上变频和放大中间信号的应用。LFTX 的输出可以独立处理&#xff0c;也可以作为单个 I/Q 对进行处理。 主要特征…

Mac 如何删除文件及文件夹?可以尝试使用终端进行删除

MacOS 是 Mac 电脑采用的操作系统&#xff0c;你知道 Mac 如何删除文件吗&#xff1f;除了直接将文件或者文件夹拖入废纸篓之外&#xff0c;我们还可以采用终端命令的办法去删除文件&#xff0c;本文为大家总结了 Mac 删除文件方法。 为何使用命令行删除文件 在使用 Mac 电脑…

无人零售柜:快捷舒适购物体验

无人零售柜&#xff1a;快捷舒适购物体验 通过无人零售柜和人工智能技术&#xff0c;消费者在购物过程中可以自由选择商品&#xff0c;根据个人需求和喜好查询商品清单。这种自主选择的购物环境能够为消费者提供更加舒适和满意的体验。此外&#xff0c;无人零售柜还具有节约时间…

字符统计[c]

#include<stdio.h> #include<string.h> int main() {int a,b,c;abc0;char s[100];int i0;while(1){i;scanf("%c",&s[i]);if(s[i]?)break;}for(int k1;k<i;k){if(s[k]>48&&s[k]<57){a;//数字}else if((s[k]>65&&s[k]<…

我的 CSDN 三周年创作纪念日:2020-12-12

本人大叔一枚&#xff0c;自1992年接触电脑&#xff0c;持续了30年的业余电脑发烧爱好者&#xff0c;2022年CSDN博客之星Top58&#xff0c;阿里云社区“乘风者计划”专家博主。自某不知名财校毕业后进入国有大行工作至今&#xff0c;先后任职于某分行信息科技部、电子银行部、金…

12月11日作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

Vue 创建一个 Vue 应用

下载安装Node.js Node.Js中文网Node.jsNode.Js中文网 按步骤安装到你想安装的目录即可 安装完毕在控制台输入node 或者node -v测试 将Node.js下载路径改为国内镜像站 npm config set registryhttps://registry.npm.taobao.org/ 查看镜像 npm config get registry 创建项目 …

【C语言】【数据结构】自定义类型:结构体

引言 这是一篇对结构体的详细介绍&#xff0c;这篇文章对结构体声明、结构体的自引用、结构体的初始化、结构体的内存分布和对齐规则、库函数offsetof、以及进行内存对齐的原因、如何修改默认对齐数、结构体传参进行介绍和说明。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&am…

雨云服务器快速搭建Cloudreve网盘网站并挂载雨云对象存储的教程

雨云服务器快速搭建Cloudreve网盘网站并挂载雨云对象存储的教程。本教程的Cloudreve安装就直接用雨云云服务器的预安装APP功能了&#xff0c;然后安装宝塔面板用于反代&#xff0c;如果不需要域名访问功能也可以直接IP端口来访问。 其他建站教程&#xff1a;https://blog.zeru…

C++——继承

目录&#xff1a; 继承的概念及定义 面向对象的三个基本特征&#xff1a;封装、继承、多态。在前面的讲解中封装已经用的很多了&#xff0c;那么接下来的两篇文章就来介绍一下继承和多态。 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&am…

记录 | xftp远程连接两台windows

1、打开openssh 设置 -> 应用 -> 可选功能 -> 添加功能 -> OpenSSH 客户端&#xff0c;将 ssh 客户端安装将两台电脑的 ssh 开启&#xff0c;cmd 中输入 net start sshd2、配置 win10 账号密码 3、进行 xftp 连接