SpringBoot日常:集成代码覆盖率测试工具JaCoCo

news/2024/9/18 14:44:30/ 标签: spring boot, 代码覆盖率, 测试工具, java, maven

文章目录

    • 简介
    • 开始集成
      • 1、pom添加依赖
      • 2、pom添加插件
      • 3、业务代码
      • 4、单元测试代码
      • 5、开始测试
      • 6、查看结果
    • 如何排除不需要的路径?
    • 设置覆盖率目标并验证
    • JACOCO的不足
    • JACOCO改进版super-Jacoco
    • 代码覆盖率的知识扩展

简介

JaCoCo(Java Code Coverage)是一个开源的Java代码覆盖率工具,它主要用于评估Java程序的测试完整性。通过跟踪测试过程中执行的代码,JaCoCo能够提供多种覆盖率指标,帮助开发者确保代码的测试质量。这些指标包括指令覆盖、分支覆盖、圈复杂度、行覆盖、方法覆盖和类覆盖。

开始集成

1、pom添加依赖

<!-- 代码覆盖率 --><dependency><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>0.8.12</version> <scope>test</scope></dependency><!-- 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>4.8.0</version><scope>test</scope></dependency>

2、pom添加插件

	<build><pluginManagement><plugins><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>0.8.12</version></plugin></plugins></pluginManagement><plugins><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><executions><execution><goals><goal>prepare-agent</goal></goals></execution><execution><id>report</id><phase>test</phase><goals><goal>report</goal></goals></execution></executions></plugin></plugins></build>

3、业务代码

下面是一段用于单元测试的测试代码

java">public class UnitTestServiceImpl implements UnitTestService {@Overridepublic void compareTime() {LocalDate date1 = LocalDate.of(2024, 1, 1);LocalDate date2 = LocalDate.of(2024, 12, 31);int result = date1.compareTo(date2);if (result < 0) {System.out.println("date1 在 date2 之前");} else if (result == 0) {System.out.println("date1 和 date2 相同");} else {System.out.println("date1 在 date2 之后");}// 使用 isBefore 方法if (date1.isBefore(date2)) {System.out.println("date1 在 date2 之前");}// 使用 isAfter 方法if (date1.isAfter(date2)) {System.out.println("date1 在 date2 之后");}// 使用 equals 方法if (date1.equals(date2)) {System.out.println("date1 等于 date2 ");}}
}

4、单元测试代码

java">@RunWith(MockitoJUnitRunner.class)
public class TestTaskService {@InjectMocksprivate UnitTestServiceImpl unitTestService;@Testpublic void testOne() {unitTestService.compareTime();}
}

5、开始测试

编译项目运行单元测试
在这里插入图片描述

6、查看结果

测试完成后, target/site/jacoco/index.html 可以查看报告结果。
1、打开报告后找到自己的测试的service,从下图可以看出UnitTestService ,里面代码已经覆盖了 72%,分支已经覆盖了 40% 。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、点进UnitTestServiceImpl.java
Jacoco 在这里非常清楚地展示了不同级别的覆盖范围。它使用不同颜色的菱形图标来表示分支的代码覆盖率。并使用背景颜色来表示行的代码覆盖率

  • 绿色菱形表示所有分支均已被覆盖。
  • 黄色菱形意味着代码已被部分覆盖 , 一些未经测试的分支。
  • 红色菱形表示测试期间没有使用任何分支。
    在这里插入图片描述

如何排除不需要的路径?

日常的项目我们测试覆盖率,通常是有范围的,比如一些配置文件等,我们是不需要测试的。为了避免此类不相关的类影响代码覆盖率,我们可以使用Jacoco插件将其排除。这里以启动类为例

<plugin> <groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><configuration><excludes><exclude>cn/mycode/chen/myunit/MyUnitApplication.class</exclude></excludes></configuration>...
</plugin>

运行结果可以看到只包含一个启动类文件的 cn/mycode/chen/myunit 路径已经不见了
在这里插入图片描述

设置覆盖率目标并验证

