还在用main方法测试吗,带你来认识什么才是专业的SpringBoot项目测试方法

别再用main方法测试了,太Low!这才是专业的SpringBoot项目测试方法! JUnit是一款Java语言的单元测试框架,目前大多数Java开发环境都已经支持它了。JUnit测试也就是所谓的白盒测试,在程序员知道程序内部逻辑的基础上进行的测试,使用JUnit能让我们快速地完成单元测试。Spring Boot Test将JUnit和其他测试框架结合起来,提供了便捷高效的测试手段,目前Spring Boot 2.7版本采用的是JUnit 5。今天带大家体验了一把Spring Boot Test,作为Spring Boot官方测试框架,确实功能很强大。 阅读详情

​

 

之前把我的mall项目升级到Spring Boot 2.7的时候,很多之前的测试方法都不能用了,原来是Spring Boot Test已经升级支持JUnit 5了。今天我们来聊聊新版Spring Boot Test的使用,有了它,我们就不需要再使用main方法来测试了!

JUnit 简介

JUnit是一款Java语言的单元测试框架,目前大多数Java开发环境都已经支持它了。JUnit测试也就是所谓的白盒测试,在程序员知道程序内部逻辑的基础上进行的测试,使用JUnit能让我们快速地完成单元测试。Spring Boot Test将JUnit和其他测试框架结合起来,提供了便捷高效的测试手段,目前Spring Boot 2.7版本采用的是JUnit 5。

常用注解

在使用Spring Boot Test之前,我们先来了解下它常用的注解,这对使用它很有帮助,具体参考下表即可!

注解

作用

@SpringBootTest

用于指定测试类启用Spring Boot Test,默认会提供Mock环境

@ExtendWith

如果只想启用Spring环境进行简单测试,不想启用Spring Boot环境,可以配置扩展为:SpringExtension

@Test

指定方法为测试方法

@TestMethodOrder

用于配置测试类中方法的执行顺序策略,配置为OrderAnnotation时,按@Order顺序执行

@Order

用于配置方法的执行顺序,数字越低执行顺序越高

@DisplayName

用于指定测试类和测试方法的别名

@BeforeAll

在测试类的所有测试方法前执行一次,可用于全局初始化

@AfterAll

在测试类的所有测试方法后执行一次,可用于全局销毁资源

@BeforeEach

在测试类的每个测试方法前都执行一次

@AfterEach

在测试类的每个测试方法后都执行一次

@Disabled

禁用测试方法

@RepeatedTest

指定测试方法重复执行

@ParameterizedTest

指定参数化测试方法,类似重复执行,从@ValueSource中获取参数

@ValueSource

用于参数化测试指定参数

@AutoConfigureMockMvc

启用MockMvc的自动配置,可用于测试接口

基本使用

下面我们来聊聊这些注解的基本使用,通过它们可以实现一些基本的单元测试。

集成Spring Boot Test

如果你想在项目中集成Spring Boot Test的话,需要先在pom.xml中添加如下依赖。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>

最简单的测试

  • 我们先来一个最简单的单元测试,使用@SpringBootTest注解启用单元测试,使用@Test指定测试方法,使用Assertions类的方法来断言结果是否符合预期,具体代码如下。

/** * JUnit基本测试 * Created by macro on 2022/10/11. */ @SpringBootTest public class FirstTest { @Test public void test() { int a=1; Assertions.assertEquals(1,a); } } 复制代码

  • 然后点击测试方法左侧按钮即可进行测试。

​

  • 执行完成后我们在IDEA的执行窗口中就可以看到方法测试通过了,由于使用@SpringBootTest启用了Spring Boot环境,日志中会输出Spring Boot的banner。

​

 

指定测试方法顺序

  • 我们可以通过@TestMethodOrder注解和@Order注解来指定所有测试方法的执行顺序,具体代码如下。

