当前位置:网站首页>小知识点系列-基于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);
}
}
边栏推荐
猜你喜欢
随机推荐
webrtc 有关 SDP 部分的解析流程分析
CDN的加速原理是什么?
关于导出聊天记录这件事……
【线程安全】用户级,内核级,组合级线程|线程同步的处理(条件变量)|strtok_r(可冲入函数)
Linux下mysql的彻底卸载
Mysql索引优化二
怎么使用 smart_rtmpd 的纯 webrtc 功能?
大厂年薪50w+招聘具有测试平台开发能力的测试工程师
【软件测试】selenium自动化测试1
在mininet中测试arp欺骗
H3C 交换机配置端口组、DHCP、DHCP中继、管理用户
排序方法汇总(C语言)
"Array" look-up table method (leap year)
指针/【类型】对指针加一能力的影响(&*ip ,*&ipd)
Mysql开启日志并按天进行分割
移动拷贝构造函数
【软件测试】基础篇
Windows下mysql服务无法启动:服务没有报告任何错误。
hybrid 实现同网段但不同vlan之间通讯
idea同时修改相同单词