在测试中使用内存数据库

初始化数据库和导入数据一文中,我们探索了在Spring Boot项目中如何创建数据库的表结构,以及如何往数据库中填充初始数据。在程序开发过程中常常会在环境配置上浪费很多时间,例如在一个存在数据库组件的应用程序中,测试用例运行之前必须保证数据库中的表结构正确,并且已经填入初始数据。对于良好的测试用例,还需要保证数据库在执行用例前后状态不改变。

在之前应用的基础上,schema.sql文件中包含创建数据库表结构的SQL语句、data.sql文件中包含填充初始数据的SQL语句。这篇文章将//todo

How Do

  • 在src/test/resources目录下创建test-data.sql文件,用于导入测试数据
INSERT INTO author(first_name, last_name) VALUES ("Greg", "Turnquist");
INSERT INTO book(isbn, title, author, publisher) VALUES ('9781-78439-302-1', 'Learning Spring Boot', 2, 1)
  • 修改BookPubApplicationTests文件,添加数据源属性(ds),是否需要导入测试数据的标志(loadDataFixtures),添加loadDataFixtures方法。
public class BookPubApplicationTests {
    ...
    @Autowired
    private DataSource ds;
    private static boolean loadDataFixtures = true;
    private MockMvc mockMvc;
    private RestTemplate restTemplate = new TestRestTemplate();

    @Before
    public void setupMockMvc() {
       ...
    }

    @Before
    public void loadDataFixtures() {
        if (loadDataFixtures) {
            ResourceDatabasePopulator populator = new
                    ResourceDatabasePopulator(context.getResource("classpath:/test-data.sql"));
            DatabasePopulatorUtils.execute(populator, ds);
            loadDataFixtures = false;
        }
    }

   @Test
   public void contextLoads() {
        assertEquals(2, bookRepository.count());
   }

    @Test    public void webappBookIsbnApi() {
        ...
    }
    @Test    public void webappPublisherApi() throws Exception {
        ...
    }
}
  • 运行单元测试,可以通过
  • Spring Boot会搜集resources目录下的所有data.sql文件进行数据导入,由于测试代码有自己的resource目录,因此在这个目录下再创建一个data.sql*文件,内容是:
INSERT INTO author (id, first_name, last_name) VALUES (3, "William", "Shakespeare");
INSERT INTO publisher (id, name) VALUES (2, "Classical Books");
INSERT INTO book(isbn, title, author, publisher) VALUES ('978-1-23456-789-1', "Romeo and Juliet", 3, 2);
  • 由于又新加了一个book记录,因此需要修改BookPubApplicationTest
@Test
public void contextLoads() {
       assertEquals(3, bookRepository.count());
}
  • 至此我们还都是使用外部数据库——MySQL,现在尝试使用内存数据库H2,因此在src/test/resources目录下添加application.properties文件,内容是:
spring.datasource.url=\  jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.jpa.hibernate.ddl-auto=none
  • 执行测试用例,可以通过。需要注意的是:Spring Boot仅仅会加载一个application.properties文件,由于此处我在src/test/resources目录下新建了application.properties文件,所以之前的那个(在src/main/resources目录下)不会被加载。

分析

我们通过Spring的ResourceDatabasePopulator和DatabasePopulatorUtils类加载test-data.sql文件,在test-data.sql文件中的数据仅仅对当前所在的*Test.java文件有效。Spring Boot自身去处理schema.sql和data.sql文件时也是依靠这两个类,这里我们不过是显式指定了我们希望执行的脚本文件。

  • 创建setup方法——loadDataFixtures(),并用@Before注解修饰,表示在测试用例之前运行该方法。
  • loadDataFixtures()方法中,首先通过context.getResources方法加载test-data.sql文件,然后通过DatabasePopulatorUtils.execute(populator, ds)执行该文件中的SQL语句。
  • 为了避免每个@Test修饰的测试用例之前都导入数据,因此引入一个标志变量——loadDataFixtures(初始化为true),因此该方法只执行一次。
时间: 2024-09-10 04:05:20

在测试中使用内存数据库的相关文章

用户体验设计:浅谈可用性测试中沟通的技巧

文章描述:如何快速解除用户防备?--浅谈可用性测试中沟通的技巧.   一般来说,在产品的设计和开发过程中,不同阶段会使用到不同的用户研究方法.比如,在产品正式发布之前,通常会进行可用性测试.可用性测试,是指让一群有代表性的用户尝试对产品进行典型操作,同时观察员和开发人员在一旁观察.聆听.记录.该产品可能是一个网站.软件,或其他任何产品,它可能已经做好,也可能尚未成型. 对于一个典型的可用行测试,我们可以:1. 通过观察用户在使用产品过程中出现的一些问题,发现产品的可用性问题2. 从测试参与者的表