/** * JUnit指定方法测试顺序 * Created by macro on 2022/10/10. */ @ExtendWith(SpringExtension.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class MethodOrderTest { private static final Logger LOGGER = LoggerFactory.getLogger(MethodOrderTest.class); @Test @Order(1) @DisplayName("order为1的方法") void lowOrder(){ LOGGER.info("lowOrder method"); } @Test @Order(10) @DisplayName("order为10的方法") void highOrder(){ LOGGER.info("highOrder method"); } } 复制代码

  • 点击类左侧测试按钮,可以直接运行该类中的所有测试方法。

​

 

  • 这里由于我们使用了@DisplayName注解给测试方法取了个别名,而且我们使用了@ExtendWith指定了运行环境为Spring而不是Spring Boot,所以日志中不会出现Spring Boot的banner,执行速度也更快。

​

 

生命周期测试

  • 我们还可以通过JUnit 5的生命周期注解来执行测试方法,比如在@BeforeAll注解指定的方法中做全局初始化,在@AfterAll注解指定的方法中做资源的销毁,具体代码如下。

/** * JUnit生命周期测试 * Created by macro on 2022/10/10. */ @ExtendWith(SpringExtension.class) public class LifecycleTest { private static final Logger LOGGER = LoggerFactory.getLogger(LifecycleTest.class); @BeforeAll static void allInit(){ LOGGER.info("allInit():在所有方法前执行,只执行一次"); } @BeforeEach void eachInit(){ LOGGER.info("eachInit():在测试方法前执行,每个测试方法前都执行"); } @Test void successTest() { LOGGER.info("successTest():方法执行成功"); } @AfterEach void eachDown(){ LOGGER.info("eachDown():在测试方法后执行,每个测试方法后都执行"); } @AfterAll static void allDown(){ LOGGER.info("allDown():在测试方法后执行,每个测试方法后都执行"); } }

  • 测试完成后,控制台输出日志如下。

​

 

断言的使用

我们可以通过Assertions类中提供的断言API来断言测试结果。

  • 例如我们可以使用fail方法直接断言方法执行失败并输出提示信息。

/** * JUnit断言测试 * Created by macro on 2022/10/11. */ @ExtendWith(SpringExtension.class) public class AssertTest { @Test void failTest() { Assertions.fail("failTest():方法执行失败"); } } 复制代码

  • 测试方法执行后会直接抛出异常信息。

​

 

  • 还可以通过assertTrue、assertNull、assertEquals这类方法来断言结果是否符合预期。

/** * JUnit断言测试 * Created by macro on 2022/10/11. */ @ExtendWith(SpringExtension.class) public class AssertTest { @Test void failTest() { Assertions.fail("failTest():方法执行失败"); } @Test void trueTest(){ Assertions.assertTrue(1==1); } @Test void trueFalse(){ Assertions.assertFalse(3<=2); } @Test void nullTest(){ String str = null; Assertions.assertNull(str); } @Test void notNullTest(){ String str = "test"; Assertions.assertNotNull(str); } @Test void equalsTest(){ String str1 = "test"; String str2 = "test"; Assertions.assertEquals(str1,str2); } @Test void notEqualsTest(){ String str1 = "test"; String str2 = "test"; Assertions.assertNotEquals(str1,str2); } }

  • 也可以使用assertThrows方法来断言方法中抛出的异常。

/** * JUnit断言测试 * Created by macro on 2022/10/11. */ @ExtendWith(SpringExtension.class) public class AssertTest { private static final Logger LOGGER = LoggerFactory.getLogger(LifecycleTest.class); @Test void throwsTest(){ Assertions.assertThrows(NullPointerException.class,()->{ String str = null; LOGGER.info(str.toLowerCase()); }); } }

  • 还可通过assertTimeout方法断言方法的执行时间。

/** * JUnit断言测试 * Created by macro on 2022/10/11. */ @ExtendWith(SpringExtension.class) public class AssertTest { @Test void timeoutTest(){ Assertions.assertTimeout(Duration.ofMillis(1000),()->{ long sleepTime = 2000; ThreadUtil.sleep(sleepTime); LOGGER.info("timeoutTest():休眠{}毫秒",sleepTime); }); } }

  • 或者通过assertAll方法将几个断言结合起来使用,Assertions类中提供的工具方法很多,具体可以参考它的代码。

/** * JUnit断言测试 * Created by macro on 2022/10/11. */ @ExtendWith(SpringExtension.class) public class AssertTest { @Test void assertAllTest(){ Assertions.assertAll(()->{ trueTest(); },()->{ nullTest(); },()->{ equalsTest(); }); } }

其他测试

  • Spring Boot Test除了上述测试功能,还可以使用@Disabled来禁用某个测试方法。

/** * JUnit其他测试 * Created by macro on 2022/10/10. */ @ExtendWith(SpringExtension.class) public class OtherTest { @Test @Disabled("用于测试@Disabled注解") void disabledTest() { LOGGER.info("disabledTest():方法被执行"); } }

  • 也可以使用@RepeatedTest来实现循环测试。

/** * JUnit其他测试 * Created by macro on 2022/10/10. */ @ExtendWith(SpringExtension.class) public class OtherTest { private static final Logger LOGGER = LoggerFactory.getLogger(LifecycleTest.class); private static int count = 0; @RepeatedTest(3) void repeatedTest() { count++; LOGGER.info("repeatedTest():重复执行第{}次",count); } }

  • 还可以通过@ParameterizedTest来进行参数化测试。

/** * JUnit其他测试 * Created by macro on 2022/10/10. */ @ExtendWith(SpringExtension.class) public class OtherTest { private static final Logger LOGGER = LoggerFactory.getLogger(LifecycleTest.class); @ParameterizedTest @ValueSource(ints = {1,2,3}) public void parameterizedTest(int a){ LOGGER.info("parameterizedTest():a={}",a); } }

运行以上测试方法后,具体测试结果如下。

​

项目实战

上面介绍了Spring Boot Test的基本使用,下面我们结合项目来使用下它。

Dao层测试

如果我们的项目需要对数据访问层Dao中的方法进行测试的话,直接注入Mapper接口,在测试方法中直接调用即可,这里对根据ID查询品牌的Mapper方法进行测试。

/** * Dao层方法测试 * Created by macro on 2022/10/11. */ @SpringBootTest public class MapperTest { private static final Logger LOGGER = LoggerFactory.getLogger(MapperTest.class); @Autowired private PmsBrandMapper brandMapper; @Test void testGetById(){ long id = 6; PmsBrand pmsBrand = brandMapper.selectByPrimaryKey(id); LOGGER.info("brand name:{}",pmsBrand.getName()); Assertions.assertEquals("小米",pmsBrand.getName()); } }

Service层测试

对业务层Service中的方法测试也是一样的,直接注入Service接口,在测试方法中直接调用即可,这里对根据ID查询品牌的Service方法进行测试。

/** * Service层方法测试 * Created by macro on 2022/10/11. */ @SpringBootTest public class ServiceTest { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceTest.class); @Autowired private PmsBrandService brandService; @Test void testGetById(){ long id = 6; PmsBrand pmsBrand = brandService.getBrand(id); LOGGER.info("brand name:{}",pmsBrand.getName()); Assertions.assertEquals("小米",pmsBrand.getName()); } }

