当前位置:网站首页>小知识点系列-基于H2数据库单元测试
小知识点系列-基于H2数据库单元测试
2022-08-02 14:16:00 【蒲春伟】
引言
单元测试(Unit Test),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般情况下是一个方法或是一段逻辑,使用单元测试可以在不启动整体程序而进行局部逻辑和用例测试,提前在开发过程中发现问题,降低问题在生产环境发生的可能。 对于业务逻辑层一般情况下是通过mock外部的接口和DAO层的接口,而针对DAO层的逻辑多数情况要么不进行单元测试或是直接连接线下DB进行测试。如果线下数据库不稳定或是数据存在变化的情况下将会导致测试用例不能每次都跑通过,进而对研发效率造成影响,本文重点介绍通过内存数据库来实现轻量级别的DAO测试的技术方案。
1. 内存数据库是什么
内存数据库依赖于系统内存而不是磁盘数据存储空间。因为内存访问比磁盘访问快。当我们不需要持久化数据时,我们使用内存数据库。内存数据库是嵌入式数据库。默认情况下,内存数据库是易失性的,当我们重新启动应用程序时,所有存储的数据都会丢失。广泛使用的内存数据库是 H2数据库,基于内存数据库H2比较广泛的实践则为单元测试的持久层的解决方案
2. H2数据源初始化
通过SpringBoot配置类Configuration进行相关数据源初始化,与传统数据库DataSource一样,需要配置数据源相关的配置,相关参数参考如下,除此之外与普通数据源不同的在于需要增加一个内存数据库创建的Bean,用于在启动时生成H2数据库,对应的Bean为DataSourceInitializer。
@Configuration
public class H2DbConfig {
@Bean
public DataSource dataSource() {
SimpleDriverDataSource simpleDriverDataSource = new SimpleDriverDataSource();
simpleDriverDataSource.setDriverClass(org.h2.Driver.class);
simpleDriverDataSource.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=MySQL");
simpleDriverDataSource.setUsername("test");
simpleDriverDataSource.setPassword("");
DataSource dataSource = simpleDriverDataSource;
return dataSource;
}
@Bean
public DataSourceInitializer dataSourceInitializer(DataSource dataSource) {
DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource);
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
resourceDatabasePopulator.addScript(new ClassPathResource("h2/sql/schema.sql"));
resourceDatabasePopulator.setContinueOnError(Boolean.TRUE);
resourceDatabasePopulator.setIgnoreFailedDrops(Boolean.TRUE);
initializer.setDatabasePopulator(resourceDatabasePopulator);
return initializer;
}
}
3. H2数据库结构定义
上面在定义H2数据库时指定了表结构的配置文件在ClassPath下的h2/sql/schema.sql下,通过schema我们定义我们DAO测试所需要的表结构,可以直接通过MySQL导出建表语句。
drop table if exists user;
create table user (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(250) NOT NULL,
last_name VARCHAR(250) NOT NULL,
email VARCHAR(250) DEFAULT NULL
);
4. 基于SpringJUnit4ClassRunner进行功能测试
通过ContextConfiguration在启动时初始化H2数据源和ORM相关框架配置,然后进行
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
MybatisDataSourceConfig.class,H2DbConfig.class })
public class DemoDaoTest {
@Autowired
private DemoDao demoDao;
@Test
public void testInsert() {
User user = new User();
user.setFirstName("aa")
demoDao.insert(user);
}
}
边栏推荐
猜你喜欢

Mysql索引优化一
![The relationship between base classes and derived classes [inheritance] / polymorphism and virtual functions / [inheritance and polymorphism] abstract classes and simple factories](/img/c1/c695006706ce91233d9ac8ecb95c50.png)
The relationship between base classes and derived classes [inheritance] / polymorphism and virtual functions / [inheritance and polymorphism] abstract classes and simple factories

【线程】 理解线程(并行)线程同步的处理(信号量,互斥锁,读写锁,条件变量)

字符数组/字符串数组|数组指针/指针数组/

How to tick the word box?

计算机网络中的安全(一)网络安全的概念与加密原理

smart_rtmpd 的 VOD 接口使用说明

net start mysql 服务名无效。

对象头和synchronized的升级

深入理解负载均衡
随机推荐
CPU缓存一致性协议MESI
【软件测试】基础篇
虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。模块“Upgrade”启动失败。未能启动虚拟机。
How to tick the word box?
The relationship between base classes and derived classes [inheritance] / polymorphism and virtual functions / [inheritance and polymorphism] abstract classes and simple factories
Run ns3 with multiple processes
【线程】线程创建 | 理解线程并发 (1)
CDH(computational Diffie-Hellman)问题以及与离散对数、DDH问题的区别
Feign Client 超时时间配置不生效
大厂年薪50w+招聘具有测试平台开发能力的测试工程师
Mysql索引优化一
char array/string array|array pointer/pointer array/
分布式一致性协议-Raft
创建系统还原点及恢复
OpenPose 运行指令 ([email protected])
JVM常量池详解
【网络安全】学习笔记 --02 安全通信协议
Oauth2.0 authentication server construction
关于导出聊天记录这件事……
指针/【类型】对指针加一能力的影响(&*ip ,*&ipd)