Spring Boot测试优化:理解并利用@SpringBootTest(webEnvironment = NONE)提升测试性能

目录

  • 一、@SpringBootTest 注解解析
  • 二、webEnvironment 参数详解
  • 三、webEnvironment = NONE 的优势
  • 四、 区别总结
  • 五、应用场景总结

在进行Spring Boot项目开发时,集成测试是确保各层组件正确协同工作的重要手段。本文我们将深入探讨如何通过@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)这一配置来优化测试性能,特别是在不涉及Web层组件的测试场景下,降低测试启动时间,提高开发与CI/CD效率。

一、@SpringBootTest 注解解析

@SpringBootTest 是Spring Boot提供的用于驱动集成测试的关键注解,它可以自动配置并启动一个ApplicationContext,以便我们在其中注入并测试实际运行环境下的各个Bean。

二、webEnvironment 参数详解

webEnvironment 属性允许我们精确控制在测试中应如何初始化Spring Boot应用环境。其可选值有:

  • DEFINED_PORTMOCK: 启动一个真实的嵌入式Web服务器。
  • RANDOM_PORT: 启用嵌入式Web服务器,并绑定到随机端口。
  • NONE: 不启动任何Web服务器,仅加载核心ApplicationContext。

三、webEnvironment = NONE 的优势

当我们设置 webEnvironment = SpringBootTest.WebEnvironment.NONE 时,Spring Boot在运行测试时不初始化嵌入式Web服务器。这意味着对于那些无需模拟HTTP请求或验证控制器行为的测试(例如,对服务层方法、DAO或其他非Web组件的测试),我们可以大大缩短测试启动和执行的时间。

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class MyServiceTest {@Autowiredprivate MyService myService;@Testpublic void testMyServiceMethod() {// 测试逻辑...}
}

Spring Boot的测试上下文构建过程是非常灵活且自适应的。比如定义在@SpringBootApplication注解标记的主类路径下的组件,以及其他由测试类自身直接或间接引用的Bean。这种策略避免了因加载大量Web相关组件而带来的开销。以下是一个对比示例,展示了带有和不带Web环境的测试案例:

// 带有Web环境的测试示例
@SpringBootTest
public class UserControllerTest {@Autowiredprivate WebTestClient webTestClient;@Testpublic void testGetUserById() {webTestClient.get().uri("/users/{id}", 1L).exchange().expectStatus().isOk().expectBody(User.class);}
}// 不带有Web环境的测试示例
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testFindUserById() {User user = userService.findById(1L);assertNotNull(user);assertEquals("John Doe", user.getName());}
}

在这两个示例中,第一个测试通过WebTestClient模拟HTTP请求,验证用户控制器的行为,因此需要完整的Web环境。而第二个测试仅关注UserService的逻辑,无需网络环境,所以采用webEnvironment = NONE来加速测试启动和执行。

结合其他测试注解实现精细化控制,在某些情况下,你可能还需要结合使用@DataJpaTest@MockBean@WebMvcTest等注解,这些注解可以更加精细地控制测试上下文的初始化,以便针对性地测试特定部分。

四、 区别总结

  • 带Web环境:适用于需要模拟真实HTTP请求并对控制器、过滤器、拦截器等Web层组件进行测试的场景,但启动和运行速度相对较慢。

  • 无Web环境:适合于服务层、数据访问层或者纯业务逻辑的单元测试,能显著减少测试启动时间,提高测试效率。

五、应用场景总结

  • 当你的测试主要关注业务逻辑、数据库操作或服务层组件的交互时,强烈建议使用 webEnvironment = NONE

  • 若测试涉及路由、控制器响应、Session管理等功能,则应当保留完整的Web环境以保证测试完整性。

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

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

相关文章

美国站群服务器如何提高企业网站的负载均衡能力?

美国站群服务器如何提高企业网站的负载均衡能力? 美国站群服务器是企业提高网站负载均衡能力的重要工具之一。随着网络流量的增加和用户需求的多样化,如何有效地管理和分配流量成为了企业面临的挑战。通过采用美国站群服务器,企业可以实现流量的智能分…

排序(一)----冒泡排序,插入排序

前言 今天讲一些简单的排序,冒泡排序和插入排序,但是这两个排序时间复杂度较大,只是起到一定的学习作用,只需要了解并会使用就行,本文章是以升序为例子来介绍的 一冒泡排序 思路 冒泡排序是一种简单的排序算法,它重复地遍历要排序的序列,每次比较相邻…

RocketMQ:broker配置说明

RocketMQ broker配置项的简要说明:serverSelectorThreads: 服务器选择器线程数,用于处理网络请求。brokerRole: 指定Broker的角色,如ASYNC_MASTER表示异步主节点。serverSocketRcvBufSize: 服务器套接字接收缓冲区大小。osPageCacheBusyTimeO…

C++面试问题精选 0513

1、有一个类包含static成员变量,并且这个类的构造函数中包含一个死循环,可以删除 main 函数吗? 在C++中,如果你有一个类包含static成员变量,并且这个类的构造函数中包含一个死循环(即无限循环),那么这通常不是一个好的设计选择,因为这会导致任何尝试创建该类实例的操…

Dato for Mac v5.2.11激活版:掌握时间,掌控生活

