Login  |  繁體中文
感謝您對「自由軟體鑄造場」的支持與愛護,十多年來「自由軟體鑄造場」受中央研究院支持,並在資訊科學研究所以及資訊科技創新研究中心執行,現已完成階段性的任務。 原網站預計持續維運至 2021年底,網站內容基本上不會再更動。本網站由 Denny Huang 備份封存。
也紀念我們永遠的朋友 李士傑先生(Shih-Chieh Ilya Li)。
Previous Issue

DBUnit

Java Opensources for Web Development Part I:
Chapter 4 在 Java 中進行各種單元測試
Lession 18 : DBUnit

* Category: Test
* Project Name: DBUnit
* WebSite: https://dbunit.sourceforge.net
* License: LGPL
* Last version: 2.2

在開發企業端系統,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:實作各種測試方法

就開始實作自己的測試。




OSSF Newsletter : 第 82 期 開放源碼市場發展趨勢

Category: Tech Column