Controller层测试

对于Controller层方法进行测试,有时我们需要模拟请求,使用MockMvc即可,这里模拟测试下分页查询品牌列表的接口。

/** * Controller层方法测试 * Created by macro on 2022/10/11. */ @SpringBootTest @AutoConfigureMockMvc public class ControllerTest { @Autowired private MockMvc mockMvc; @Test void mvcTest() throws Exception{ //模拟发送一个请求访问分页查询品牌列表的接口 mockMvc.perform(MockMvcRequestBuilders.get("/brand/list") //设置请求地址 .param("pageNum","1") //设置请求参数 .param("pageSize","5")) .andExpect(MockMvcResultMatchers.status().isOk()) //断言返回状态码为200 .andDo(MockMvcResultHandlers.print()) //在控制台打印日志 .andReturn(); //返回请求结果 } } 复制代码

由于我们选择了在控制台输出日志,控制台将输出如下信息。

​

总结

今天带大家体验了一把Spring Boot Test,作为Spring Boot官方测试框架,确实功能很强大。由于其主要基于JUnit 5,和JUnit 5的用法基本一致。使用它进行单元测试,无需启动整个项目,更快更好用!

参考资料

JUnit 5官方文档:junit.org/junit5/docs…

项目源码地址

github.com/macrozheng/…

聊聊SpringBoot单元测试 JUnit是一款Java语言的单元测试框架,目前大多数Java开发环境都已经支持它了。JUnit测试也就是所谓的白盒测试,在程序员知道程序内部逻辑的基础上进行的测试,使用JUnit能让我们快速地完成单元测试。Spring Boot Test将JUnit和其他测试框架结合起来,提供了便捷高效的测试手段,目前Spring Boot 2.7版本采用的是JUnit 5。今天带大家体验了一把Spring Boot Test,作为Spring Boot官方测试框架,确实功能很强大。 阅读详情

相关推荐

Spring Boot测试框架全面解析

Spring Boot测试框架通过模块化设计提供了从单元测试到集成测试的完整解决方案,其核心优势在于智能的自动配置机制大幅降低了测试复杂度。框架通过精心设计的注解体系,实现了不同测试场景的无缝覆盖。

静水深流 1535

Springboot配置单元测试

Springboo2.xt配置单元测试

7me 1643

SpringBoot开发——Spring Boot 自动化测试框架的高效运用

SpringBoot开发——Spring Boot 自动化测试框架的高效运用

bjzhang75的博客 1130

SpringBoot单元测试(一)

SpringBoot单元测试

今天又是充满希望的一天 2101

突发环境事件怎么模拟?用Python+GIS实现高斯烟团模型(附完整代码)

本文详细介绍了如何利用Python与GIS技术实现高斯烟团模型,用于模拟化工泄漏等突发环境事件的动态扩散过程。通过核心原理讲解、参数快速获取方案、Python代码实现及GIS可视化集成,为环境应急人员提供了一套完整的解决方案。特别适合危险品运输事故等瞬态污染场景的应急决策支持。

weixin_33692284的博客 486

基于AutoDL复现A-LOAM

Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用。在autodl上面租服务器,地区我租的重庆A区的,GPU我选择的是RTX4090,基础镜像选择的是Miniconda / conda3 / 3.8(ubuntu20.04)/11.6。在AutoDL中我使用的方式是先将该数据集先下载到自己的电脑上,然后再上传到虚拟机中。用MobaXterm解决该问题!搜到的一个解决方式:该问题属于ceres版本问题,将A-LOAM下的。

m0_61281610的博客 1943

别再用main方法测试了,这才是专业的SpringBoot项目测试方法~

之前把我的mall项目升级到Spring Boot 2.7的时候,很多之前的测试方法都不能用了,原来是Spring Boot Test已经升级支持JUnit 5了。今天我们来聊聊新版Spring Boot Test的使用,有了它,我们就不需要再使用main方法来测试了!

macrozheng的专栏 703

Apollo和autoware规划算法代码ros移植-路径规划可跑工程分享

Apollo6.0规划核心代码移植到Ros工程,可编译移植分享

weixin_39735688的博客 8509

别再写 main 方法测试了,太 Low!这才是专业 Java 测试方法!

来源:juejin.cn/post/6844903936869007368“"If you cannot measure it, you cannot improve it".在日常开发中...

weixin_43167418的博客 182

Deep Reinforcement Learning - 1. DDPG原理和算法

Deep Reinforcement Learning - 1. DDPG原理和算法 背景描述 DDPG的定义和应用场景 DDPG算法相关基本概念定义 DDPG实现框架和算法 DDPG对于DPG的关键改进 下一篇 以下用RL作为Reinforcement Learning 的简称。背景描述概括来说,RL要解决的问

kenneth_yu的博客 14万+

电磁场数值分析作业(西电)共5次【2021】

文章目录作业1作业2作业3作业4作业5 作业1 一个二维正方形(边长a=10mm)的静电场区域,电位边界条件如图所示(单位:V),求区域内的电位分布。要求用超松弛迭代法求解差分方程组进行计算。 clc clear close all hx=11; hy=11; v1=zeros(hy,hx); v1(hy,:)=ones(1,hx)*100; v1(1,:)=ones(1,hx)*50; for i=1:hy v1(i,1)=0; v1(i,hx)=100; end w=2/(1+

薛定谔的壳的博客 5074

SpringBoot源码解析之main方法推断

在《SpringBoot源码解析之应用类型识别》一文中我们已经了解了SpringBoot是如何推断出应用类型的。在推断出应用类型之后,SpringBoot又进行了main方法的推断。 在进行main方法的推断时,主要使用了堆栈信息一层层的判断,来获得main方法。具体源代码如下: private Class<?> deduceMainApplicationClass() { try ...

程序新视界 2495

智能手表PCB布局:PPG与IMU传感器噪声隔离与应力解耦设计

在可穿戴设备硬件开发中,PCB布局已超越传统布线范畴,成为决定信号完整性、电磁兼容性与机械可靠性的核心环节。心率传感器(PPG)依赖微伏级光电容积脉搏波信号,极易受数字开关噪声与电源纹波干扰;姿态传感器(IMU)则对PCB弯曲形变引发的机械应力高度敏感。其布局需融合电磁场建模、热-力-电多物理协同及高密度互连约束。关键技术价值体现在噪声路径切断、地弹抑制、应力方向解耦与电源域隔离等工程实践。典型应用场景涵盖智能手表、医疗级贴片设备及微型运动传感终端。本文聚焦PPG与IMU两大模组在STM32L4平台上的实操

weixin_32869687的博客 175

Springboot项目如何创建单元测试

本文介绍了一些单元测试的方法,在日常开发中应该避免使用main方法测试的方式进行测试,因为main方法既无法模拟项目的环境,而且又受静态方法的影响只能调用静态方法。还有一些其它的测试工具,录入yapi、easymock等也可以进行测试使用。

weixin_41998947的博客 6249

第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码)

大家好,我是cuiwin!本节内容,我们从零开始开发基于Python(Flask)的后端项目,对接Vue Vben Admin(vben5)。登录mysql数据库执行: 创建数据库。

cuiwin的专栏 2270

基于PCL、Open3d、Easy3d 、VTK等常见开源库的QT开发

PCL+QT开发

阁楼 2万+

springboot项目用junit进行单元测试,加载bean main方法进行测试

springboot项目用junit进行单元测试 @RunWith(SpringRunner.class) // SourceItemApplication 必须是你自己springboot启动类 @SpringBootTest(classes = SourceItemApplication.class) @WebAppConfiguration public class TestAdapter { @Autowired private BaseAdminUserServiceImpl a; @Test

a821449400的博客 1410

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

idea通过main方法启动springboot项目报错测试类编译不通过

今天下了新springboot项目下来,通过debug执行main方法时报错,提示测试类编译不通过。差点被这个小问题卡住了。 解决办法: setting-build-build tools-maven-runner 勾选delegate idea build/run actions to maven 勾选skip Test 如图: ...

weixin_43472847的博客 1255

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【Mybatis】不启动项目直接测试Mapper的方法

在项目开发过程中,有时候一个庞大的SpringBoot 项目的启动时间可能要几分钟的时间,这时候我们如果想测试自己写的某个mybatis的Mapper的方法,要浪费大量时间在等待项目启动上。本文通过一个Main方法和一个Mybatis配置类实现无需启动项目直接测试Mapper功能。

God_WZH的博客 2409

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

带你搞定SpringBoot构建分模块项目

Spingboot项目对开发来说,最简单的当然是单模块开发,只有一个pom文件。但随着项目的不断发展,需求的不断细化与添加,工程项目中的代码越来越多,包结构也越来越复杂,比起传统复杂的单体工程,使用Maven的多模块配置,可以帮助项目划分模块,鼓励重用,防止POM变得过于庞大,方便某个模块的构建,而不用每次都构建整个项目,并且使得针对某个模块的特殊控制更为方便。那么这里呢,我就来讲解一下如何使用SpringBoot来构建分模块项目,**如果觉得有用,记得点个关注和点个赞哦**。

BoCong-Deng的博客 1万+

SpringBoot开启测试用例

测试是软件质量保证的最佳办法,也是程序交付的最终环节,测试是一门学科,关于测试的方法有很多,在理论层面有黑河测试、白盒测试,在操作指导方面有边界值测试等等相关方法。相关的文章和书籍汗牛充栋,不胜枚举。由于本人不是专门的测试工程师,在此不做过多赘述。当前SpringBoot自动装配式框架使用非常广泛,但是初级程序员对于使用过程中的测试方法没有充分运用SpringBoot提供的便利,往往对于DAO和Service层的测试等controller编写完成后,通过swagger、postman等工具测试

zhang_232的专栏 2503

SpringBoot项目测试类@Test注解无法使用

开发springboot项目时,需要对某一模块/方法进行单独测试,通过测试方法,可以验证代码逻辑的正确性,包括功能性、性能和边界条件等方面;

qq_40431748的博客 2545
上一篇: 不看后悔,最全介绍Spring Bean的8种加载方式
下一篇: 教你如何应对面试官提问你Redis 缓存数据库一致性时
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值