【单元测试】Spring Boot 的测试库

Spring Boot 的测试库

  • 1.了解回归测试框架 JUnit
  • 2.了解 assertThat
  • 3.了解 Mockito
  • 4.了解 JSONPath
  • 5.测试的回滚

单元测试unit test)是为了检验程序的正确性。一个单元可能是单个 程序对象方法 等,它是应用程序的最小可测试部件。

单元测试的必要性如下:

  • 预防 Bug。
  • 快速定位 Bug。
  • 提高代码质量,减少耦合。
  • 减少调试时间。
  • 减少重构的风险。

Spring Boot 提供了 spring-boot-starter-test 启动器。通过它,能引入一些有用的测试库,如下所示。

  • Spring Test & Spring BootTest:Spring Boot 提供的应用程序功能集成化测试支持。
  • Junit:Java 应用程序单元测试标准类库。
  • AssertJ:轻量级的断言类库。
  • Hamcrest:对象匹配器类库。
  • Mockito:Java Mock 测试框架。
  • JsonPath:JSON 操作类库。
  • JSONassert:用于 JSON 的断言库。

1.了解回归测试框架 JUnit

JUnit 是对程序代码进行单元测试的 Java 框架。它用来编写自动化测试工具,降低测试的难度、减少烦琐性,并有效避免出现程序错误。

JUnit 测试是 白盒测试(因为知道测试如何完成功能和完成什么样的功能)。要使用 JUnit,则只需要继承 TestCase 类。

JUnit 提供以下注解。

注解
解释
@BeforeClass在所有测试单元前执行一次,一般用来初始化整体的代码。
@AfterClass在所有测试单元后执行一次,一般用来销毁和释放资源。
@Before在每个测试单元前执行,一般用来初始化方法。
@After在每个测试单元后执行,一般用来回滚测试数据
@Test编写测试用例。
@Test(timeout=1000)对测试单元进行限时。这里的 1000 1000 1000 表示若超过 1 s 1s 1s 则超时测试失败。
@Test(expected=Exception.class)指定测试单元期望得到的异常类。如果执行完成后没有抛出指定的异常,则测试失败。
@lgnore执行测试时将忽略掉此方法。如果用于修饰类,则忽略整个类。
@RunWith在 JUnit 中有很多 Runner,它们负责调用测试代码。每个 Runner 都有特殊功能,应根据需要选择不同的 Runner 来运行测试代码。

2.了解 assertThat

Unit 4.4 结合 Hamcrest 提供了一个新的断言语法 assertThat。使用 assertThat 的一个断言语句结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想。

(1)assertThat 的基本语法

assertThat([value], [matcher statement])
  • value:要测试的变量值。
  • matcher statement:如果 value 值与 matcher statement 所表达的期望值相符,则测试成功,否则失败。简单地说,就是 “两个值进行比较”。

(2)一般匹配符

  • assertThat(testNumber,allOf( greaterThan(5),lessThan(8));allOf 表示,所有条件必须都成立,测试才能通过。
  • … …

(3)字符串相关匹配符

  • assertThat(testString,is("longzhiran"));is 表示,如果前面待测的 testString 等于后面给出的 String,则测试通过。
  • … …

(4)数值相关匹配符

  • assertThat(testDouble,closeTo(1.0,8.8));closeTo 表示,如果测试的浮点型数 testDouble 在 1.0 ~ 8.8 之间,则测试通过。
  • … …

(5)collection 相关匹配符

  • assertThat(mObject,hasEntry("key","value");:hasEntry 表示,如果测试的 Map 对象 mObect 含有一个键值为 key 对应元素值为 value 的 Entry 项,则测试通过。
  • … …

3.了解 Mockito

Mockito 是 GitHub 上使用最广泛的 Mocking 框架。它提供简洁的 API 用来测试。Mockito 简单易学、可读性强、验证语法简洁。
在这里插入图片描述
与 JUnit 结合使用,Mockito 框架可以创建和配置 Mock 对象。

4.了解 JSONPath

JSONPath 是 xPath 在 JSON 中的应用。它的数据结构通常不一定有根元素,它用一个抽象的名字 $ 来表示 最外层对象,而且允许使用通配符 * 表示所有的子元素名和数组索引。

JSONPath 表达式可以使用 . 符号解析 JSON,如以下代码:

$.person.card[0].num

或使用 [] 符号,如以下代码:

$['person']['card'][0]['num']

5.测试的回滚

在单元测试中可能会产生垃圾数据,可以开启事务功能进行回滚。在方法或类头部添加注解 @Transactional 即可。用法见以下代码:

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class CardRepositoryTest {
    @Autowired
    private CardRepository cardRepository;
    @Test
    public void testRollBack(){
        //查询操作
        Card card = new Card();
        card.setNum(3);
        cardRepository.save(card);
    }
}

上述代码在类上添加了注解 @Transactional,测试完成后就会回滚,不会产生垃圾数据。如果要关闭回滚,则只要加上注解 @Rollback(false) 即可。

🚀 如果使用的数据库是 MySQL,有时会发现加了注解 @Transactional 也不会回滚,多数情况下是因为默认引擎不是 InnoDB。

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

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

相关文章

ATMEGA16读写24C256

代码&#xff1a; #include <mega16.h> #include <stdio.h> #include <i2c.h> #include <delay.h> // Declare your global variables here #define EEPROM_BUS_ADDRESS 0xa0 #asm.equ __i2c_port0x15.equ __sda_bit1 .equ __scl_bit0 #endasm uns…

课设--学生成绩管理系统(二)

欢迎来到 Papicatch的博客 目录 &#x1f40b;引言 &#x1f988;编写目的 &#x1f988;项目说明 &#x1f40b;产品介绍 &#x1f988;产品概要说明 &#x1f988;产品用户定位 &#x1f988;产品中的角色 &#x1f40b; 产品总体业务流程图 &#x1f40b; 产品功…

Pixel Transformer:用像素代替补丁可以提升图像分类精度

在快速发展的人工智能领域&#xff0c;ViTs已成为各种计算机视觉任务的基础模型。ViTs通过将图像划分为小块并将这些小块作为标记来处理图像。6月刚发布一篇论文&#xff0c;引入了一种新颖的方法&#xff0c;即像素级Transformers&#xff0c;它通过将单个像素视为令牌来挑战这…

【深度学习】基于EANet模型的图像识别和分类技术

1.引言 1.1.EANet模型简介 EANet&#xff08;External Attention Transformer&#xff09;是一种深度学习模型&#xff0c;它结合了Transformer架构和外部注意力机制&#xff0c;特别适用于图像分类等计算机视觉任务。以下是关于EANet的详细解释&#xff1a; 1.1.1 定义与背…

2024年了,苹果可以通话录音了

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 6月11日凌晨&#xff0c;苹果在WWDC24大会上&#xff0c;密集输出了酝酿多时的AI应用更新。苹果对通话、对话、图…

从传统到智能:数字孪生在火电厂中的应用

通过图扑 HT 可视化技术数字孪生正在运行的火力发电厂&#xff0c;搭建数字化运营平台&#xff0c;对发电厂进行工厂式精细化的数字化管理&#xff0c;提升企业对整个发电厂业务进行数字化管理能力。

virtualbox扩展磁盘

使用virtualbox搭建虚拟机&#xff0c;如果磁盘不够用了&#xff0c;可以通过以下方式扩展。 扩容磁盘 分区扩展 查看磁盘情况 fdisk -l Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/phys…

探索开源世界:2024年值得关注的热门开源项目推荐

文章目录 每日一句正能量前言GitCode成立背景如何使用GitCode如何把你现有的项目迁移至 GitCode&#xff1f;热门开源项目推荐actions-poetry - 管理 Python 依赖项的 GitLab CI/CD 工具项目概述技术分析应用场景特点项目地址 Spider - 网络爬虫框架项目简介技术分析应用场景项…

51单片机STC89C52RC——2.3 两个独立按键模拟控制LED流水灯方向

目的 按下K1键LED流水向左移动 按下K2键LED流水向右移动 一&#xff0c;STC单片机模块 二&#xff0c;独立按键 2.1 独立按键位置 2.2 独立按键电路图 这里要注意一个设计的bug P3_1 引脚对应是K1 P3_0 引脚对应是K2 要实现按一下点亮、再按一下熄灭&#xff0c;我们就需…

使用 Python 进行测试(4)为什么要测试?测什么?

总结 要知道测试的内容&#xff0c;首先要知道测试的原因。下面是测试的几个主要目的&#xff1a; 避免回归质量管理匹配规格淡化责任让你放心学习测试选中一个框 你为什么要测试&#xff1f; 要决定测试什么、测试多少以及以什么顺序测试&#xff0c;您需要首先弄清楚测试的…

QT系列教程(11) TextEdit实现Qt 文本高亮

文本高亮 对于textedit里录入的部分单词我们可以实现高亮&#xff0c;实现高亮主要依赖于QSyntaxHighlighter。 我们先创建一个Qt Application类&#xff0c;类名MainWindow, 然后新增一个C类&#xff0c;类名为MySyntaxHighlighter。 #ifndef MYSYNTAXHIGHLIGHTER_H #define …

优化查询性能:DolphinDB 时间类型数据比较规则详解

在数据库中&#xff0c;时间是一种常见的数据类型。在处理时间数据时&#xff0c;比较操作是非常常见的需求。然而&#xff0c;在不同的场景下&#xff0c;对时间类型数据进行比较时应用的规则不同。本文将从 DolphinDB 支持的时间类型开始&#xff0c;由浅入深分别介绍时间类型…

C++访问Private,Protecd的一些方法总结

前言 在编写C程序中 我们偶尔会碰到这样的三种特殊修改变量值的需求&#xff1a; [1]在不修改类原本的实现下&#xff0c;访问修改类的Private变量 [2]在不修改类原本的实现下&#xff0c;修改类的Protected变量 Private变量访问 public类模版函数特化 这种办法利用了类模…

Qt自定义日志输出

Qt自定义日志输出 简略版&#xff1a; #include <QApplication> #include <QDebug> #include <QDateTime> #include <QFileInfo> // 将日志类型转换为字符串 QString typeToString(QtMsgType type) {switch (type) {case QtDebugMsg: return "D…

全网爆火的AI语音合成工具-ChatTTS,有人已经拿它赚到了第一桶金,送增强版整合包

上篇分享了如何从0到1搭建一套语音交互系统。 其中&#xff0c;语音合成&#xff08;TTS&#xff09;是提升用户体验的关键所在。 不得不说&#xff0c;AI 语音界人才辈出&#xff0c;从之前的Bert-Sovit&#xff0c;到GPT-Sovits&#xff0c;再到最近一周狂揽了 1w Star 的C…

热门开源项目ChatTTS: 国内语音技术突破,实现弯道超车

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

细说MCU修改回调函数调用模式的方法

目录 1、硬件及工程 2、实现方法 &#xff08;1&#xff09;修改while(1)中的代码&#xff1a; &#xff08;2&#xff09;修改2 &#xff08;3&#xff09;修改3 &#xff08;4&#xff09;修改4 &#xff08;5&#xff09;修改5 3、下载并运行 在本文作者的文章中&a…

RPC知识

一、为什么要有RPC&#xff1a; HTTP协议的接口&#xff0c;在接口不多、系统与系统交互较少的情况下&#xff0c;解决信息孤岛初期常使用的一种通信手段&#xff1b;优点就是简单、直接、开发方便&#xff0c;利用现成的HTTP协议进行传输。 但是&#xff0c;如果是一个大型的网…

python-基础篇-函数-在py中的长相

文章目录 整体长相长相要求 整体长相 怎么自定义函数&#xff1f; 要知道怎么定义函数&#xff0c;就要知道函数的组成部分是怎样的。 def 函数名(参数1&#xff0c;参数2....参数n):函数体return 语句这就是 Python 函数的组成部分。 长相要求 所以自定义函数&#xff0c…

读AI新生:破解人机共存密码笔记02进化

1. 人工智能的标准模型 1.1. 机器优化人类提供的固定目标 1.1.1. 是一条死胡同 1.1.1.1. 当你走进死胡同时&#xff0c;你最好掉头返回&#xff0c;找出走错的地方 1.2. 问题不在于我们可能无法做好构建人工智能系统的工作&…