‍我想我大抵是疯了,我喜欢上了写单元测试

前言

大家好我是聪。相信有不少的小伙伴喜欢写代码,但是对于单元测试这些反而觉得多此一举,想着我都在接口文档测过了!还要写什么单元测试!写不了一点!!

在这里插入图片描述

由于本人也是一个小小程序猿🙉,我以前也不喜欢写,最近给扔到了另一个 leader 的项目组里面,刚进去他给我下达的命令就是,你写的代码逻辑都要给我写上单元测试,而且要生成覆盖率报告给我!哇!我顿时就难受了,我之前都没有这么严格的,但是呢最近在我疯狂的写单元测试下,我发现我爱上了写单元测试。

单元测试的成长历程

第一次接触单元测试,还是在大学的测试课程里面。老师巴拉巴拉的讲,我虽然能听懂,但是不知道有啥用,课程作业反正做起来也没啥难度,反正能输出完事。

还有些接触单元测试就是平时学习视频的时候,跟着博主教的敲,这种简单的比如测试一个Mybatis 查询功能的单元测试,在我之前看来,soso 我直接用 swagger 文档请求岂不是更方便,代码都不用写咯。
在这里插入图片描述
直到我接触到了公司项目的单元测试,刚来公司看见之前的老项目单元测试都是成堆成堆的写,我也不是很理解,由于老项目的负责员工不知道换了多少代,新负责的都没调试过单元测试,直接代码改动,导致项目现在的单元测试很多环境配置都没及时更新,无法正常启动。当然也没人理会💥。

最近接触单元测试就是来到了新项目组这边的要求,我才重新看清了单元测试的重要性,请听我娓娓道来~

单元测试究竟能干嘛

单元测试究竟能干嘛这个问题时常疑惑着我,毕竟很多时候都是一个人从零到一进行开发或者接收项目能有好同事👋手把手教导,能大概了解整个项目的运行过程,直到我来到了一个用 AI 来生成业务的一个项目组里面,一切都发生了改变🌱。

我总结了单元测试的几点好处🔽:

  1. 能帮助接手项目的人快速了解项目的流程。

    这点真的很重要,我新接手项目的时候,就只有同事简单的说了几句话,我甚至只能知道这项目是 AI 提问回答流程,然后我直接懵逼,不过通过单元测试,我一步步看来下,倒是能大概了解了项目整体的逻辑。

  2. 降低代码出错的概率。

    每次在原有接口进行了一系列改动,在没有单元测试之前都要自己去接口文档手动尝试,甚至引来了测试一大堆指责。在使用单元测试之后,新增完的代码逻辑,直接新增对应功能的单元测试,直接全部执行,如果都能通过,这代码出问题的概率将会大大减少

  3. 不用担心影响数据库的数据。

    运行单元测试对于很多环境配置都可以直接使用独立的数据库,比如说 MySQL 的数据可以使用 H2 数据库,而 Redis 又可以使用 RedisServer 来创建。

单元测试的小技巧

对于单元测试,我总结了一些我自己使用中的小技巧,这些小技巧的使用往往能有奇效!

在这里插入图片描述

抽象测试类

@SpringBootTest(classes = { Application.class, },webEnvironment = SpringBootTest.WebEnvironment.MOCK,properties = {"spring.profiles.active=test"}
)
@Slf4j
@AutoConfigureMockMvc
public abstract class TestBase {protected static final Long TEST_GROUP_ID = 1L;@Autowiredprotected MockMvc mockMvc;}

这个测试类直接打上了需要使用的注解,后续使用直接继承即可,不用每次写上繁琐的注解,示例代码如下:

class Test extends TestBase {}

在 Spring 项目中使用 H2 代替 MySQL

  1. 引入 H2 依赖
    <dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>
  1. 通过 application-test.yml 来配置 H2 数据源
    spring:datasource:driver-class-name: org.h2.Driverschema: classpath:db/schema.sql #H2 数据库的建表语句data: classpath:db/data.sql #H2 数据库的插入数据语句url: jdbc:h2:mem:test #H2 数据库的默认连接地址username: testpassword: test
  1. 完成上面的步骤后,H2 数据库其实就已经替代掉 MySQL 了,但是要注意的是 MySQL 的 sql 语句与 H2 的有一丢丢的差别,语法可能并不适用,分享一个 IDEA 的插件就可以解决这个问题。

