Spring boot应用测试框架介绍
一、spring boot应用测试存在的问题
官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数据库层面,依旧存在问题,它强烈依赖于数据库中的数据,并且自身不具备数据初始化的能力。测试框架spring-test-dbunit与spring-boot-unitils-starter支持spring-boot应用的测试,同时,也提供单元测试前置数据准备的功能。
二、spring-test-dbunit介绍与应用
2.1、介绍
spring-test-dbunit是spring boot的作者之一Phillip Webb开发的、用于给spring项目的单元测试提供dbunit功能的开源项目。dbunit项目的介绍为:puts your database into a known state between test runs。spring-test-dbunit的官网介绍为:Spring DBUnit provides integration between the Spring testing framework and the popular DBUnit project。
2.2、应用
实例主要代码如下:
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = DemoTestApplication.class) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, TransactionDbUnitTestExecutionListener.class}) @DbUnitConfiguration(dataSetLoader = XlsDataSetLoader.class) @Transactional public class UserControllerTest { @Autowired private UserController userController; @Test @DatabaseSetup({"/data/test_getUsername.xls"}) public void test_getUsername() { String username = userController.getUsername(1234); Assert.assertTrue(username.equals("zhangsan")); } }
test_getUsername.xls的内容如下:
2.3、实现原理
测试环境准备:
@RunWith(SpringJUnit4ClassRunner.class):用于启动测试、注册TestExecutionListener、构建testContext。
@SpringBootTest(classes = DemoTestApplication.class):利用SpringBootTestContextBootstrapper加载applicationContext。
DependencyInjectionTestExecutionListener:用来将bean注入到测试的class中,例如实例中的userController。
事务实现原理:
这里的TransactionalTestExecutionListener简称T,DbUnitTestExecutionListener简称D,如下图:
运行流程为:初始化测试类-->开始事务-->准备测试数据-->运行测试方法-->进行expectedData校验-->回滚或者提交事务。这就保证了整个方法的测试过程中,数据准备、测试方法运行、测试数据校验都在一个事务里面,最后事务如果回滚了,就不会在测试数据库中留下测试数据。
三、spring-boot-unitils-starter介绍与应用
3.1、介绍
unitils框架介绍:Unitils is an open source library aimed at making unit and integration testing easy and maintainable。堪称测试之王,其组成结构如下:
unitils目前只支持xml配置的spring项目,对于spring-boot项目稍不支持,基于此,我就开源一个项目,用于在unitils和spring-boot应用之间建立起桥梁。
这个开源项目主要做了以下工作:
重写SpringModule->SpringBootModule,支持ApplicationContext的设置ApplicationContext设置到SpringBootModule中DataSource替换支持xls的dataSet
目前可用的版本为:
<dependency> <groupId>com.github.yangjianzhou</groupId> <artifactId>spring-boot-unitils-starter</artifactId> <version>1.1.0.RELEASE</version> </dependency>
3.2、应用
实例代码如下:
@RunWith(UnitilsBootBlockJUnit4ClassRunner.class) @SpringBootTest(classes = DemoTestApplication.class) @Transactional(value = TransactionMode.ROLLBACK) public class UserControllerTest { @SpringBeanByType private UserController userController; @Test @DataSet({"/data/test_getUsername.xls"}) public void test_getUsername() { String username = userController.getUsername(1234); Assert.assertTrue(username.equals("zhangsan")); } }
3.3、实现原理
DatabaseModule下的DatabaseTestListener进行了事务的开启与回滚(提交)。
DbUnitModule下的DbUnitListener进行了dataset的准备与expecteddataset的校验。
SpringBootModule下的SpringTestListener进行了测试类中属性的注入与销毁测试类。
四、扩展
spring-test-dbunit与spring-boot-unitils-starter弥补了spring-boot-test-starter在数据库测试方面的不足,结合框架spring-test-dbunit(或者spring-boot-unitils-starter)与mock工具(mockito)以及一些测试方法,可以很好的完成单元测试。
但是,spring-test-dbunit与spring-boot-unitils-starter各有优缺点,spring-test-dbunit有良好的文档,但是最近更新版本为2016年版,仅仅是数据库层面的测试工具。spring-boot-unitils-starter利用了unitils的优势,可以说是一个测试平台了,虽然说,每年都在发布版本(unitils),但是其文档较少。用户可以根据自己的需要进行选择。
附:文中涉及到的测试样例代码:https://github.com/yangjianzhou/spring-boot-test-sample

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java集合类常见面试知识点总结
Java集合类学习总结 Colletion,iterator,comparable 一般认为Collection是最上层接口,但是hashmap实际上实现的是Map接口。iterator是迭代器,是实现iterable接口的类必须要提供的一个东西,能够使用for(i : A) 这种方式实现的类型能提供迭代器,以前有一个enumeration,现在早弃用了。 List List接口下的实现类有ArrayList,linkedlist,vector等等,一般就是用这两个,用法不多说,老生常谈。 ArrayList的扩容方式是1.5倍扩容,这样扩容避免2倍扩容可能浪费空间,是一种折中的方案。 另外他不是线程安全,vector则是线程安全的,它是两倍扩容的。 linkedlist是双链表,并且很坑的一点是,Java里的linkedlist自带按索引访问的api,结果我没用过,面试的时候被问到答错了,导致我美团直接凉凉= =。 除此之外还有一个copyonwritelist,用于线程安全的场景。 Map map永远都是重头戏。 1 hashmap是数组和链表的组合结构,数组是一个Entry数组,...
- 下一篇
阿里云MNS Queue Rest API操作示例
概述 阿里云消息服务(Message Service)是一种高效、可靠、安全、便捷、可弹性扩展的分布式消息服务。MNS能够帮助应用开发者在他们应用的分布式组件上自由的传递数据、通知消息,构建松耦合系统。本文主要介绍基于Java 语言实现Queue的创建、删除以及消息的发送及接受的Rest API操作。 签名验证工具 如果在使用过程中因为签名问题一直无法通过,建议直接使用签名验证工具进行快速的测试验证。 Code Sample 创建队列 import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpCli
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7,8上快速安装Gitea,搭建Git服务器