当前位置:   article > 正文

spring boot应用测试框架介绍

datasetloader = xlsdatasetloader.class

一、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、应用

实例主要代码如下:

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @SpringBootTest(classes = DemoTestApplication.class)
  3. @TestExecutionListeners({
  4. DependencyInjectionTestExecutionListener.class,
  5. TransactionDbUnitTestExecutionListener.class})
  6. @DbUnitConfiguration(dataSetLoader = XlsDataSetLoader.class)
  7. @Transactional
  8. public class UserControllerTest {
  9. @Autowired
  10. private UserController userController;
  11. @Test
  12. @DatabaseSetup({"/data/test_getUsername.xls"})
  13. public void test_getUsername() {
  14. String username = userController.getUsername(1234);
  15. Assert.assertTrue(username.equals("zhangsan"));
  16. }
  17. }

test_getUsername.xls的内容如下:

4596e7b660683d7e83944264785994f59ee.jpg

2.3、实现原理

测试环境准备:

@RunWith(SpringJUnit4ClassRunner.class):用于启动测试、注册TestExecutionListener、构建testContext。

@SpringBootTest(classes = DemoTestApplication.class):利用SpringBootTestContextBootstrapper加载applicationContext。

DependencyInjectionTestExecutionListener:用来将bean注入到测试的class中,例如实例中的userController。

446de1d01047cc3bcc355d954fcb69ab687.jpg

事务实现原理:

22fb1f44608704c1db5adb4bc5cc916cd60.jpg

这里的TransactionalTestExecutionListener简称T,DbUnitTestExecutionListener简称D,如下图:

cc39afdbba7a2988b959e0ecd5db2a24a54.jpg

运行流程为:初始化测试类-->开始事务-->准备测试数据-->运行测试方法-->进行expectedData校验-->回滚或者提交事务。这就保证了整个方法的测试过程中,数据准备、测试方法运行、测试数据校验都在一个事务里面,最后事务如果回滚了,就不会在测试数据库中留下测试数据。

三、spring-boot-unitils-starter介绍与应用

3.1、介绍

unitils框架介绍:Unitils is an open source library aimed at making unit and integration testing easy and maintainable。堪称测试之王,其组成结构如下:

a084de05a01b4fb6e41cfd091f2db80ad66.jpg

unitils目前只支持xml配置的spring项目,对于spring-boot项目稍不支持,基于此,我就开源一个项目,用于在unitils和spring-boot应用之间建立起桥梁。

这个开源项目主要做了以下工作:

  • 重写SpringModule->SpringBootModule,支持ApplicationContext的设置
  • ApplicationContext设置到SpringBootModule中
  • DataSource替换
  • 支持xls的dataSet

目前可用的版本为:

  1. <dependency>
  2. <groupId>com.github.yangjianzhou</groupId>
  3. <artifactId>spring-boot-unitils-starter</artifactId>
  4. <version>1.1.0.RELEASE</version>
  5. </dependency>

3.2、应用

实例代码如下:

  1. @RunWith(UnitilsBootBlockJUnit4ClassRunner.class)
  2. @SpringBootTest(classes = DemoTestApplication.class)
  3. @Transactional(value = TransactionMode.ROLLBACK)
  4. public class UserControllerTest {
  5. @SpringBeanByType
  6. private UserController userController;
  7. @Test
  8. @DataSet({"/data/test_getUsername.xls"})
  9. public void test_getUsername() {
  10. String username = userController.getUsername(1234);
  11. Assert.assertTrue(username.equals("zhangsan"));
  12. }
  13. }

3.3、实现原理

38803acd35a0ca3302fa59f5f9b0c627ee0.jpg

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/987975
推荐阅读
相关标签
  

闽ICP备14008679号