假设我们使用 CI/CD 来部署代码,我们想验证已经完成了多少行代码覆盖率代码覆盖率百分比等。为此,我们需要在Jacoco 插件配置,在此执行中,我们添加了一条规则。规则是,对于 PACKAGE,计数应为 LINE,并且 LINE 覆盖率最小应为XX%。转到 Maven,选择 clean 和 verify 命令,然后选择 Run Maven Build 进行检查。
这里为了方便展示,已经将其他路径排除,只剩下service

 <execution><id>jacoco-check</id><goals><goal>check</goal></goals><configuration><rules><rule><element>PACKAGE</element><limits><limit><counter>LINE</counter><value>COVEREDRATIO</value><minimum>50%</minimum></limit></limits></rule></rules></configuration></execution>

在这里插入图片描述
测试一:
规则配置,配置覆盖率最小应为50%,执行maven的clean 和 verify 命令,检测结果失败
在这里插入图片描述

测试二:
规则配置,配置覆盖率最小应为20%,执行maven的clean 和 verify 命令,检测结果成功
在这里插入图片描述

JACOCO的不足

尽管JACOCO是一个功能强大的Java代码覆盖率工具,但仍存在一些不足之处,包括:

1、 配置和使用复杂
配置和使用JACOCO可能需要一些复杂的配置步骤,特别是对于初学者来说。一些开发人员可能需要花费一些时间来了解和掌握如何正确配置和使用JACOCO。

2、对动态代码的支持有限
JACOCO在对动态生成的代码或使用动态代理的代码的覆盖率分析方面支持有限。这可能导致在一些特殊场景下无法准确测量代码覆盖率

3、 无法跟踪部分覆盖代码
在某些情况下,JACOCO可能无法覆盖到一些特殊情况下的代码,导致无法准确测量覆盖率。这可能会对测试结果产生一定的误导。

4、缺乏对其他语言的支持
目前JACOCO主要支持Java语言,对于其他编程语言的支持有限。这可能限制了JACOCO在多语言项目中的应用。

5、对于大型项目的性能影响
对于大型项目,JACOCO的性能可能会受到一定影响。在收集覆盖率数据时,可能会导致一些额外的开销,特别是在执行大量测试用例的情况下。

虽然JACOCO有一些不足之处,但它仍然是一个广泛使用的代码覆盖率工具,并且在许多项目中发挥了重要作用。对于使用JACOCO的开发人员来说,了解这些不足并采取相应的措施来解决或规避这些问题是很重要的。

JACOCO改进版super-Jacoco

Super-Jacoco(滴滴开源项目)

代码覆盖率的知识扩展

代码覆盖率,是一种通过计算测试过程中被执行的源代码占全部代码的比例,进而间接度量软件质量的过程。它在保证测试质量的时候潜在保证实际产品的质量。可以基于此在程序中寻找到没有被测试用例测试过的地方,进一步创建新的测试用用例来增加覆盖率。按性质,它属于白盒测试的范畴,即主要依据源代码的内部结构来设计测试用例,通过设计不同的输入来测试软件的不同部分。

代码覆盖率通常分为四种:

  1. 语句覆盖率(Statement Coverage)
    衡量测试用例执行过程中覆盖到的代码语句比例。计算方法是统计被执行的代码语句数量与总代码语句数量的比例。

  2. 分支覆盖率(Branch Coverage)
    衡量测试用例执行过程中覆盖到的代码分支比例。计算方法是统计被执行的代码分支数量与总代码分支数量的比例。

  3. 条件覆盖率(Condition Coverage)
    衡量测试用例执行过程中覆盖到的条件语句比例。计算方法是统计被执行的条件语句数量与总条件语句数量的比例。

  4. 路径覆盖率(Path Coverage)
    衡量测试用例执行过程中覆盖到的代码路径比例。计算方法是统计被执行的代码路径数量与总代码路径数量的比例。

  5. 函数覆盖率(Function Coverage)
    衡量测试用例执行过程中覆盖到的函数或方法比例。计算方法是统计被执行的函数或方法数量与总函数或方法数量的比例。

  6. 边界值覆盖率(Boundary Value Coverage)
    衡量测试用例执行过程中覆盖到的边界值情况比例。计算方法是统计覆盖到的边界值测试用例数量与总边界值测试用例数量的比例。

  7. 错误处理覆盖率(Error Handling Coverage)
    衡量测试用例执行过程中覆盖到的错误处理情况比例。计算方法是统计覆盖到的错误处理测试用例数量与总错误处理测试用例数量的比例。


