一、spring boot应用测试存在的问题

官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),Spring、Spring Boot和TestNG测试指南 - 集成测试中用Docker创建数据库但是在数据库层面,依旧存在问题,它强烈依赖于数据库中的数据,并且自身不具备数据初始化的能力。测试框架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(http://springtestdbunit.github.io/spring-test-dbunit/)与spring-boot-unitils-starter(https://github.com/yangjianzhou/spring-boot-unitils)弥补了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

原文链接:https://my.oschina.net/yangjianzhou/blog/1859103

spring boot应用测试框架介绍的更多相关文章

  1. Laravel 和 Spring Boot 两个框架比较创业篇(二:人工成本)

    前面从开发效率比较了 Laravel 和 Spring Boot两个框架,见:Laravel 和 Spring Boot 两个框架比较创业篇(一:开发效率) ,这一篇打算比较一下人工成本. 本文说的人 ...

  2. Spring Boot(十二):spring boot如何测试打包部署

    Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...

  3. 【spring boot】8.spring boot的日志框架logback使用

    在继续上一篇的Debug调试之后,把spring boot的日志框架使用情况逐步蚕食. 参考:http://tengj.top/2017/04/05/springbo 开篇之前,贴上完整applica ...

  4. Spring Boot从入门到放弃-Spring Boot 整合测试

    站长资讯摘要:使用Spring Boot 整合测试,对Controller 中某个方法进行测试或者对Service,Mapper等进行测试,不需要运行项目即可查看运行结果是否和期望值相同,Spring ...

  5. Java框架Spring Boot & 服务治理框架Dubbo & 应用容器引擎Docker 实现微服务发布

    微服务系统架构实践 开发语言Java 8 框架使用Spring boot 服务治理框架Dubbo 容器部署Docker 持续集成Gitlab CI 持续部署Piplin 注册中心Zookeeper 服 ...

  6. Spring boot maven 搭建框架

    Spring Boot:目的:这个框架帮助开发者更容易地创建基于Spring的应用程序和服务,使得pring开发者能够最快速地获得所需要的Spring功能.优点:完全不需要XML配置,让spring应 ...

  7. Laravel 和 Spring Boot 两个框架比较创业篇(一:开发效率)

    我个人是比较不喜欢去正儿八经的比较两个框架的,这样没有意义,不过欲善其事先利其器! 技术是相通的,但是在某个特定的领域的某个阶段肯定有相对最适合的一个工具! 这里比较不是从技术角度比较,而是从公司技术 ...

  8. (转)Spring Boot(十二):Spring Boot 如何测试打包部署

    http://www.ityouknow.com/springboot/2017/05/09/spring-boot-deploy.html 有很多网友会时不时的问我, Spring Boot 项目如 ...

  9. Spring Boot(十二):Spring Boot 如何测试打包部署

    有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下 Spring Boot 如何开发.调试.打包到最后的投产上线. 开发阶段 ...

随机推荐

  1. 【爱江山越野跑】ITRA积分认证流程

    背景:目前在越野跑领域,高级别的赛事有很多,比如UTMB,TDG等,而想报名参与这些赛事需要一定的积分(ITRA积分), 而这些积分的获得,需要参与获得ITRA认证的赛事,赛事难度不同,获得的积分也不 ...

  2. session和cookie的联系与区别

    区别: 1.cookie是存放在浏览器上的,session是存放在服务器上的: 2.cookie不安全,别人可以通过分析本地的cookie并进行cookie欺骗,session比cookie安全: 3 ...

  3. IOS7--javascriptcore中jscontext使用要注意的一点

    在公司一个项目中,用到了highchart做图表显示的组件,这就要用到了javascriptcore,代码就不上了,说说原理. 需求是这样的,通过http请求server csv格式的数据,然后解析, ...

  4. RedMine Email notifications configure for MS Exchange

    Boss需要用到RedMine(project management) open source. 由于不熟悉MS的SMTP服务,BOSS说他配好了,然后配置到Email notification时候, ...

  5. java 包冲突解决方法

    1.诊断包冲突 java.lang.NoSuchMethodError: org.apache.commons.io.output.DeferredFileOutputStream.<init& ...

  6. java必备——经典的Hibernate

    在编程开发中,我们有非常多框架,他们有些非常方便,也非常有用,今天我们一起来认识一个java经典的框架Hibernate,Hibernate英文名称为"冬眠".这是个非常有意思的技 ...

  7. Android 触摸及手势操作GestureDetector

    现在的智能手机不敢说百分百的都是触摸屏,也应该是百分之九九以上为触摸屏了,触摸屏为我们操作无键盘.无鼠标的手机系统带来了很多的便利.当用户触摸屏幕时会产生很多的触摸事件,down.up.move等等. ...

  8. 浅析PageRank算法(转)

    浅析PageRank算法 本文首先会讨论搜索引擎的核心难题,同时讨论早期搜索引擎关于结果页面重要性评价算法的困境,借此引出PageRank产生的背景.第二部分会详细讨论PageRank的思想来源.基础 ...

  9. UVALive 6560 The Urge to Merge

    题目链接:传送门 题目大意:有一个 3*n 的矩阵,每个格子里有一个数,你可以选择相邻的两个格子合并成一个,并且权值变为两数乘积,若一个数未合并,权值变为0,求最后权值总和最大值. 题目思路:以 2^ ...

  10. Downgrading an Exchange 2010 Server(Exchange降级)

    Downgrading an Exchange 2010 Server Microsoft Exchange Server 2010 comes in two versions: enterprise ...