在忙碌的生活中,您是否常常觉得时间不够用?Dato for Mac,您的时间管理专家,助您轻松掌控每一天。清晰的日历视图、个性化的提醒功能,让您的日程安排井井有条。无论是工作还是生活,Dato for Mac都能成为您的…

linux命令行启动一个php进程, 如何监控 ,崩溃报警通知?

在Linux环境中,监控PHP进程并在其崩溃时发送通知可以通过多种方式实现,包括使用shell脚本结合监控工具和通知服务。下面我将提供一个简单的方案,使用systemd服务来管理PHP进程,并通过邮件发送崩溃通知。 第1步:创建一…

IT行业的人才培养与教育

你眼中的IT行业现状与未来趋势 随着技术的不断进步,IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链,这些技术正在重塑我们的生活和工作方式。你眼中IT行业的现状及未来发展趋势是怎么样的&#xf…

AI图像生成-调整

一、两张图画风不相似 2、在两张图的共同输出口新添加一个空白正面提示词板块和条件合并板块 二、预处理插件(提取人物姿态) 1、新建节点-》ControlNet预处理器-》面部与姿态-》Openpose姿态预处理器 2、添加上传图片板块与预览图片板块 3、提取姿态 右…

vue下载文件,获取header头文件名乱码,下载文件名有下划线的解决

后台以数据流将文件返回,将文件名放在header头里,是中文名,有乱码,如图 访问网络使用的是axios,在 // 响应拦截器 service.interceptors.response.use((res) > {........ if (res.config.responseType blob) {//文…

【Linux取经路】进程通信之匿名管道

文章目录 一、进程间通信介绍1.1 进程间通信是什么?1.2 进程间通信的目的1.3 进程通信该如何实现 二、管道2.1 匿名管道2.1.1 站在文件描述符角度深入理解管道2.1.2 接口使用2.1.3 PIPE_BUFFER 和 Pipe capacity2.1.4 管道中的四种情况2.1.5 管道特征总结 2.2 匿名管…

只用了三天就入门了Vue3?

"真的我学Vue3,只是为了完成JAVA课设" 环境配置 使用Vue3要去先下载Node.js。 就像用Python离不开pip包管理器一样。 Node.js — Run JavaScript Everywhere (nodejs.org) 下完Node.js去学习怎么使用npm包管理器,放心你只需要学一些基础的…

【MARIE】嵌入式系统设计半期报告:MARIE模拟器的使用

1.模拟器介绍 1.1 体系结构 MARIE (Machine Architecture that is Really Intuitive and Easy) 是一种机器架构和汇编语言。发布者还为机器提供了一组用 Java 编写的模拟器程序。MARIE.js 是 MARIE 的 JavaScript 版本实现。它旨在尽可能忠实于原始 Ja…

Spring-Cloud-OpenFeign源码解析-03-FeignClientFactoryBean

在Spring-Cloud-OpenFeign源码解析-02-OpenFeign自动装配分析到OpenFeign 接口代理对象的创建是通过构建成一个 FeignClientFactoryBean 对象,并最后注入到容器中的,那么这个FeignClientFactoryBean是如何实现代理对象创建的呢? FactoryBean…

基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于EKF扩展卡尔曼滤波的一阶环形倒立摆控制系统simulink建模与仿真。基于扩展卡尔曼滤波(Extended Kalman Filter, EKF)的一阶环形倒立摆控制系统&…

docker学习和常用命令

参考视频:05.Docker基础-常见命令_哔哩哔哩_bilibili 镜像仓库datahub docker命令官方文档:docker exec | Docker Docs systemtrl docker 启动docker systemtrl start docker停止docker systemtrl stop docker重启docker systemtrl restart docker设…

【并发程序设计】4. exec函数族

4.exec函数族 exec函数族是一组用于在进程中启动另一个程序来替换当前进程的函数。 exec函数族主要用于在当前进程内部执行一个新的程序,而不会创建新的进程。 子进程调用exec函数,族父进程不受影响。进程当前内容被指定的程序替换,但进程…

【YOLOV5 入门】——Gradio搭建Web GUI

引入:上节搭建的UI可视化界面只能以运行程序弹出窗口的形式运行,不能在网页Web中使用,本次代码将会非常少! 一、Gradio简介与安装 Gradio 是一个用于构建机器学习模型演示界面和Web应用的开源库。提供了简单易用的界面&#xff0…

云端的艺术革命:云渲染如何重塑动画与视觉特效产业

在 2019 年,乔恩费儒(Jon Favreau)决定重拍迪士尼的经典电影《狮子王》。他的创新构想是以真实动物为模型,在非洲草原上拍摄,由真实动物“出演”的辛巴和其他角色,随后通过配音赋予它们生命。 为了实现这一…

janus源码分析(1)--代码结构整理

基础说明 janus官网 https://janus.conf.meetecho.com/index.html janus源码地址 https://github.com/meetecho/janus-gateway 编译及部署参考 https://pro-hnb.blog.csdn.net/article/details/137730389?spm1001.2014.3001.5502 https://pro-hnb.blog.csdn.net/article/deta…

flutter常用的指令(签名、adb、shell、keytool、scrcpy)

flutter常用的指令(签名、adb、shell、keytool、scrcpy) run 指定main_dev.dart debug flutter run -t lib/main_dev.dart --debug指定main_dev.dart release flutter run -t lib/main_dev.dart --release插件用到非空安全情况 flutter run -t lib/main_dev.dart --releas…