Spring Boot 集成 JUnit5,优雅单元测试!
作者:海向
来源:www.cnblogs.com/haixiang/p/13812363.html
为什么使用JUnit5
JUnit4被广泛使用,但是许多场景下使用起来语法较为繁琐,JUnit5中支持lambda表达式,语法简单且代码不冗余。
JUnit5易扩展,包容性强,可以接入其他的测试引擎。
功能更强大提供了新的断言机制、参数化测试、重复性测试等新功能。
ps:开发人员为什么还要测试,单测写这么规范有必要吗?其实单测是开发人员必备技能,只不过很多开发人员开发任务太重导致调试完就不管了,没有系统化得单元测试,单元测试在系统重构时能发挥巨大的作用,可以在重构后快速测试新的接口是否与重构前有出入。
简介
如图,JUnit5结构如下:
JUnit Platform:这是Junit提供的平台功能模块,通过它,其它的测试引擎都可以接入Junit实现接口和执行。
JUnit JUpiter:这是JUnit5的核心,是一个基于JUnit Platform的引擎实现,它包含许多丰富的新特性来使得自动化测试更加方便和强大。
JUnit Vintage:这个模块是兼容JUnit3、JUnit4版本的测试引擎,使得旧版本的自动化测试也可以在JUnit5下正常运行。
依赖引入
我们以Spring Boot2.3.1
为例,引入如下依赖,防止使用旧的junit4相关接口我们将其依赖排除。
Spring Boot 基础就不介绍了,推荐看下面这个最新的实战教程。
https://github.com/javastacks/spring-boot-best-practice
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions>
</dependency>
常用注解
@BeforeEach:在每个单元测试方法执行前都执行一遍
@BeforeAll:在每个单元测试方法执行前执行一遍(只执行一次)
@DisplayName("商品入库测试"):用于指定单元测试的名称
@Disabled:当前单元测试置为无效,即单元测试时跳过该测试
@RepeatedTest(n):重复性测试,即执行n次
@ParameterizedTest:参数化测试,
@ValueSource(ints = {1, 2, 3}):参数化测试提供数据
断言
JUnit Jupiter提供了强大的断言方法用以验证结果,在使用时需要借助java8的新特性lambda表达式,均是来自org.junit.jupiter.api.Assertions
包的static
方法。
assertTrue`与`assertFalse`用来判断条件是否为`true`或`false
@Test
@DisplayName("测试断言equals")
void testEquals() {assertTrue(3 < 4);
}
assertNull与
assertNotNull用来判断条件是否为·
null
@Test
@DisplayName("测试断言NotNull")
void testNotNull() {assertNotNull(new Object());
}
assertThrows
用来判断执行抛出的异常是否符合预期,并可以使用异常类型接收返回值进行其他操作
@Test
@DisplayName("测试断言抛异常")
void testThrows() {ArithmeticException arithExcep = assertThrows(ArithmeticException.class, () -> {int m = 5/0;});assertEquals("/ by zero", arithExcep.getMessage());
}
assertTimeout
用来判断执行过程是否超时
@Test
@DisplayName("测试断言超时")
void testTimeOut() {String actualResult = assertTimeout(ofSeconds(2), () -> {Thread.sleep(1000);return "a result";});System.out.println(actualResult);
}
assertAll
是组合断言,当它内部所有断言正确执行完才算通过。Spring Boot 系列面试题和答案我都整理好了,关注公众号互联网架构师,回复:2T,可以免费获取。
@Test
@DisplayName("测试组合断言")
void testAll() {assertAll("测试item商品下单",() -> {//模拟用户余额扣减assertTrue(1 < 2, "余额不足");},() -> {//模拟item数据库扣减库存assertTrue(3 < 4);},() -> {//模拟交易流水落库assertNotNull(new Object());});
}
重复性测试
在许多场景中我们需要对同一个接口方法进行重复测试,例如对幂等性接口的测试。
JUnit Jupiter通过使用@RepeatedTest(n)
指定需要重复的次数
@RepeatedTest(3)
@DisplayName("重复测试")
void repeatedTest() {System.out.println("调用");
}
参数化测试
参数化测试可以按照多个参数分别运行多次单元测试这里有点类似于重复性测试,只不过每次运行传入的参数不用。需
要使用到@ParameterizedTest
,同时也需要@ValueSource
提供一组数据,它支持八种基本类型以及String
和自定义对象类型,使用极其方便。
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
@DisplayName("参数化测试")
void paramTest(int a) {assertTrue(a > 0 && a < 4);
}
内嵌测试
JUnit5提供了嵌套单元测试的功能,可以更好展示测试类之间的业务逻辑关系,我们通常是一个业务对应一个测试类,有业务关系的类其实可以写在一起。
这样有利于进行测试。而且内联的写法可以大大减少不必要的类,精简项目,防止类爆炸等一系列问题。
@SpringBootTest
@AutoConfigureMockMvc
@DisplayName("Junit5单元测试")
public class MockTest {//....@Nested@DisplayName("内嵌订单测试")class OrderTestClas {@Test@DisplayName("取消订单")void cancelOrder() {int status = -1;System.out.println("取消订单成功,订单状态为:"+status);}}
}
最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Spring Boot 系列面试题和答案,非常齐全。
Spring Boot 集成 JUnit5,优雅单元测试!相关推荐
- Spring Boot 集成 JUnit5,更优雅单元测试!
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://mp.weixin.qq.com/s/2Kdu-nYLF55Ui9A1-ybgFw 为什么使用JUnit5 J ...
- Spring Boot集成ShardingSphere分片利器 AutoTable (二)—— 自动分片算法示例 | Spring Cloud 46
一.前言 在前面我们通过以下章节对ShardingSphere的AutoTable 有了基础的了解: Spring Boot集成ShardingSphere分片利器 AutoTable (一)-- 简 ...
- Spring Boot集成Swagger导入YApi@无界编程
接口APi开发现状 现在开发接口都要在类似YApi上写文档,这样方便不同的团队之间协作,同步更新接口,提高效率. 但是如果接口很多,你一个个手工在YApi去录入无疑效率很低. 如果是使用Spring ...
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- 6.3 Spring Boot集成mongodb开发
6.3 Spring Boot集成mongodb开发 本章我们通过SpringBoot集成mongodb,Java,Kotlin开发一个极简社区文章博客系统. 0 mongodb简介 Mongo 的主 ...
- springboot(十八):使用Spring Boot集成FastDFS
上篇文章介绍了如何使用Spring Boot上传文件,这篇文章我们介绍如何使用Spring Boot将文件上传到分布式文件系统FastDFS中. 这个项目会在上一个项目的基础上进行构建. 1.pom包 ...
- Spring Boot集成Hazelcast实现集群与分布式内存缓存
2019独角兽企业重金招聘Python工程师标准>>> Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品,提供弹性可扩展.高性能的分布式内存计算.并通过提供诸 ...
- Spring Boot 集成 Swagger 生成 RESTful API 文档
原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...
- 【Java进阶】Spring Boot集成ES
目录 spring boot集成ES ElasticSearchConfig 测试文档的基本操作 Elasticsearch Clients 文档 spring boot集成ES Java REST ...
- Spring Boot集成Jasypt安全框架
Jasypt安全框架提供了Spring的集成,主要是实现 PlaceholderConfigurerSupport类或者其子类. 在Sring 3.1之后,则推荐使用PropertySourcesPl ...
最新文章
- 传统方法的点云分割以及PCL中分割模块
- R语言入门学习笔记 - 对R软件的认识
- 文巾解题 100. 相同的树
- web前端入门学习 css(1)
- frexp 中文_带有Python示例的math.frexp()方法
- KVM中断虚拟化(二)
- CCF NOI1117 排序
- web 前端必备学习指南-精华
- HLW8032做220V电量采集方案测试
- 用微信小程序发红包的两种方法
- [360] 《如何保持电力接触网与受电弓亲密接触》
- IDempiere介绍
- 多种方法让你在PC上使用iCloud服务
- 极化码:基于单项式码的极化码部分序(Partial Order)表示
- 2021 CNSS招新赛 WEB WP
- 联想拯救者y7000键盘有几个按键失灵_y7000p键盘失灵
- 不止代码 == 摘读
- 解读SM, SP和Warp
- 汤森路透 Thomson Reuters --使用多模型数据库ArangoDB 打造快速安全的简洁视图分析...
- python使用密钥加密的表述_python 利用Crypto进行RSA解密加密文件