DBUnit使用
前言:本文章需要JUnit单元测试框架的基础知识,若读者还不具备,请阅读笔者的JUnit文章:http://ray-yui.iteye.com/blog/1914106
UnitTest系列文章:
使用JUnit开发单元测试:http://ray-yui.iteye.com/blog/1914106
使用EasyMock扩展Junithttp://ray-yui.iteye.com/blog/1916170
使用Cactus测试Servlethttp://ray-yui.iteye.com/blog/1917515
使用Spring TestContext测试Spring应用http://ray-yui.iteye.com/blog/1921424
什么是DBUnit?
DBUnit是一个基于JUnit扩展的数据库测试框架。它能帮助我们更方便快捷的进行数据库测试.
为什么要使用DBUnit?
在我们使用JUnit单元测试框架编写单元测试的时候,少不免要对数据库进行操作,但请试想一下,当我要编写一个获取用户的单元测试时,数据库是不存在该记录的,那么我要测试获取用户时就需要往数据库添加一条用户记录,但当获取用户的单元测试完成并成功后,此测试并没有清理现场(删除插入数据库的记录),那样当我们再有单元测试需要插入记录时,就会造成ID冲突的情况,少量的单元测试还可以避免此种情况,但当单元测试的数据庞大时,就会出现各种各样的问题,而DBUnit可以帮助我们解决这类型的问题
DBUnit为我们做了什么?
DBUnit的设计理念是在测试之前,先对数据库进行备份,然后对数据库进行清空再插入我们为其准备的测试数据,最后在测试完毕后重新恢复数据库从而避免了JUnit对数据现场的破坏.
DBUnit使用:
1.首先为Maven增加DBUnit的依赖,还需要slf4j的依赖
以下代码为提取后的BaseTestpackage com.accentrix.ray;import static org.junit.Assert.assertEquals;import static org.junit.Assert.assertNotNull;import org.dbunit.dataset.IDataSet;import org.dbunit.operation.DatabaseOperation;import org.junit.Test;public class TestUser extends BaseTest {@Testpublic void testGetUser() throws Exception {// 首先获取到default-data.xml文件中的内容IDataSet ds = getDataSet("default-data.xml");// 调用backupAll方法保存数据库表backupAll();// 将default-data.xml中的内容替换成数据库的内容DatabaseOperation.CLEAN_INSERT.execute(connection, ds);// 进行单元测试逻辑的判断User user = userService.get(1);assertNotNull(user);assertEquals(user.getId(), new Integer(1));assertEquals(user.getPassword(), "456");assertEquals(user.getUsername(), "123");// 最后进行数据库的恢复// 当然我们也可以将backupAll和recover放在@Before和@After当中recover();}}
总结:
使用了DBUnit后可以实现了对数据库的隔离,成功弥补了JUnit单元测试不清理数据现场的缺憾,实际上DBUnit只是简单的在单元测试前把数据库的数据进行了备份然后插入xml中配置好的数据,在测试结束后再用备份好的原数据库数据填充回数据库.但当面对复杂的表关系和大数据量的时候,每次进行测试都进行数据的备份,也是一个很大的负担,而且把全部的测试数据都编写在xml当中也是很大的工作量