dbunit使用(转自:http://ttitfly.iteye.com/blog/248680)

本文详细介绍了DbUnit单元测试工具的使用方法,包括如何通过DbUnit进行数据库表数据与XML文件之间的相互转换,以及如何利用DbUnit进行数据库测试的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.dbunit从名字上可以看出,是对有关数据库操作的测试。官网:www.dbunit.org从官网下载dbunit相关的jar包,dbunit还依赖于http://www.slf4j.org和commons-logging.jar,所以也需要下载slf4j,使用它的slf4j-api-1.5.3.jar和slf4j-jcl-1.5.3.jar。
dbunit的原理是:它会把数据库表里的数据和一个xml文件里表示的数据关联起来。也就是说数据库表里的数据可以导出到一个对应的xml里,同时也可以将一个xml里的数据导入到数据库表里。是相互转换的。
数据库表里的数据<===>xml文件

可以做个测试如下:

package com.test.dbunit; import java.io.FileOutputStream; import java.sql.Connection; import java.sql.DriverManager; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.database.QueryDataSet; import org.dbunit.dataset.xml.FlatXmlDataSet; public class TestApp { public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost/dbunit", "root", ""); IDatabaseConnection connection = new DatabaseConnection(conn); QueryDataSet dataSet = new QueryDataSet(connection); //将整个person表里的数据导出到 xml文件里 dataSet.addTable("person"); //将users表里符合条件的数据导出到xml文件里 dataSet.addTable("users","select * from users where id < 4"); //导出到dbunit.xml文件里 FlatXmlDataSet.write(dataSet,new FileOutputStream("dbunit.xml")); } } 如果想把某个数据库里的所有表里的数据全部导出到某个xml里,又不想通过addTable一个个来添加的话。则必须通过IDatabaseConnection的createDataSet()来创建IDataSet
public static void main(String[] args) throws Exception{  
        Class.forName("com.mysql.jdbc.Driver");  
  
        Connection conn = DriverManager.getConnection(  
                "jdbc:mysql://localhost/dbunit", "root", "");  
          
        IDatabaseConnection connection = new DatabaseConnection(conn);  
        //如果想把某个数据库里的所有表里的数据全部导出到某个xml里,又不想通过addTable一个个来添加的话。则必须通过IDatabaseConnection的createDataSet()来创建IDataSet  
        IDataSet dataSet = connection.createDataSet();  
        //导出到dbunit.xml文件里  
        FlatXmlDataSet.write(dataSet,new FileOutputStream("dbunit1.xml"));  
        //也可以用FlatDtdDataSet导出一个对应的dtd文件  
        FlatDtdDataSet.write(dataSet,new FileOutputStream("dbunit1.dtd"));  
    }  

 

生成的dbunit.xml内容如下:

<?xml version='1.0' encoding='UTF-8'?> <dataset> <person/> <users id="1" username="zhangsan" password="123"/> <users id="2" username="lisi" password="456"/> <users id="3" username="wangwu" password="789"/> </dataset>
2.用dbunit做测试,需要继承DBTestCase,并需要重写protected IDataSet getDataSet() throws Exception

package com.test.dbunit; import java.io.File; import java.io.FileInputStream; import org.dbunit.Assertion; import org.dbunit.DBTestCase; import org.dbunit.PropertiesBasedJdbcDatabaseTester; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.ITable; import org.dbunit.dataset.SortedTable; import org.dbunit.dataset.filter.DefaultColumnFilter; import org.dbunit.dataset.xml.FlatXmlDataSet; import org.dbunit.operation.DatabaseOperation; public class SimpleTest extends DBTestCase { public SimpleTest() { // super(); System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, "com.mysql.jdbc.Driver"); System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, "jdbc:mysql://localhost/dbunit"); System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "root"); System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, ""); } /** * 给定数据集 */ @Override protected IDataSet getDataSet() throws Exception { System.out.println("init..."); return new FlatXmlDataSet(new FileInputStream("dbunit.xml")); } public void test1() throws Exception{ IDataSet dbDataSet = getConnection().createDataSet(); ITable dbTable = dbDataSet.getTable("users"); IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit.xml")); ITable xmlTable = xmlDataSet.getTable("users"); Assertion.assertEquals(xmlTable, dbTable); } /** * 表结构和dbunit1.xml结构不一致 */ public void test2() throws Exception{ IDataSet dbDataSet = getConnection().createDataSet(); ITable dbTable = dbDataSet.getTable("users"); IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit1.xml")); ITable xmlTable = xmlDataSet.getTable("users"); //第一种写法 // dbTable = DefaultColumnFilter.includedColumnsTable(dbTable,xmlTable.getTableMetaData().getColumns()); //第二种写法 dbTable = DefaultColumnFilter.includedColumnsTable(dbTable,xmlDataSet.getTableMetaData("users").getColumns()); Assertion.assertEquals(xmlTable, dbTable); } /** * 只比较username */ public void test3() throws Exception{ IDataSet dbDataSet = getConnection().createDataSet(); ITable dbTable = dbDataSet.getTable("users"); IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit1.xml")); ITable xmlTable = xmlDataSet.getTable("users"); dbTable = DefaultColumnFilter.excludedColumnsTable(dbTable, new String[]{"id","password"}); xmlTable = DefaultColumnFilter.excludedColumnsTable(dbTable, new String[]{"password"}); Assertion.assertEquals(xmlTable, dbTable); } /** * 表里数据和dbunit2.xml里的数据的顺序不一致 */ public void test4() throws Exception{ IDataSet dbDataSet = getConnection().createDataSet(); ITable dbTable = dbDataSet.getTable("users"); IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit2.xml")); ITable xmlTable = xmlDataSet.getTable("users"); SortedTable dbSortedTable = new SortedTable(dbTable,new String[]{"id"}); //按数据库里表结构字段类型来进行排序,如果是int则按int排序,不是依照字符串的形式排序 dbSortedTable.setUseComparable(true); SortedTable xmlSortedTable = new SortedTable(xmlTable,new String[]{"id"}); //按数据库里表结构字段类型来进行排序,如果是int则按int排序,不是依照字符串的形式排序 xmlSortedTable.setUseComparable(true); Assertion.assertEquals(xmlSortedTable, dbSortedTable); } /** * 对Users表插入一条记录做测试 * @throws Exception */ public void test5() throws Exception{ UsersDB db = new UsersDB(); Users users = new Users(); users.setId(9); users.setUsername("hello"); users.setPassword("world"); db.save(users); IDataSet dataSet = getConnection().createDataSet(); ITable actualTable = dataSet.getTable("users"); IDataSet dataSet2 = new FlatXmlDataSet(new File("expected.xml")); ITable expectedTable = dataSet2.getTable("users"); Assertion.assertEquals(expectedTable, actualTable); } /** * 在把xml里的数据导入到db里之前,需要对数据库里的表的数据做的操作。 */ protected DatabaseOperation getSetUpOperation() throws Exception { System.out.println("setup..."); return DatabaseOperation.CLEAN_INSERT; } /** * 测试执行完以后,需要对数据库里的表里的数据做的操作 */ protected DatabaseOperation getTearDownOperation() throws Exception { System.out.println("teardown..."); return DatabaseOperation.DELETE_ALL; } }
其中expected.xml内容为:

<?xml version='1.0' encoding='UTF-8'?> <dataset> <person/> <users id="1" username="zhangsan" password="123"/> <users id="2" username="lisi" password="456"/> <users id="3" username="wangwu" password="789"/> <users id="9" username="hello" password="world"/> </dataset>
dbunit做测试唯一不好的地方就是要大量使用xml文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值