基于H2进行单元测试

基于H2进行单元测试

单元测试是开发流程中很重要的环节,无论测试驱动还是集成测试,unit test的相关技术都会涉及到。

在测试过程中,数据的稳定是个很重要的保证,除了模拟数据、测试数据,通过内存数据库即时生成、擦除数据也是可选项。

内存测试数据库,主要还是H2,可以方便的集成到应用中,1.3.X版本也不到2MB,在打包阶段还可以去掉。

实际上应用H2作为内存数据库,还是存在一些问题需要去一一解决,例如:

·H2和Mysql的语法差异

·Mysql数据导入到H2的过程

·H2本身的配置问题

这些差异会对实际测试带来一些影响,比如迁移测试用例到H2上时,需要对差异带来的问题进行解决。

  1. 语法支持差异

例如创建表:

、** 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构造大量数据的问题,也避免了反复查询数据库带来的性能开销。

在如今很多系统服务化后,服务的开发、测试,结合内存数据库,保证单元测试稳定以及高效率回归,是个不错的方案。

留下回复