在这里插入图片描述

在单元测试中使用 Redis

有不少小伙伴总不喜欢在本地启动一个 Redis ,那么单元测试有什么解决办法呢!当然有!这就用到了 embedded-redis 的一个库,使用超级简单。

  1. 引入 embedded-redis 依赖
    <dependency><groupId>it.ozimov</groupId><artifactId>embedded-redis</artifactId><version>0.7.3</version><scope>test</scope><!-- 不排除掉slf4j的话 会冲突--><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion></exclusions></dependency>
  1. 直接在单元测试中编写
    private static RedisServer redisServer;@BeforeAllpublic static void beforeAll() {redisServer = RedisServer.builder().setting("maxheap 200m").port(6379).build();redisServer.start();}

Spring 单元测试 mock 数据

在我最近接收这个项目中调用 AI 花费是十分昂贵的,总不能单元每次都要调用 AI,不仅烧钱而且还有不确定性。有些需要 mock 的数据就可以使用 Mockito 这个强大的库来进行操作。

  1. 引入依赖(虽然说 SpringBoot 中会自带,但有时候我嫌弃他的版本不够高,但我又不能改 SpringBoot 依赖,就使用了覆盖)。
    <dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><scope>test</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-inline</artifactId><version>3.12.4</version><scope>test</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-junit-jupiter</artifactId><version>3.12.4</version><scope>test</scope></dependency>
  1. mock 要代理的服务。

    举个例子我要 mock 一个类的方法,首先可以直接使用 @MockBean 注解来代理,这个注解跟 @Autowired 注解类似,也是让代理创建。接着就是让单元测试执行前,先将这个 Spring 代理对象 mock 创建它,给他指定返回的数据内容。示例代码如下:

    @MockBeanprivate TestAgent testAgent;@BeforeEachpublic void beforeEach() {Mockito.when(testAgent.answer(any(), any())).thenAnswer(invocation -> {return "预期结果"});}

这里有几个注意的点:

1==> 这里的 any() 就是对应的输入任何数据,都要返回这个预期结果,其他的还可以自定义。
2==> 这里的代理只能返回一条数据或者里面自定义规则来返回不同数据,如果要每次都按顺序返回可以使用另一种方法 SideEffect 。
  1. 使用 SideEffect 来进行 mock 返回。

跟上面直接流程一样,但是不一样的是 thenAnswer 的后续处理,输入是一个 List 里面会按 List 内容的顺序依次返回。示例代码如下:

    List<String> list = new ArrayList();list.add("聪1");list.add("聪2");list.add("聪3");Mockito.when(testAgent.answer(Mockito.any(), Mockito.any())).thenAnswer(new SideEffect<>(list));

不想启动 Spring 容器

不想启动 Spring 容器,但是代码中用到了 Spring 的代理,SpringBoot 容器的启动十分的慢对于我的电脑,但是我要进行单元测试的部分其实并不涉及 Spring ,我直接进行 AI 请求访问而已,接着就可以使用我以下的方法,直接启动。

  1. 在单元测试中有移除 Spring 相关注解。

    移除掉注解后,在类上面打上 @ExtendWith(MockitoExtension.class) 注解,示例代码如下:

    @ExtendWith(MockitoExtension.class)class Test {....}
  1. 对于交由 Spring 创建的对象进行手动创建。

    示例代码如下:

    // 不用使用注解private TestAgent testAgent;@BeforeEachvoid setUp() {testAgent = new TestAgent();}
  1. 后面直接使用对象直接请求即可。

最后

在这里插入图片描述

我想我大抵是疯了,我喜欢上了写单元测试,单元测试写完根本停不下来,再未来我会总结更多的单元测试小方法,如果你们有自己总结的一些关于单元测试的方法,欢迎大家一起分享学习~ 最后最后!我是聪希望可以跟大家一起学习,我的 Github:github.com/lhccong 如果里面有你感兴趣的项目不妨给我点个星星⭐和关注🔥,未来我还会持续写新的好玩的小项目。

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

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

