专门针对数据库测试的DbUnit入门实战

比较有用的文档地址:

http://www.dbunit.org/faq.html#streaming

http://www.dbunit.org/properties.html#qualifiedtablenames

http://www.dbunit.org/components.html#streamingdataset

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文件 

可以做个测试如下: 

工具类

java 代码
  1. package dbunit;   
  2.   
  3. import java.io.FileNotFoundException;   
  4. import java.io.FileOutputStream;   
  5. import java.io.IOException;   
  6. import java.sql.Connection;   
  7. import java.sql.DriverManager;   
  8. import java.sql.SQLException;   
  9. import java.util.HashSet;   
  10. import java.util.Iterator;   
  11. import java.util.Map;   
  12. import java.util.Set;   
  13.   
  14. import org.dbunit.DatabaseUnitException;   
  15. import org.dbunit.database.DatabaseConfig;   
  16. import org.dbunit.database.DatabaseConnection;   
  17. import org.dbunit.database.ForwardOnlyResultSetTableFactory;   
  18. import org.dbunit.database.IDatabaseConnection;   
  19. import org.dbunit.database.QueryDataSet;   
  20. import org.dbunit.dataset.CachedDataSet;   
  21. import org.dbunit.dataset.DataSetException;   
  22. import org.dbunit.dataset.IDataSet;   
  23. import org.dbunit.dataset.stream.IDataSetProducer;   
  24. import org.dbunit.dataset.stream.StreamingDataSet;   
  25. import org.dbunit.dataset.xml.FlatXmlDataSet;   
  26. import org.dbunit.dataset.xml.FlatXmlProducer;   
  27. import org.dbunit.dataset.xml.XmlDataSet;   
  28. import org.dbunit.dataset.xml.XmlProducer;   
  29. import org.dbunit.operation.DatabaseOperation;   
  30. import org.xml.sax.InputSource;   
  31.   
  32. public abstract class DBXMLHelper {   
  33.   
  34.     // partial database export   
  35.     public static void exportPartial(IDatabaseConnection connection,   
  36.             String fileName, Set tableNames, Map sqls, boolean streamed,   
  37.             boolean flat) throws SQLException, DataSetException,   
  38.             FileNotFoundException, IOException {   
  39.         connection.getConfig().setFeature(   
  40.                 DatabaseConfig.FEATURE_QUALIFIED_TABLE_NAMES, true);   
  41.         if (streamed)   
  42.             connection.getConfig().setProperty(   
  43.                     DatabaseConfig.PROPERTY_RESULTSET_TABLE_FACTORY,   
  44.                     new ForwardOnlyResultSetTableFactory());   
  45.   
  46.         QueryDataSet partialDataSet = new QueryDataSet(connection);   
  47.         // all data   
  48.         if (null != tableNames)   
  49.             for (Iterator it = tableNames.iterator(); it.hasNext();) {   
  50.                 partialDataSet.addTable((String) it.next());   
  51.             }   
  52.         // sql query   
  53.         if (null != sqls)   
  54.             for (Iterator it = sqls.keySet().iterator(); it.hasNext();) {   
  55.                 String key = (String) it.next();   
  56.                 partialDataSet.addTable(key, (String) sqls.get(key));   
  57.             }   
  58.   
  59.         if (flat)   
  60.             FlatXmlDataSet   
  61.                     .write(partialDataSet, new FileOutputStream(fileName));   
  62.         else  
  63.             XmlDataSet.write(partialDataSet, new FileOutputStream(fileName));   
  64.     }   
  65.   
  66.     // full database export   
  67.     public static void exportDatabase(IDatabaseConnection connection,   
  68.             String fileName, boolean streamed, boolean flat)   
  69.             throws SQLException, DatabaseUnitException, FileNotFoundException,   
  70.             IOException {   
  71.         if (streamed)   
  72.             connection.getConfig().setProperty(   
  73.                     DatabaseConfig.PROPERTY_RESULTSET_TABLE_FACTORY,   
  74.                     new ForwardOnlyResultSetTableFactory());   
  75.   
  76.         IDataSet fullDataSet = connection.createDataSet();   
  77.         if (flat)   
  78.             FlatXmlDataSet.write(fullDataSet, new FileOutputStream(fileName));   
  79.         else  
  80.             XmlDataSet.write(fullDataSet, new FileOutputStream(fileName));   
  81.     }   
  82.   
  83.     public static void refreshData(IDatabaseConnection connection,   
  84.             String input, boolean streamed, boolean flat)   
  85.             throws DatabaseUnitException, SQLException {   
  86.         // 把Documenth转换为DBUnit的DataSet并解决中文编码问题   
  87.         // is.setEncoding("GBK");   
  88.         IDataSetProducer producer;   
  89.         IDataSet dataSet;   
  90.         if (flat)   
  91.             producer = new FlatXmlProducer(new InputSource(input));   
  92.         else  
  93.             producer = new XmlProducer(new InputSource(input));   
  94.         if (streamed)   
  95.             dataSet = new StreamingDataSet(producer);   
  96.         else  
  97.             dataSet = new CachedDataSet(producer);   
  98.   
  99.         // 执行插入操作   
  100.         DatabaseOperation.REFRESH.execute(connection, dataSet);   
  101.     }   
  102.   
  103.     public static void cleanInsertData(IDatabaseConnection connection,   
  104.             String input, boolean flat) throws DatabaseUnitException,   
  105.             SQLException {   
  106.         IDataSetProducer producer;   
  107.         IDataSet dataSet;   
  108.         if (flat)   
  109.             producer = new FlatXmlProducer(new InputSource(input));   
  110.         else  
  111.             producer = new XmlProducer(new InputSource(input));   
  112.   
  113.         dataSet = new CachedDataSet(producer);   
  114.   
  115.         // 执行插入操作   
  116.         DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);   
  117.     }   
  118.   
  119. }   

