DbUnit 的 DBTestCase 的用法(針對扁平XML)

1.dbunit從名字上可以看出,是對有關數據庫操作的測試。官網:www.dbunit.org從官網下載dbunit相關的jar包,dbunit還依賴於http://www.slf4j.org所以也需要下載slf4j,使用它的slf4j-api-1.7.7.jar和slf4j-simple-1.7.7.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>
  <student Id="0001" name="翁仔" sex="m" birthday="1979-12-31"/>
  <student Id="0002" name="王翠花" sex="f" birthday="1982-08-09"/>
  <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.chenjo.expa;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.dbunit.Assertion;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.database.QueryDataSet;
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 {
	private File file = null;
	public SimpleTest()
	{
//		super();
		System.setProperty(
				PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,
				"com.mysql.jdbc.Driver");
		System.setProperty(
				PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL,
				"jdbc:mysql://localhost/test");
		System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,
				"root");
		System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,
				"root");
	}
	
	/**
	 * 給定數據集
	 */
	@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{
		UsersDAO db = new UsersDAO();

		User user = new User();
		user.setId(9);
		user.setUsername("hello");
		user.setPassword("world");

		db.save(user);

		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
    {
		
		// 連接DB 
		Connection conn=getMySqlConnection();
		// 獲得DB 連接
		IDatabaseConnection connection = connection =new DatabaseConnection(conn);
		// 對數據庫中的操作對象表student 進行備份
		QueryDataSet backupDataSet = new QueryDataSet(connection);
		backupDataSet.addTable("student");
		file=File.createTempFile("student_back",".xml");// 備份文件
		FlatXmlDataSet.write(backupDataSet,new FileOutputStream(file));
		// 準備數據的讀入
		IDataSet dataSet = new FlatXmlDataSet( new FileInputStream("dbunit.xml"));
		System.out.println("setup...");
		DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);
        return DatabaseOperation.NONE;
    }
	/**
	 * 測試執行完以後,需要對數據庫裏的表裏的數據做的操作
	 */
    protected DatabaseOperation getTearDownOperation() throws Exception
    {
    	Connection conn=getMySqlConnection();
    	IDatabaseConnection connection =new DatabaseConnection(conn);
		IDataSet dataSet = new FlatXmlDataSet(file);
		DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);
    	System.out.println("teardown...");
        return DatabaseOperation.NONE;
    }

	Connection getMySqlConnection() {
		// 驅動程序名
		String driver = "com.mysql.jdbc.Driver";

		// URL指向要訪問的數據庫名test
		String url = "jdbc:mysql://127.0.0.1:3306/test";

		// MySQL配置時的用戶名
		String user = "root";

		// MySQL配置時的密碼
		String password = "root";

		Connection conn = null;
		// 加載驅動程序
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, user, password);

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return conn;

	}
}

 其中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>

 

補充說明:

數據庫test的編碼格式: utf-8

expected.xml:  以 UTF-8 無BOM格式編碼 (Notepadd++)

發佈了241 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章