相关文章

关于HDFS、Hive和Iceberg

HDFS & Hive 如果我们将Hive比喻为储藏室&#xff0c;那么HDFS&#xff08;Hadoop Distributed File System&#xff09;就可以比作是储藏室所在的建筑物的地基和结构。 HDFS是一个分布式文件系统&#xff0c;它的设计目标是存储和管理海量数据。在我们的类比中&#xff…

华为云SQLServer 慢日志查看

作者&#xff1a;梦莱 1、背景 华为云目前只支持 SQLServer 登录数据库&#xff0c;不支持查看慢日志。对于开启慢日志的实例&#xff0c;也只能通过将慢日志下载到本地 再远程连接目标实例数据库查看。本篇将华为云 SQLServer 实例出现资源异常&#xff0c;排查问题的方案整…

QT5_C++基础

1. 什么是类和对象 C的类是一种构造类型&#xff0c;与C语言的结构体类似&#xff0c;但是进行了一些拓展&#xff0c;类的成员不但可以是变量&#xff0c;还可以是函数&#xff1b;通过类定义出来的变量也有特定的称呼&#xff0c;叫做“对象”类是创建对象的模板&#xff0c…

【java】力扣 合法分割的最小下标

文章目录 题目链接题目描述思路代码 题目链接 2780.合法分割的最小下标 题目描述 思路 这道题是摩尔算法的一种扩展 我们先可以找到候选人出来&#xff0c;然后去计算他在左右两边元素出现的次数&#xff0c;只有当他左边时&#xff0c;左边出现的次数2 >左边的长度&…

【 LCD1602显示屏】使用STC89C51控制1602显示、读写操作时序

文章目录 LCD1602显示概述&#xff1a;引脚说明控制指令接线 控制思路步骤 代码示例总结对databuffer dataShow;的理解 LCD1602显示 概述&#xff1a; LCD1602&#xff08;Liquid Crystal Display&#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602 即 32 字符…

Android Studio的xml文件的layout布局,在添加属性的过程中,没有自动补全代码问题的解决方案

在build.gradle文件中&#xff0c;把compileSdkVersion和targetSdkVersion两个参数改成32就好了。 参考&#xff1a;关于Android Studio的xml文件的layout布局&#xff0c;在添加属性的过程中&#xff0c;不显示提示词&#xff08;没有自动补全代码&#xff09;的问题的解决方…

SpringBoot增加网关服务

一、新建gateway项目 二、添加依赖 dependencies {implementation org.springframework.cloud:spring-cloud-starter-gateway:4.0.0 } 三、增加路由规则配置 一个web服务、一个service服务 bootstrap.yaml&#xff1a; server:port: 80 spring:application:name: gatewayc…

子树的重心

描述 输入一棵树,判断每一棵子树的重心是哪一个节点。 输入描述 第一行输入n,q。n表示树的节点个数&#xff0c;q表示询问次数 第二行n-1个数&#xff0c;分别表示从节点2开始&#xff0c;各节点的父亲节点。 后面q行&#xff0c;每行一个数x&#xff0c;表示询问当前以x为根…

【STM32 HAL库】I2S的使用

使用CubeIDE实现I2S发数据 1、配置I2S 我们的有效数据是32位的&#xff0c;使用飞利浦格式。 2、配置DMA **这里需要注意&#xff1a;**i2s的DR寄存器是16位的&#xff0c;如果需要发送32位的数据&#xff0c;是需要写两次DR寄存器的&#xff0c;所以DMA的外设数据宽度设置16…

入门C语言只需一个星期(星期二)

点击上方"蓝字"关注我们 01、算术运算符 int myNum = 100 + 50;int sum1 = 100 + 50; // 150 (100 + 50)int sum2 = sum1 + 250; // 400 (150 + 250)int sum3 = sum2 + sum2; // 800 (400 + 400) + 加 将两个值相加 x + y - 减 从另一个值中减去一个值 …