Java代码   收藏代码
  1. package com.test.dbunit;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6.   
  7. import org.dbunit.database.DatabaseConnection;  
  8. import org.dbunit.database.IDatabaseConnection;  
  9. import org.dbunit.database.QueryDataSet;  
  10. import org.dbunit.dataset.xml.FlatXmlDataSet;  
  11.   
  12. public class TestApp {  
  13.       
  14.     public static void main(String[] args) throws Exception{  
  15.         Class.forName("com.mysql.jdbc.Driver");  
  16.   
  17.         Connection conn = DriverManager.getConnection(  
  18.                 "jdbc:mysql://localhost/dbunit""root""");  
  19.           
  20.         IDatabaseConnection connection = new DatabaseConnection(conn);  
  21.         QueryDataSet dataSet = new QueryDataSet(connection);  
  22.         //将整个person表里的数据导出到 xml文件里  
  23.         dataSet.addTable("person");  
  24.         //将users表里符合条件的数据导出到xml文件里  
  25.         dataSet.addTable("users","select * from users where id < 4");  
  26.         //导出到dbunit.xml文件里  
  27.         FlatXmlDataSet.write(dataSet,new FileOutputStream("dbunit.xml"));  
  28.     }  
  29.   
  30. }  
如果想把某个数据库里的所有表里的数据全部导出到某个xml里,又不想通过addTable一个个来添加的话。则必须通过IDatabaseConnection的createDataSet()来创建IDataSet 
Java代码   收藏代码
  1. public static void main(String[] args) throws Exception{  
  2.         Class.forName("com.mysql.jdbc.Driver");  
  3.   
  4.         Connection conn = DriverManager.getConnection(  
  5.                 "jdbc:mysql://localhost/dbunit""root""");  
  6.           
  7.         IDatabaseConnection connection = new DatabaseConnection(conn);  
  8.         //如果想把某个数据库里的所有表里的数据全部导出到某个xml里,又不想通过addTable一个个来添加的话。则必须通过IDatabaseConnection的createDataSet()来创建IDataSet  
  9.         IDataSet dataSet = connection.createDataSet();  
  10.         //导出到dbunit.xml文件里  
  11.         FlatXmlDataSet.write(dataSet,new FileOutputStream("dbunit1.xml"));  
  12.         //也可以用FlatDtdDataSet导出一个对应的dtd文件  
  13.         FlatDtdDataSet.write(dataSet,new FileOutputStream("dbunit1.dtd"));  
  14.     }  