http://www.ppmy.cn/news/1516810.html

相关文章

mac苹果电脑搭建Python开发环境

公司的新电脑上要搭建Python的开发环境&#xff0c;由于给的是mac电脑&#xff0c;所以需要重新搭建python环境。 这里我首先考虑的还是miniconda。 由于官网下载太慢了&#xff0c;所以我选择从清华源下载&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/minico…

【精选】基于Python的热门旅游景点数据分析系统的设计与实现(南京旅游,北京旅游,旅游网站,全国各地旅游网站)

目录&#xff1a; 系统简介&#xff1a; 关键技术介绍 2.1 PYTHON语言简介 2.2 MySql数据库 2.3 DJANGO框架 2.4 Hadoop介绍 2.5 Scrapy介绍 2.6 B/S架构 系统总功能结构设计 系统详细实现&#xff1a; 6系统测试 系统测试的目的 软件测试过程 测试用例 为什么选择…

EasyExcel 导入计算公式导出展示字符串问题(SUM)

导出自定义表单 结果遇到 SUM函数 时 没有算出结果&#xff0c;直接展示的函数字符串 处理思路 拦截公式字符串 &#xff1a; 将对应的cell 设置 setCellFormula 字符串公式 然后cell类型设置为 CellType.FORMULA 重新配置 这样就解决了问题。 注意先设置CellFormula 然…

线程同步机制封装类

基础知识 RAII RAII全称是“Resource Acquisition is Initialization”&#xff0c;直译过来是“资源获取即初始化”. 是一个用于管理资源&#xff08;如内存、文件句柄、网络连接等&#xff09;的编程范式在构造函数中申请分配资源&#xff0c;在析构函数中释放资源。因为C的…

模板-C++

模板可以让你编写通用的、可重用的代码&#xff0c;而无需对每种数据类型编写重复的代码。模板分为两种主要类型&#xff1a;函数模板和类模板。 类模板 #include <iostream> #include <string> using namespace std;template< typename T> class PrintfEv…

网络安全售前入门03——审计类产品了解

目录 1.前言 2.堡垒机介绍 2.1产品架构功能 2.2应用场景 2.3部署形式 2.4产品价值 2.5选型依据 3.日志审计 3.1产品架构功能 3.2应用场景 3.3部署形式 3.4产品价值 3.5选型依据 后续 1.前言 为方便初接触网络安全售前工作的小伙伴了解网安行业情况,我制作一系统…

CodeQL 从零到精通第 3 部分:使用 CodeQL 进行安全研究

