SpringBoot @SpringBootTest加速单元测试的小诀窍

编辑: admin 分类: java 发布时间: 2021-11-15 来源:互联网
目录
  • @SpringBootTest加速单元测试小诀窍
    • Pre
    • classes
    • webEnvironment
  • @记录使用SpringBootTest遇到的坑

    @SpringBootTest加速单元测试小诀窍

    Pre

    SpringBoot - 应用程序测试方案

    随着代码量的争夺,测试类的启动速度变得越来越慢,而大多数情况下只是为了测试一下某个实现类的某个方法而已,比如测试一个DAO层的方法,却要启动这个应用。

    在这里插入图片描述

    今天我们继续深入了解一下 稍微高级一点的用法

    classes

    在这里插入图片描述

    classes 属性用来指定运行测试类需要装载的 class 集合,如果不指定,那么会默认装载 @SpringBootConfiguration 注解标注的类

    如果不指定classes属性,那么启动测试类时需要加载的Bean的数量和正常启动一次入口类加载的 Bean 数量是一样的。

    如果你的项目中有很多个 Bean, 特别是有以下几种时:

    • 有 CommandLineRunner 的实现类
    • 用 @PostConstruct 注解指定了初始化方法的类

    这几种类在程序初始化的过程中都会运行自身的业务代码或者初始化代码,从而延后了测试方法的运行。

    在这种情况下,我们在编写测试类的时候,如果明确这个测试类会用到哪几个 Bean,则可以在 classes 属性处指定,之后启动测试类的时候,就只会加载需要的 Bean 到上下文中,从而加快启动速度。比如:

    用法

    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes={ArtisanServiceImpl.class})
    

    webEnvironment

    在这里插入图片描述

    这个属性的含义是说测试类要不要启动一个 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() {
            // ...
        }
    }
    

    @记录使用SpringBootTest遇到的坑

    不要导入junit这个依赖,只要上面那个test就行了

    导入junit依赖,运行会报错

    导入junit,这里会红。运行测试方法会报错

    这里变红了,只需要spring-boot-starter-test依赖就好

    只留下这个依赖就行了

    删掉junit依赖

    运行成功!

    运行成功!

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持自由互联。