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

news2024/11/15 21:38:50

文章目录

    • 简介
    • 开始集成
      • 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、业务代码

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

public class UnitTestServiceImpl implements UnitTestService {

    @Override
    public 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、单元测试代码

@RunWith(MockitoJUnitRunner.class)
public class TestTaskService {

    @InjectMocks
    private UnitTestServiceImpl unitTestService;

    @Test
    public 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.coloradmin.cn/o/2080238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一把手告诉你联盟营销白帽电商广告借力NewsBreak头条优势

揭秘美国NewsBreak头条新闻推广联盟营销白帽电商广告优势 在当今数字化浪潮中&#xff0c;电商行业竞争日益激烈&#xff0c;各大平台纷纷寻求创新的推广方式以吸引更多商家入驻并提升用户购物体验。NewsBreak&#xff0c;作为美国一款领先的新闻聚合平台&#xff0c;凭借其庞…

静态代理与动态代理的区别与选择

在当今软件开发领域&#xff0c;代理模式作为一种重要的设计模式&#xff0c;广泛应用于增强现有对象功能、控制访问权限以及实现远程调用等场景。本文旨在深入探讨静态代理与动态代理之间的核心区别&#xff0c;帮助开发者理解两者在实现机制、灵活性、性能表现及适用场景上的…

HTML静态网页成品作业(HTML+CSS)——西点蛋糕介绍(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

MyBatis缓存机制 ▎特殊符号处理

前言: MyBatis 的缓存机制通过一级缓存和二级缓存显著提升系统性能。一级缓存在 SQL 会话中减少重复查询&#xff0c;二级缓存跨会话共享查询结果&#xff0c;但引入了数据一致性和内存管理的挑战。开发者需平衡性能与数据准确性。此外&#xff0c;MyBatis 还提供了多种方法来…

力扣经典题目之->二叉树的前序遍历

一&#xff1a;题目 解释&#xff1a; 1&#xff1a; 题目的要求就是我们return 一个数组&#xff0c;该数组里面的元素及其顺序就是 前序遍历二叉树 的元素及其顺序 比如&#xff1a;示例1的树&#xff0c;前序遍历的顺序应该是1 2 3&#xff0c;那么return 的数组里面的元素…

Java面试题--JVM大厂篇之JVM大厂面试题及答案解析(8)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而我的博…

Linux开发环境搭建,虚拟机安装

开发环境搭建 一、VMware Workstation Pro软件简介 VMware Workstation Pro 是 VMware &#xff08;威睿公司&#xff09;发布的一代虚拟机软件&#xff0c;中文名称一般称 为 "VMware 工作站 ". 它的主要功能是可以给用户在单一的桌面上同时运行不同的操作系统…

安装WMware和Ubuntu并使用xShell连接

0、我的电脑配置 设备名称 hello 处理器 Intel(R) Core(TM) i7-10700K CPU 3.80GHz 3.79 GHz 机带 RAM 16.0 GB (15.9 GB 可用) 设备 ID 541EC230-9910-418C-9043-5FBBF8ED320C 产品 ID 00330-80000-00000-AA846 系统类型 64 位操作系统, 基于 x64 的处理器 笔和触控 没有可…

秃姐学AI系列之:残差网络 ResNet

目录 残差网络——ResNet 残差块思想 ResNet块细节 ResNet架构 总结 代码实现 残差块 两种 ResNet 块的情况 ResNet 模型 QA 由上图发现&#xff0c;只有当较复杂的函数类包含较小的函数类时&#xff0c;才能确保提高它们的性能。 对于深度神经网络&#xff0c;如果…

QGIS制图流程

在之前我们推送了QGIS的软件安装、插件安装、数据导入等基础操作&#xff0c;今天我们介绍一下QGIS的制图功能。QGIS的制图与ArcGIS Pro存在一定的区别&#xff0c;但是思路上相似。我们教程内容主要是参考QGIS官方文档&#xff1a; https://docs.qgis.org/3.34/en/docs/user_…

Android 中ebpf 的集成和调试

1. BPF 简介 BPF&#xff0c;是Berkeley Packet Filter的简称&#xff0c;最初构想提出于 1992 年。是一种网络分流器和数据包过滤器&#xff0c;允许早操作系统级别捕获和过滤计算机网络数据包。它为数据链路层提供了一个原始接口&#xff0c;允许发送和接收原始链路层数据包…

安卓中回调函数的使用

在Android开发中&#xff0c;回调函数是一种常见的编程模式&#xff0c;用于在某个任务完成时异步接收通知或数据。它们通常用于处理用户界面事件、完成网络请求、数据库操作或其他长时间运行的任务。回调&#xff08;Callback&#xff09;是一种允许某段代码通知另一段代码执行…

机器人学——机械臂轨迹规划-2

直线轨迹 线段转折点速度不连续 加速度状态讨论 double dot 多段直线轨迹&#xff0c;转折点利用二次方程转为圆弧 关键步骤 第一个线段处理 Vt V0 at , 此处的V0 0 , 利用函数连续性&#xff0c;左右速度相等&#xff0c;联立求解 sgn(x):符号函数 最后一个线段…

dubbo:dubbo服务负载均衡、集群容错、服务降级、服务直连配置详解(五)

文章目录 0. 引言1. dubbo负载均衡1.1 负载均衡算法1.2. dubbo负载均衡使用1.3 自定义负载均衡策略 2. dubbo服务容错2.1 8种服务容错策略2.2 自定义容错策略 3. dubbo服务降级&#xff08;mock&#xff09;4. dubbo服务直连5. 总结 0. 引言 之前我们讲解了dubbo的基本使用&am…

内部类java

内部类就是定义在一个类里面的类&#xff0c;里面的类可以理解成&#xff08;寄生&#xff09;&#xff0c;外部类可以理解成&#xff08;寄主&#xff09;。 //外部类 public class people{//内部类public class heart{} } 内部类的使用场景、作用 1.当一个事物的内部&…

STM32学习笔记3---ADC,DMA

目录 ADC模拟数字转换器 规则组的四种转换模式 AD单通道 AD多通道 常用代码函数相关 DMA直接存储器 存取&#xff08;访问&#xff09; 两个应用 DMA存储器到存储器的转运 ADCDMA ADC模拟数字转换器 stm32数字电路&#xff0c;只有高低电平&#xff0c;无几V电压的概念…

MySQL:常用函数

MySQL&#xff1a;常用函数 日期时间函数字符串函数数学函数加密函数 在MySQL中&#xff0c;存在许多现成的函数&#xff0c;可以简化部分操作&#xff0c;本博客讲解MySQL中的常用函数。 日期时间函数 current_date current_date函数用于输出当前的日期&#xff1a; curren…

一道关于php文件包含的CTF题

一、源码 这是index.php的页面。 点击login后会发现url里多了action的参数&#xff0c;那么我们就可以通过它来获取源码。 ?actionphp://filter/readconvert.base64-encode/resourcelogin.php 再通过base64的解码可以查看源码。 index.php源码&#xff1a; <?php erro…

【编码解码】CyberChef v10.18.9

下载地址 【编码解码神器】CyberChef v10.18.9 在线地址 CyberChef (gchq.github.io) 简介 CyberChef 是一个简单易用的网页应用&#xff0c;&#xff0c;包含了四百多种在线编解码工具。它在浏览器中执行各种“网络安全”操作。这些操作包括简单的 XOR 和 Base64 编码、复…

基于单片机的无线空气质量检测系统设计

本设计以STC89C52单片机为核心&#xff0c;其中包含了温湿度检测模块、光照检测模块、PM2.5检测模块、报警电路、LCD显示屏显示电路、按键输入模块和无线传输模块来完成工作。首先&#xff0c;系统可以通过按键输入模块设置当前的时间和报警值&#xff1b;使用检测模块检测当前…