DBUnit扩展自JUnit.在使用DBUnit之前,为了验证自己编写的涉及数据库操作方法的正确性,每次都要执行一个简单的sql脚本,灌些数据,然后人眼观察着数据表中的数据.然后,代码执行完毕后,再次观察数据变化情况.久而久之,表里面的数据就变得杂乱,一般会全部删除,重新来过.
DBUnit的目标正是保证数据库数据环境的稳定性,具备将数据库中数据与xml文件之间双向转换的能力.
试验了一下,
首先,下载dbunit的jar包,加入工程即可.
1.从xml中将数据导入数据库表
tc不再继承自TestCase,而是继承DatabaseTestCase
覆盖几个方法,包括获得xml文件内容,获得DB连接,以及在setup方法和teardown方法中调用提供的dbunit操作类型,构建数据库内数据环境.
这时,我以为如果只有几个简单的数据,写xml固然简单,但想测试大数据量时(虽然UT主要是测试功能而非性能,但是大数据量也方便验证)就有点问题,好在是双向的,可以先把数据用function灌入数据库,再导进xml里面:
2.从数据库表数据导入xml文件
用ant+DBUnit来完成这个任务非常方便!
<
target
name
="export"
>
<
taskdef
name
="dbunit"
classname
="org.dbunit.ant.DbUnitTask"
classpathref
="compile.path"
/>
<
dbunit
driver
="com.mysql.jdbc.Driver"
url
="jdbc:mysql://127.0.0.1:3306/mydb"
userid
="root"
password
="root"
supportBatchStatement
="true"
>
<
export
dest
="${test.srcpath}/export.xml"
>
<
query
name
="test_table"
sql
="SELECT * FROM test_table"
/>
<
table
name
="user_table"
/>
</
export
>
</
dbunit
>
</
target
>
疑问,看到有人说DBUnit在清除数据时,有时不能彻底,原因是分析不出来外键等表之间的约束.因为在试验中采用的数据库里没啥表之间的约束,所以还没有体会到.
DatabaseTestCase类提供了两个方法来控制测试前和测试后的数据库状态:getSetUpOperation() 和 getTearDownOperation().
一种高效的实施方案就是让getSetUpOperation()方法执行REFRESH操作,通过这个操作,我们可以用种子文件中的数据去更新目标数据库里的数据。
接下来,就是getTearDownOperation(),让他去执行一个NONE操作,也就是什么也不执行
常用操作:
DatabaseOperation.CLEAN_INSERT; 先删除表中所有,再插入准备的数据
DatabaseOperation.REFRESH; 使用准备数据更新表,存在则update,不存在则insert
DatabaseOperation.DELETE; 只删除准备的数据
DatabaseOperation.NONE; 啥都不做