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

Spring Boot 的测试库

  • [1.了解回归测试框架 JUnit](#1.了解回归测试框架 JUnit)
  • [2.了解 assertThat](#2.了解 assertThat)
  • [3.了解 Mockito](#3.了解 Mockito)
  • [4.了解 JSONPath](#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 的基本语法

java 复制代码
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,如以下代码:

java 复制代码
$.person.card[0].num

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

java 复制代码
$['person']['card'][0]['num']

5.测试的回滚

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

java 复制代码
@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。

相关推荐
世间万物皆对象3 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
qq_17448285755 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序
代码小鑫7 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖7 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
周全全7 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php
飞升不如收破烂~8 小时前
Spring boot常用注解和作用
java·spring boot·后端
计算机毕设源码qq-38365310418 小时前
(附项目源码)Java开发语言,215 springboot 大学生爱心互助代购网站,计算机毕设程序开发+文案(LW+PPT)
java·开发语言·spring boot·mysql·课程设计
岁岁岁平安9 小时前
springboot实战(15)(注解@JsonFormat(pattern=“?“)、@JsonIgnore)
java·spring boot·后端·idea
潜洋13 小时前
Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序
java·spring boot·后端
灯雾️13 小时前
Spring Boot、Spring MVC和Spring间的区别
spring boot