查询特定的库方法 在上一篇博文中,我们根据名称匹配函数调用、函数和方法调用,例如,在本[挑战](https://github.blog/2023-06-15-codeql-zero-to-hero-part-2-getting-started-with-codeql/#:~:text=Challenge 9—Find all functions with “command” as part of its name…

oc记录 - UIView.layer

UIView属性 layer 在 Objective-C 中&#xff0c;UIView 类有一个名为 layer 的属性&#xff0c;它返回一个 CALayer 对象。这个属性允许你直接操作视图的底层图形层&#xff0c;以便更精细地控制视图的外观和行为。 以下是 UIView 的 layer 属性的一些基本用法&#xff1a; …

使用LinkedHashMap实现固定大小的LRU缓存

使用LinkedHashMap实现固定大小的LRU缓存 1. 什么是LRU&#xff1f; LRU是"Least Recently Used"的缩写&#xff0c;意为"最近最少使用"。LRU缓存是一种常用的缓存淘汰算法&#xff0c;它的核心思想是&#xff1a;当缓存满时&#xff0c;优先淘汰最近最少…

在 FPGA 上实现以太网的“低级”指南

如今&#xff0c;我们日常的网络连接大多是通过无线方式进行的&#xff0c;因此很容易忘记以太网。但它仍然是一种有用的标准&#xff0c;是一个可靠的高吞吐量网络链接的好方法。为此&#xff0c;[Robert Feranec] 和 [Stacy Rieck] 编写了一个关于如何在 FPGA 上使用以太网的…

【Mysql】通过Keepalived搭建mysql双主高可用集群

一、环境信息 主机名ip操作系统mysql版本VIP&#xff08;虚拟ip&#xff09;hadoop01192.168.10.200centos7_x865.7192.168.10.253hadoop03192.168.10.202centos7_x865.7 二、mysql集群搭建 两台节点&#xff0c;如果未部署mysql服务&#xff0c;部署文档请看【Mysql】mysql…

模型 PMI思考法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。全面评估&#xff0c;三思而后行。 1 PMI思考法的应用 1.1 个人职业发展中的PMI思考法应用 张华是一位有志于提升自己职业竞争力的职场人士。他正在考虑报名参加一个专业认证课程&#xff0c;以期提…

在我的博士科研生活中,SCI的英语写作一直是我的挑战。

在我的博士科研生活中&#xff0c;SCI的英语写作一直是我的挑战。尽管我不断地努力提高自己的语言水平&#xff0c;但每当我提交文章后&#xff0c;审稿人或编辑总是会指出语言表达的不足之处&#xff0c;让我深感苦恼。于是&#xff0c;我开始寻找专业的润色服务来帮助我提升文…

python如何判断回文

打开JUPTER NOTEBOOK&#xff0c;新建一个PYTHON文档。 n input("Please input string: ") print(n) 我们首先让用户输入要进行判断的字符串&#xff0c;然后打印出来查看一下。 n input("Please input string: ") is_palidrome n[::-1] if n is_palid…

单片机中的存储器讲解

单片机中的存储器 目录 单片机中的存储器常用的存储器易失性存储器RAMSRAMDRAM 非易失性存储器ROMMask ROMPROMEPROME2PROMFlashNOR FlashNADN Flash 单片机里全局变量、局部变量、堆、栈的存储区域区域介绍栈区堆区静态区代码区常量区 内存分区分类四个区域 常用的存储器 易失…

QT常用UI控件

目录 一、引言 二、QT常用UI控件概述 1.按钮&#xff08;QPushButton&#xff09; 2.文本框&#xff08;QLineEdit&#xff09; 3.标签&#xff08;QLabel&#xff09; 4.下拉列表&#xff08;QComboBox&#xff09; 5.单选按钮&#xff08;QRadioButton&#xff09; 6.复选框…

【OpenCV】SIFT(尺度不变特征变换)算法?

关键词&#xff1a;SIFT Algorithm 文章目录 一、介绍二、什么是 SIFT 算法&#xff1f;2.1 SIFT 算法描述2.2 SIFT 算法示例 三、人类与机器识别3.1 SIFT 在计算机视觉中的应用3.2 SIFT 关键点的优势3.3 示例演示 四、关键点定位关键点选择 五、实验任务指导5.1 计算大小和方…

博弈论详解 2(SG函数 和 SG定理)

传送门&#xff1a;博弈论详解 1&#xff08;基本理论定义 和 Nim 游戏&#xff09; 什么是 SG 函数 接着上次的讲解&#xff0c;我们来了解一个更通用的模型。我们把每一个状态变成一个点&#xff08;在 Nim 游戏里就代表 a a a 数组&#xff09;&#xff0c;如果可以从一种…

安装Win10操作系统时找不到任何驱动器的解决方法

安装Win10操作系统时找不到任何驱动器的解决方法 有时候在一台新电脑上使用U盘安装系统时提示&#xff1a;我们找不到任何驱动器。 如下图所示&#xff1a; 解决方法&#xff1a; 一、按F12&#xff08;不同电脑进入Bios的按键可能不同&#xff09;将电脑进入Bios画面&#xf…

DataX(Doris同步数据到SelectDB)

背景 由于之前的doris数仓在本地的服务器&#xff0c;当数据量越来越大&#xff0c;服务器的性能达不到要求&#xff0c;查询数据经常超时&#xff0c;故需要把本地的doris数仓部署到云上&#xff0c;本文以阿里云为例&#xff0c;迁移工具使用的阿里开源的datax。 datax官方文…