dbunit使用

 

关键字: dbunit使用

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 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. }  
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
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.     }  
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内容如下:
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>  
<?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

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

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>  
<?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、付费专栏及课程。

余额充值