敏捷测试中理想的测试组织

近些年,在软件项目中非常流行一个词--敏捷.大大小小的项目,通常都包含着"敏捷"这个 关键字.其实敏捷本身是一种优化的思想,是软件工程发展到一定阶段后的产物.面对风云变幻的市 场,都希望迅速响应市场或客户的变化.但如何真正在项目中做到敏捷,除了方法论之外,还有各种 外部条件的制约.而现实是很多研发团队只注重了方法论的学习,而没注意组织结构应该如何变化才 能适应敏捷测试的需要.有的人可能会说,敏捷强调的不是人人都应该是开发和测试吗?但这只是在 理想情况中.真实项目中,肯定还是存在测试和开

测试中经常会遗漏的几个地方

做测试也有段时间了.在网上随便找了下.发现有些人也有些个类似的东西.就干脆做了点整理,其中对于功能方面的东西见前人大多已经有整理过就直接拖了些进来,还望见谅,当然基本还是属于原创. 希望大家给予补充. 个人认为软件出现的BUG首先第一个责任一般都是测试用例的问题.其次是测试方法(本身的知识).最后则是态度问题.如果测试用例不完善,不论测试人员自身的水平多好,态度多好,都必然会出问题,除非测试人员对测试用例进行了很好的完善.而如果测试用例是完好的,如果自身知识点比较贫乏也是很容易出问题的.例如说测

浅谈Symphony Spreadsheet在报表测试中的应用

报表测试中常见数据对比 在 ERP 和 BI 项目测试过程中,对报表数据进行校验是非常有必要的,常见的数据对比场 景如下:从系统导出的 Excel 格式的报表数据,然后再给一份业务数据的源数据,要求校验报表数据是否正确.报表的数据量 通常都非常庞大,这些数据通常都是通过聚合汇总以及其它逻辑运算得出的结果,源数据量也很大,源数据和报表数据的条数也 不一定相等,而且源数据通常会有很多张表,仅仅是通过肉眼观察源数据和报表数据是否一致,会导致测试工作量巨大,效率低 下,风险不易控制. 那么接下来就一起探

利用Spring2.5和Reflection简化测试中的mock

spring2.5最大的特色就是全面使用annotation代替xml配置,包括IOC Container.springMVC和 TestContext测试框架等,给我们开发带来了极大的便利.springMVC的新特性在这篇文章里面已经有了比较详尽的介绍,而对于spring的新TestContext测试框架,大家也可以从这里得到详细的例子说明,有兴趣的可以去仔细阅读,本文不再赘述.总而言之,通过spring2.5提供的 annotation,我们可以让我们的类--包括controller,Tes

压力测试中存在的问题

压力测试中存在的问题 (What) 什么是压力测试 软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分.软件压力测试的基本思路很简单: 不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试. 通常要进行软件压力测试的资源包括内部内存.CPU 可用性.磁盘空间和网络带宽. 压力测试涵盖,性能测试,负载测试,并发测试等等,这些测试点常常交织耦合在一起. 压力测试存在那些问题 我归纳一下又几点: 操作系统默认安装,在未做任何优化的情况下实施压力测试

sqlserver-左连接条件的执行顺序? 测试中,300条数据成功,700条数据出错(substring不能为空)

问题描述 左连接条件的执行顺序? 测试中,300条数据成功,700条数据出错(substring不能为空) select *from tb1left join tb2on tb1.str != nulland substring(str 0 2) = tb2.str. 解决方案 on tb1.str is not nulland tb2.str is not nulland substring(tb1.str 0 2) = tb2.str.

webservice 测试 中tomcat的问题

问题描述 webservice 测试 中tomcat的问题 在webservice 测试过程中,为什么http://localhost:8080这个网页能打开,但是为什么http://localhost:8080/WebService/services这个网页打不开,这是为什么?是tomcat没有配置好吗,按说配置好的话为什么http://localhost:8080这个网页也应该打不开的 解决方案 tomcat貌似没问题,关键是你的service部署是否正常 解决方案二: 看看你的拦截器是否正

渗透测试中的msiexec

本文讲的是渗透测试中的msiexec, 0x00 前言 在上篇研究了ClickOnce的渗透技巧,接触到了安装包的概念.关于安装包还有一个常见的是msi文件,可在命令行下通过msiexec安装,所以这次就研究一下msiexec在渗透测试中的利用技巧 0x01 简介 msiexec: 系统进程,是Windows Installer的一部分 用于安装Windows Installer安装包(MSI) 一般在运行Microsoft Update安装更新或安装部分软件的时候出现,占用内存比较大 系统自带