在测试中使用内存数据库
2023-09-14 09:03:12 时间
在初始化数据库和导入数据一文中,我们探索了在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),因此该方法只执行一次。不要短时间大量重复读写相同的key server端的原理是网络收包后,放入到工作队列(读写队列分离,但都只有一个),再由工作线程从队列中取出进行处理。
相关文章
- extremedb同步mysql_数据库选型之内存数据库eXtremeDB[通俗易懂]
- 内存因0xc000009c的错误_0xc0000005错误怎么解决
- JVM 一张图带你了解内存分配过程 搞懂逃逸分析|标量替换|指针碰撞|空闲列表|TLAB
- 漫画大数据:如何解决 NameNode 内存持续增长的问题(三)
- 【Linux 内核 内存管理】mmap 系统调用源码分析 ③ ( vm_mmap_pgoff 函数执行流程 | vm_mmap_pgoff 函数源码 )
- Linux下获取内存信息快速指南(linux获取内存信息)
- 优化Oracle数据库内存优化指南(oracle内存)
- Raspberry Pi 4 发布 8G 内存版本
- 火力全开:Redis内存数据库的强劲性能(redis内存数据库)
- Redis:让内存数据库更灵活(redis内存数据库)
- Redis:利用内存极速提升数据库性能(redis内存数据库)
- 微软承认新 BUG:使用持久性内存的设备会出现启动缓慢问题
- mssql数据库的内存限制:改进性能!(mssql限制内存)
- Oracle数据库基于内存融合技术突破性突破(oracle 内存融合)
- Oracle内存告警尽早预防错过恢复节点(oracle内存告警)
- 内存数据库秒杀火热,抢红包功能由Redis加速(抢红包功能结合redis)
- 使用探究Redis内存利用的技巧(如何看redis里的内存)
- Redis强大的NoSQL内存数据库(啥是redis)
- 红色快速内存数据库默认采用调度策略(redis默认使用数据库)
- Oracle12c引入新一代内存数据库架构(oracle12c内存库)
- 基于Java内存溢出的解决方法详解