探索Python自然语言处理的新篇章:jionlp库介绍

探索Python自然语言处理的新篇章&#xff1a;jionlp库介绍 1. 背景&#xff1a;为什么选择jionlp&#xff1f; 在Python的生态中&#xff0c;自然语言处理&#xff08;NLP&#xff09;是一个活跃且不断发展的领域。jionlp是一个专注于中文自然语言处理的库&#xff0c;它提供了…

Ubuntu 安装 XRDP,替代系统自带RDP远程桌面

起因&#xff0c;Ubuntu的自带RDP远程桌面很好用&#xff0c;但很傻卵&#xff0c;必须登录。 而设置了自动登录也不能解开KEYRING&#xff0c;必须必须必须用GUI手动登录。 &#xff08;我远程我用头给你坐机子面前开显示器先登录&#xff1f;&#xff1f;&#xff09; 比起VN…

【HarmonyOS】HarmonyOS NEXT学习日记:三、初识ArkUI

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;三、初识ArkUI 忘掉HTML和CSS&#xff0c;ArkUI里构建页面的最小单位就是 “组件”&#xff0c;所以今天的目标就是认识一些常用的基础组件&#xff0c;以及他们的用法&#xff0c;对ArkUI形成一个基本认识。 基本组成 了解…

重塑七星拼团模式:共创互赢新生态

在当今商业模式的洪流中&#xff0c;七星拼团模式凭借其创新的激励机制与深植的互助文化&#xff0c;独树一帜&#xff0c;成为了推动市场活跃与消费者参与的新引擎。本文将重新构思并阐述该模式的三大支柱——直推奖赏、滑落回馈与循环成就奖&#xff0c;同时深入探讨其互助逻…

获取不重复流水号(java)

一&#xff1a;概述 很多业务场景都需要获取不重复的业务流水号&#xff0c;当微服务项目或服务多节点部署时&#xff0c;获取流水号场景使用分布式锁性能低下&#xff0c;可以基于数据库行锁实现获取不重复流水号。 二&#xff1a;创建流水号数据库 CREATE TABLE serial (i…

(error) MOVED 12706 192.168.187.139:6379

Redis操作set、get等操作出现如下错误 (error) MOVED 12706 192.168.187.139:6379 这种情况一般是因为启动 redis-cli 时没有设置集群模式所导致&#xff1b; 在开启集群后&#xff0c;redis-cli用普通用户登录无法操作集群中的数据&#xff0c;需要加上-c 用集群模式登录才可…

网络故障处理及分析工具:Wireshark和Tcpdump集成

Wireshark 是一款免费的开源数据包嗅探器和网络协议分析器&#xff0c;已成为网络故障排除、分析和安全&#xff08;双向&#xff09;中不可或缺的工具。 本文深入探讨了充分利用 Wireshark 的功能、用途和实用技巧。 无论您是开发人员、安全专家&#xff0c;还是只是对网络操…

k8s集群 安装配置 Prometheus+grafana

k8s集群 安装配置 Prometheusgrafana k8s环境如下&#xff1a;机器规划&#xff1a; node-exporter组件安装和配置安装node-exporter通过node-exporter采集数据显示192.168.40.180主机cpu的使用情况显示192.168.40.180主机负载使用情况 Prometheus server安装和配置创建sa账号&…

liosam复现

写在前面&#xff1a; 本机系统ubuntu22.04dockernvidia docker的环境 本机系统已经安装好nvidia驱动和cuda 使用liosam提供的镜像在22.04下实在是无法兼容。 所以在rosnoetic&#xff08;ubuntu20.04&#xff09;下进行配置&#xff0c;本教程中rosnoetic:v3.2是在docker hub&…

飞凌全志T527开发板modbus移植使用教程

交叉编译 进入到源码目录&#xff0c;执行 ./configure ac_cv_func_malloc_0_nonnullyes --hostaarch64-none-linux-gnu --enable-static --prefix/home/feng/文档/development/Linux/application/OK527N/libmodbus-3.1.10/install/其中–host为交叉编译器的前缀&#xff1b;…