在開發企業端系統,Database 的設計是不可或缺的一環,但是當我們完成 DAO 的之前, 是否可以對資料庫進行測試呢?或是 DAO 存取資料完畢,該資料是否真的是和資料庫中的資料是相同的,所以我們往往利用:
testMethod() {
ITable databaseData = dbConnection.createQueryTable("EMPLOYEE",query);
assertEquals( dao.findPK(1).getName(), databaseData.getValue(0, “NAME”);
}
DBUnit (https://dbunit.sourceforge.net) 就是專門進行資料庫單元測試的元件,利用簡單的 DataSet 的方式,就可以針對資料庫進行各種存取的單元測試,這樣可以驗證該資料是否可以正常新增、修改、刪除與查詢等等。
DBUnit 使用方式很容易,只要根據以下步驟就可以快速地進行測試工作。
◎ 步驟 1:建立 DataSet
基本上,DataSet 就是設定我們將利用這些資料 (DATA) 來進行測試,通常我們會利用 XML 檔案來設定 Data,利用 FlatXmlDataSet 取得這個 DataSet。
基本上 Flat XML DataSet 就是一個純 XML 檔案。
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
<!-- EMPLOYEE 表格中第一筆資料 -->
<EMPLOYEE sys_id='1' name=’gary lee’ empcode=’A001’/>
<!-- EMPLOYEE 表格中第二筆資料 -->
<EMPLOYEE sys_id=’2’ name=’kevin chen’ empcode=’A002’/>
<!-- EMPLOYEE 表格中第三筆資料 -->
<EMPLOYEE sys_id=’3’ name=’johnny wang’ empcode=’A003’/>
</dataset>
可以設定多個不同的表格,也可以利用 <EMPTY_TABLE/> 清空表格內容。
如果你是個比較嚴謹的人,或許可以使用 XMLDataSet,撰寫起來雖然比較麻煩,但是結構較為完整。其他如 StreamingDataSet、DatabaseDataSet、QueryDataSetDefaultDataSet、CompositeDataSet、FilteredDataSet、XlsDataSet、
ReplacementDataSet and etc.. 幾乎涵蓋了各種資料源,在某些狀況,或許你也可以 extends org.dbunit.dataset.AbstractDataSet 且 implements org.dbunit.dataset.IDataSet 實作出專屬自己的 DataSet 。
ex: 讀取 CSV 的 DataSet 。
package org.dbunit.dataset.csv;
import java.io.File;
import org.dbunit.dataset.CachedDataSet;
import org.dbunit.dataset.DataSetException;
/**
* This class constructs an IDataSet given a directory containing CSV
* files. It handles translations of "null"(the string), into null.
*
* @author Lenny Marks (
This e-mail address is being protected from spambots. You need JavaScript enabled to view it
)
*
*/
public class CsvDataSet extends CachedDataSet {
public static final String TABLE_ORDERING_FILE = "table-ordering.txt";
private File dir;
public CsvDataSet(File dir) throws DataSetException {
super(new CsvProducer(dir));
this.dir = dir;
}
◎ 步驟 2:建立 TestCase 繼承 DBTestCase
要測試 DataBase,我們就一定得連結資料庫,在 Java 之中,連結資料庫不外乎以下幾種方式:
JdbcBasedDBTestCase
DataSourceBasedDBTestCase
JndiBasedDBTestCase
package com.softleader.unittest;
import java.io.FileInputStream;
import org.dbunit.DBTestCase;
import org.dbunit.PropertiesBasedJdbcDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
public class EmployeeDBTest extends DBTestCase {
public EmployeeDBTest(String name) {
super(name);
System.setProperty
(PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS,"org.hsqldb.jdbcDriver");
System.setProperty
(PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL,"jdbc:hsqldb:sample");
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME,"sa");
System.setProperty(PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD,"");
// System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA,""
);
}
protected IDataSet getDataSet() throws Exception {
return new FlatXmlDataSet(new FileInputStream("mydataset.xml"));
}
}
最重要的就是 getDataSet() 去取得剛剛設定好的 DataSet 。
◎ 步驟 3:實作 getSetUpOperation() 及 getTearDownOperation() 等方法 (Optional)
在執行各種測試之前與之後,我們可以對資料庫作重新設定等動作,例如:
protected DatabaseOperation getSetUpOperation() throws Exception
{
return DatabaseOperation.REFRESH;
}
protected DatabaseOperation getTearDownOperation() throws Exception
{
return DatabaseOperation.NONE;
}
除了 REFRESH, DatabaseOperation 還包含了 DELETE_ALL、TRUNCATECLEAN_INSERT 等等的動作,大家可以依照自己測試的設定,在測試前後進行相關的設定。
◎ 步驟 4:實作各種測試方法
就開始實作自己的測試。