生成的dbunit.xml内容如下: 
Java代码   收藏代码
  1. <?xml version='1.0' encoding='UTF-8'?>  
  2. <dataset>  
  3.   <person/>  
  4.   <users id="1" username="zhangsan" password="123"/>  
  5.   <users id="2" username="lisi" password="456"/>  
  6.   <users id="3" username="wangwu" password="789"/>  
  7. </dataset>  
2.用dbunit做测试,需要继承DBTestCase,并需要重写protected IDataSet getDataSet() throws Exception 
Java代码   收藏代码
  1. package com.test.dbunit;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5.   
  6. import org.dbunit.Assertion;  
  7. import org.dbunit.DBTestCase;  
  8. import org.dbunit.PropertiesBasedJdbcDatabaseTester;  
  9. import org.dbunit.dataset.IDataSet;  
  10. import org.dbunit.dataset.ITable;  
  11. import org.dbunit.dataset.SortedTable;  
  12. import org.dbunit.dataset.filter.DefaultColumnFilter;  
  13. import org.dbunit.dataset.xml.FlatXmlDataSet;  
  14. import org.dbunit.operation.DatabaseOperation;  
  15. public class SimpleTest extends DBTestCase {  
  16.   
  17.     public SimpleTest()  
  18.     {  
  19. //      super();  
  20.         System.setProperty(  
  21.                 PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,  
  22.                 "com.mysql.jdbc.Driver");  
  23.         System.setProperty(  
  24.                 PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL,  
  25.                 "jdbc:mysql://localhost/dbunit");  
  26.         System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,  
  27.                 "root");  
  28.         System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,  
  29.                 "");  
  30.     }  
  31.       
  32.     /** 
  33.      * 给定数据集 
  34.      */  
  35.     @Override  
  36.     protected IDataSet getDataSet() throws Exception {  
  37.         System.out.println("init...");  
  38.         return new FlatXmlDataSet(new FileInputStream("dbunit.xml"));  
  39.     }  
  40.       
  41.     public void test1() throws Exception{  
  42.         IDataSet dbDataSet = getConnection().createDataSet();  
  43.         ITable dbTable = dbDataSet.getTable("users");  
  44.           
  45.         IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit.xml"));  
  46.         ITable xmlTable = xmlDataSet.getTable("users");  
  47.           
  48.         Assertion.assertEquals(xmlTable, dbTable);  
  49.     }  
  50.     /** 
  51.      * 表结构和dbunit1.xml结构不一致 
  52.      */  
  53.     public void test2() throws Exception{  
  54.         IDataSet dbDataSet = getConnection().createDataSet();  
  55.         ITable dbTable = dbDataSet.getTable("users");  
  56.           
  57.         IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit1.xml"));  
  58.         ITable xmlTable = xmlDataSet.getTable("users");  
  59.         //第一种写法  
  60. //      dbTable = DefaultColumnFilter.includedColumnsTable(dbTable,xmlTable.getTableMetaData().getColumns());  
  61.         //第二种写法  
  62.         dbTable = DefaultColumnFilter.includedColumnsTable(dbTable,xmlDataSet.getTableMetaData("users").getColumns());  
  63.           
  64.         Assertion.assertEquals(xmlTable, dbTable);  
  65.     }  
  66.     /** 
  67.      * 只比较username 
  68.      */  
  69.     public void test3() throws Exception{  
  70.         IDataSet dbDataSet = getConnection().createDataSet();  
  71.         ITable dbTable = dbDataSet.getTable("users");  
  72.           
  73.         IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit1.xml"));  
  74.         ITable xmlTable = xmlDataSet.getTable("users");  
  75.           
  76.         dbTable = DefaultColumnFilter.excludedColumnsTable(dbTable, new String[]{"id","password"});  
  77.         xmlTable = DefaultColumnFilter.excludedColumnsTable(dbTable, new String[]{"password"});  
  78.           
  79.         Assertion.assertEquals(xmlTable, dbTable);  
  80.     }  
  81.     /** 
  82.      * 表里数据和dbunit2.xml里的数据的顺序不一致 
  83.      */  
  84.     public void test4() throws Exception{  
  85.         IDataSet dbDataSet = getConnection().createDataSet();  
  86.         ITable dbTable = dbDataSet.getTable("users");  
  87.           
  88.         IDataSet xmlDataSet = new FlatXmlDataSet(new FileInputStream("dbunit2.xml"));  
  89.         ITable xmlTable = xmlDataSet.getTable("users");  
  90.           
  91.         SortedTable dbSortedTable = new SortedTable(dbTable,new String[]{"id"});  
  92.         //按数据库里表结构字段类型来进行排序,如果是int则按int排序,不是依照字符串的形式排序  
  93.         dbSortedTable.setUseComparable(true);  
  94.           
  95.         SortedTable xmlSortedTable = new SortedTable(xmlTable,new String[]{"id"});  
  96.         //按数据库里表结构字段类型来进行排序,如果是int则按int排序,不是依照字符串的形式排序  
  97.         xmlSortedTable.setUseComparable(true);  
  98.           
  99.         Assertion.assertEquals(xmlSortedTable, dbSortedTable);  
  100.     }  
  101.       
  102.     /** 
  103.      * 对Users表插入一条记录做测试 
  104.      * @throws Exception 
  105.      */  
  106.     public void test5() throws Exception{  
  107.         UsersDB db = new UsersDB();  
  108.   
  109.         Users users = new Users();  
  110.         users.setId(9);  
  111.         users.setUsername("hello");  
  112.         users.setPassword("world");  
  113.   
  114.         db.save(users);  
  115.   
  116.         IDataSet dataSet = getConnection().createDataSet();  
  117.         ITable actualTable = dataSet.getTable("users");  
  118.   
  119.         IDataSet dataSet2 = new FlatXmlDataSet(new File("expected.xml"));  
  120.         ITable expectedTable = dataSet2.getTable("users");  
  121.   
  122.         Assertion.assertEquals(expectedTable, actualTable);  
  123.     }  
  124.       
  125.     /** 
  126.      * 在把xml里的数据导入到db里之前,需要对数据库里的表的数据做的操作。 
  127.      */  
  128.     protected DatabaseOperation getSetUpOperation() throws Exception  
  129.     {  
  130.         System.out.println("setup...");  
  131.         return DatabaseOperation.CLEAN_INSERT;  
  132.     }  
  133.     /** 
  134.      * 测试执行完以后,需要对数据库里的表里的数据做的操作 
  135.      */  
  136.     protected DatabaseOperation getTearDownOperation() throws Exception  
  137.     {  
  138.         System.out.println("teardown...");  
  139.         return DatabaseOperation.DELETE_ALL;  
  140.     }  
  141.   
  142. }  
其中expected.xml内容为: 
Java代码   收藏代码
  1. <?xml version='1.0' encoding='UTF-8'?>  
  2. <dataset>  
  3.   <person/>  
  4.   <users id="1" username="zhangsan" password="123"/>  
  5.   <users id="2" username="lisi" password="456"/>  
  6.   <users id="3" username="wangwu" password="789"/>  
  7.   <users id="9" username="hello" password="world"/>  
  8. </dataset>  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值