DBUnit数据库测试:
DBUnit是一个基于扩展的框架。它提供了大量的类对与数据库相关的操作进行了抽象和封装。它通过使用用户自定义的数据集以及相关操作使数据库处于一种可知的状态,从而使得测试自动化、可重复和相对独立。虽然不用dbunit也可以达到这种目的,但是我们必须为此付出代价(编写大量代码,测试及维护),既然有了这么优秀的开源框架,我们又何必再造轮子。
普通的测试数据库的方法不仅较为麻烦,而且在对数据库测试完后会残留数据在数据库里或者把数据库的数据修改了,相对于普通的测试,dbunit可以将数据库已有的数据保存到xml文件上,以免在对数据库进行测试时破坏里面的数据。
可以直接在Maven工程里下载dbunit依赖包,普通工程的话直接导入jar包到工程环境即可。
Maven工程配置dbunit依赖包示例:
我们先单纯用JUnit做一个普通的数据库测试,以此来查看这种测试的弊端。
1.准备一个有些许数据的数据库表格:
2.接着先编写一个Student类,将这个类的属性封装一下,然后再将这个类的属性信息写入输入库:
3.写一个专门的类来得到数据库连接对象
4.编写一个类,用于将Student属性数据写入到数据库,这个类具有更新、插入、删除、查询数据的方法:
5.编写测试类,进行测试,在这里我只测试了插入数据方法:
测试结果:
但是这样子数据库会残留测试的数据:
虽然这种情况可以将表格创建一个副本出来,然后对表格副本进行测试,这样就避免了会破坏表格里的数据,但是这种方法比较麻烦,而且有些情况就是想直接对表格进行测试而不想对副本进行测试,那么就需要使用DBUnit工具,DBUnit有一个DatabaseOperation类可以在测试前先将数据库已有的数据保存到xml文件上,然后测试完成之后再将这个xml文件里的数据还原到数据表格里,这样就避免在对数据库进行测试时破坏里面的数据。
先介绍一下DatabaseOperation类,该类是一个代表了对数据库的操作,例如CUD以及其组合等, 它采用了退化的工厂模式,可直接通过它获取其具体的子类,使用这个类可以在测试完后还原数据库的表格数据:
DatabaseOperation:
NONE:不执行任何操作,是getTearDownOperation的默认返回值。
UPDATE:将数据集中的内容更新到数据库中。它假设数据库中已经有对应的记录,否则将失败。
INSERT:将数据集中的内容插入到数据库中。它假设数据库中没有对应的记录,否则将失败。
REFRESH:将数据集中的内容刷新到数据库中。如果数据库有对应的记录,则更新,没有则插入。
DELETE:删除数据库中与数据集对应的记录。
DELETE_ALL:删除表中所有的记录,如果没有对应的表,则不受影响。
TRUNCATE_TABLE:与DELETE_ALL类似,更轻量级,不能rollback。
CLEAN_INSERT:是一个组合操作,是DELETE_ALL和INSERT的组合。是getSetUpOeration的默认返回值。
使用DBUnit工具进行测试:
前4步和上面的一样,不同的就在于第5步测试类的编写:
测试结果:
xml文件内容,这个文件就是以xml格式来存储数据库表格的数据:
使用DBUnit工具测试完后,数据库表格里的数据就不会出现测试数据残留或者数据损坏了: