DBUnit--测试数据准备与验证的利器

来源:互联网 发布:win7网络图标灰色 编辑:程序博客网 时间:2024/05/21 17:19

单元测试时数据的准备与验证是一个很繁琐的过程,DBUnit为之提供了一套优雅的解决方案,可以帮我们从中解脱出来。

DBUnit数据准备

DBUnit支持将准备的数据放置在一个xml文件中,在执行测试用例之前自动同步到数据库中,执行完成后数据也可以自动销毁。示例如下:

<?xml version="1.0" encoding="UTF-8" ?><dataset>    <User UserId="200" UserName="tony" Age="25" pointValue="2000" /></dataset>

User表示是数据库中的表,UserId、UserName等表示表中的字段。我们可以在dataset中写入多个这样的记录,文件中每条记录对应数据库表中的一行记录。

DBUnit数据验证
假如我们执行一个测试用例把上面的记录中的pointValue=”2000” 更新为2500,通常的验证方式是更新后再去查询数据库再做比对。而DBUnit支持你将一个预期结果写到xml文件中,当测试用例更新完后会和数据库中的数据自动做比较,看看是否符合预期。下面是预期结果的xml文件

<?xml version="1.0" encoding="UTF-8" ?><dataset>    <User UserId="200" UserName="tony" Age="25" pointValue="2500" /></dataset>

由于DBUnit官方提供的用法和测试用例耦合太强,这里比较推荐spring-test-dbunit,我们可以通过几个简单的注解实现与测试的解耦:

@DatabaseSetup :将特定xml文件中的数据同步到数据库
@DatabaseTearDown: 清理数据
@ExpectedDatabase :数据验证,
其assertionMode属性支持两种验证方式–DatabaseAssertionMode.DEFAULT 要验证所有的字段,DatabaseAssertionMode.NON_STRICT则支持只验证部分字段,这个实际测试中更为常用,毕竟多数情况下并不需要验证所有的字段。
此外,@ExpectedDatabase只能用于增删改三种场景!

上面这几个注解要起作用,记得首先要在@TestExecutionListeners中配置DbUnitTestExecutionListener,具体用法下篇会有完整示例。

下面是spring-test-dbunit注解的用法的示例:

    @Test    @DatabaseTearDown    @DatabaseSetup("/data/user-setUpData.xml")    @ExpectedDatabase(table = "User",            assertionMode= DatabaseAssertionMode.NON_STRICT,            value= "/data/updatePoint-exceptedData.xml")    public void testUpdatePointValue() throws Exception {        int result = userDao.updatePointValue(200L,2500L);        Assert.assertEquals(result,1);    }

这里,@DatabaseSetup会把/data/user-setUpData.xml文件中的数据同步到数据库,然后执行updatePointValue,将pointValue更新为2500,最后再拿数据库中更新后的数据和/data/updatePoint-exceptedData.xml文件中的数据做比较。@DatabaseTearDown则测试用例执行完后重置数据库清理掉数据。

更多内容欢迎关注个人微信公众号,一起成长!

原创粉丝点击