基于H2进行单元测试
单元测试是开发流程中很重要的环节,无论测试驱动还是集成测试,unit test的相关技术都会涉及到。
在测试过程中,数据的稳定是个很重要的保证,除了模拟数据、测试数据,通过内存数据库即时生成、擦除数据也是可选项。
内存测试数据库,主要还是H2,可以方便的集成到应用中,1.3.X版本也不到2MB,在打包阶段还可以去掉。
实际上应用H2作为内存数据库,还是存在一些问题需要去一一解决,例如:
·H2和Mysql的语法差异
·Mysql数据导入到H2的过程
·H2本身的配置问题
这些差异会对实际测试带来一些影响,比如迁移测试用例到H2上时,需要对差异带来的问题进行解决。
- 语法支持差异
例如创建表:
、** H2 **/ create TABLE area ( id int(4) unsigned not null AUTO_INCREMENT, parent int(4) unsigned, name varchar(15) not null, available tinyint(1) unsigned not null, supportcod tinyint(1) unsigned not null, index_ tinyint(1) unsigned not null default '0', path varchar(32), level int(11) not null, remark varchar(32), gbcode int(12), gbpcode int(12), logicdel int(1), type int(1), PRIMARY KEY (id) ); /** Mysql ** / CREATE TABLE `area` ( `id` int(4) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号', `parent` int(4) unsigned DEFAULT NULL COMMENT '父级区域id', `name` varchar(15) NOT NULL COMMENT '名称', `available` tinyint(1) unsigned NOT NULL COMMENT '是否启用', `supportcod` tinyint(1) unsigned NOT NULL COMMENT '是否支持货到付款', `index_` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '顺序', `path` varchar(32) DEFAULT NULL COMMENT '路径', `level` int(11) NOT NULL, `remark` varchar(32) DEFAULT NULL, `gbcode` int(12) DEFAULT NULL COMMENT '国标码', `gbpcode` int(12) DEFAULT NULL COMMENT '国标父编码', `logicdel` int(1) DEFAULT NULL COMMENT '逻辑删除(1删除0未删除)', `type` int(1) DEFAULT NULL COMMENT '区域类型\r\n1直辖市2省辖市3其它4国外', PRIMARY KEY (`id`), KEY `parent` (`parent`), KEY `name` (`name`) ) ENGINE=InnoDB AUTO_INCREMENT=93606 DEFAULT CHARSET=utf8 COMMENT='区域信息'
在Mysql下的CURRENT_TIMESTAMP命令H2并不支持,需要调整成:
default NOW();
2.数据导出
导入导出,需要考虑格式和编码的问题,可以使用IntelljIdea的数据源工具,进行DDL以及CSV格式文件的导出,然后通过H2的csvread命令导入:
insert into area ( select * from csvread('src/test/resources/hsqldb/data/area.txt'));
导出的CSV数据,需要带上head,例如:
'id','parent','name','available','supportcod','index_','path','level','remark','gbcode','gbpcode','logicdel','type' 22,,所有区域,1,0,0,22,0,,,,0,0 23,22,中国,1,0,0,22.23,1,,86,,0,0
3.H2的本身配置
· 如果原数据源是Mysql的,那针对H2要开启Mysql mode.
· 1.3版本,可以开启MVCC=true,解决事务下单线程锁表未释放问题。
我觉得主要是这三个方向存在一些注意事项,其他的就是应用本身的配置、SQL数据脚本组织的问题了。
优点:
· 测试数据稳定,通过CSV文件,方便编辑,结合git后,变更记录一目了然。
·测试效率提升,数据文件可以整体导入,也可以分单个用例进行导入,避免Mock构造大量数据的问题,也避免了反复查询数据库带来的性能开销。
在如今很多系统服务化后,服务的开发、测试,结合内存数据库,保证单元测试稳定以及高效率回归,是个不错的方案。