随着代码量的争夺,测试类的启动速度变得越来越慢,而大多数情况下只是为了测试一下某个实现类的某个方法而已,比如测试一个DAO层的方法,却要启动这个应用。
classes 属性用来指定运行测试类需要装载的 class 集合,如果不指定,那么会
默认装载 @SpringBootConfiguration 注解标注的类
。
如果不指定classes属性,那么启动测试类时需要加载的Bean的数量和正常启动一次入口类加载的 Bean 数量是一样的。
如果你的项目中有很多个 Bean, 特别是有以下几种时:
-
有 CommandLineRunner 的实现类
-
用 @PostConstruct 注解指定了初始化方法的类
这几种类在程序初始化的过程中都会运行自身的业务代码或者初始化代码,从而延后了测试方法的运行。
在这种情况下,我们在编写测试类的时候,如果明确这个测试类会用到哪几个 Bean,则可以在 classes 属性处指定,之后启动测试类的时候,就只会加载需要的 Bean 到上下文中,从而加快启动速度。比如:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes={ArtisanServiceImpl.class})
这个属性的含义是说测试类要不要启动一个 web 环境, 要不要启动一个 Tomcat 容器,可选的值为:
- MOCK, 启动一个模拟的 Servlet 环境, 默认值。
- RANDOM_PORT,启动一个 Tomcat 容器,并监听一个随机的端口号
- DEFINED_PORT,启动一个 Tomcat 容器,并监听配置文件中定义的端口(未定义则默认监听8080)
- NONE,不启动 Tomcat 容器
怎么使用呢? 举个例子 如果你要测试的方法不需要用到 Tomcat 容器,比如:
- 测试 DAO 类的CRUD
- 测试Service 类的业务方法
- 测试工具类的公用方法
- 测试配置文件类是否读取到了正确的值
- …
只需要通过指定 @SpringBootTest(webEnvironment =
SpringBootTest.WebEnvironment.NONE) 即可达到加速的效果。这时测试类启动时就只会初始化 Spring 上下文,不再启动 Tomcat 容器了:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class ArtisanServiceTests {
@Autowired
private IArtisanSerive artisanService;
@Test
public void test() {
Spring扫描范围和启动速度
随着业务的发展,项目复杂度度增加引用的jar和业务代码越来越多,Spring应用在启动时需要扫描和实例化装载的Bean越来越多,以及环境上下文的处理,这势必会导致启动时间边长,特别是有中间的依赖的时候(例如连接数据库、消息队列、NoSql等)。
但是在测试的时候,我们可能只是测试单个方
@EnableConfigurationProperties(ZenTaoProperties.class)
@SpringBootTest(classes = {ZenTaoProperties.class})
class DemoApplicationTests
在 2021 年这个小学作文中的未来年份,没有想象中的汽车满天飞,也没有实现机器人满地跑。但牛逼的是我们都有一个共识: 知乎达到了人均 “谢邀~ 人在美国刚下飞机”的生活水平,虎扑的人均收入也在 30W+ ,还有就是程序员都人均精通 SpringBoot ,哪怕和算法聊技术一言不合就满嘴 SpringCould 分布式、微服务,然而实际操作可能是 分步试 、伪服务 ... 你一个小小系统开这么多应用启动不难受?(不难受因为可以装 13) SpringBoot 这启动速度也确实令人捉急,每个应用.
-1-背后的故事某个平凡熟悉的早上,传来测试同学的一阵哀嚎:那个谁!你提测的代码连运行都不能运行,苦涩。我默不作声,因为主项目还没有完全服务化,主项目的整体war包太大,...
文章目录1. 加载测试专用属性2. 加载测试专用配置3. Web环境模拟测试3.1 启动web测试3.2 测试类中发送请求3.3 响应状态匹配3.4 响应体匹配(json数据格式,开发中的主流)3.5 响应头匹配3.6 完整信息匹配4. 数据层测试数据回滚5. 测试用例数据设定
1. 加载测试专用属性
测试过程本身并不是一个复杂的过程,但是很多情况下测试时需要模拟一些线上情况,或者模拟一些特殊情况。但是在测试过程中,我们能不能每次测试的时候都去修改源码application.yml中的配置进行测试呢?显然是
这个问题在我学spring框架的时候就出现过,当时启动缓慢一直卡在控制台项目。但是耐心等是可以出来的。当我学到springMVC的时候又是这样,而且tomcat启动打印日志又卡住了如下图
忍无可忍我上网搜了好多但是都问题不匹配。我下面又自己尝试是卡在那个环节了。
因为我学spring的时候就遇到过,所以下意识认为是spring框架配置文件的问题,于是在这个springMVC的入门程序中我...
别人都写从0开始实现xxx,我先从-1开始就显得更牛逼一些。今天,先开个头,来教大家怎么实现一个中间件。首先,我们新建一个多 module 的项目用于测试。项目包含两个模块,用户中间件模块的开发,用于测试。
开发中间件
项目创建 OK 了,接着开始开发一个最最最简单的中间件。在目录下创建文件,用于自动装配,别问我啥是自动装配,然后配置一个自动装配类。
实现 ,最简单的方式,直接使用注解声明一个 Bean 交给 Spring 管理。
然后实现真正的中间件逻辑的处理部分。
这样的话,一个最简单的中间件就开发好了
一般情况下,使用@SpringBootTest后,Spring将加载所有被管理的bean,基本等同于启动了整个服务,此时便可以开始功能测试。
由于web服务是最常见的服务,且我们对于web服务的测试有一些特殊的期望,所以@SpringBootTest注解中,给出了webEnvironment参数指定了web的environment,该参数的值一共有四个可选值:
MOCK:此值为默