DbUnit

Advertisement

DbUnitとは

DbUnitは、システムとデータベース(永続化層)の関連テストを行うテスティングフレームワークである。
仮想的なMockオブジェクトを利用するのではなく、実際にデータベースを利用した自動再帰テストを行うことができる。
JUnitを拡張して作成されている。

入手〜設定

http://dbunit.sourceforge.net/からアーカイブを入手する。
入手したzipファイルを解凍後、jarファイルにクラスパスを通す。

JUnitと組み合わせて動作するように設計されています。

使用するテーブル

 idnameagedate
number(10)varchar(50)number(10)date

テストデータの用意

ここではXMLを利用してテストデータを定義する。
DbUnitSampleTestData.xml
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
    <user id="1" name="tarou" age="10" createdate="2005-01-01 00:00:00" />
    <user id="2" name="jirou" age="20" createdate="2005-01-01 00:00:00"  />
    <user id="3" name="saburou" age="30" createdate="2005-01-01 00:00:00"  />
    <user id="4" name="mametarou" age="40" createdate="2005-01-01 00:00:00"  />
</dataset>

ソースコードの記述

テストを書く前に枠組みを記述。
DbUnitSampleTest.java
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ResourceBundle;

import org.dbunit.DatabaseTestCase;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;

public class DbUnitSampleTest extends DatabaseTestCase{

    public void setUp() throws Exception{
        super.setUp();
    }

    public void tearDown() throws Exception{
        super.tearDown();
    }

    protected IDatabaseConnection getConnection() throws Exception {
        ResourceBundle bundle = ResourceBundle.getBundle("application");

        Class.forName(bundle.getString("db.driver"));
        Connection con = DriverManager.getConnection(bundle.getString("db.url"),
                                                     bundle.getString("db.user"),
                                                     bundle.getString("db.pass"));
        return new DatabaseConnection(con);
    }

    protected IDataSet getDataSet() throws Exception {
        return new FlatXmlDataSet(new FileInputStream("config/DbUnitSampleTestData.xml"));
    }

    public void testXXX() throws Exception{
        // 未実装
    }
}
setUp()メソッド
テストの初期化処理を記述。

tearDown()メソッド
テストの後始末を記述。

getConnection()メソッド
データベース接続用のIDatabaseConnectionインタフェースを実装したクラスを作成する処理を記述する。
DbUnitがこのメソッドを使用してデータベースへ接続するために使用する。

getDataSet()メソッド
テスト用データが格納されているIDataSetインスタンスを作成するコードを記述する。
DbUnitがこのメソッドを使用してテスト実行前のデータベースに対するデータ格納処理を行う。

データベース接続用情報
jdbc.properties
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/sample
db.user=admin
db.pass=admin

このテストを実行すると、データベースにデータが格納される。

テストコードの記述

DbUnitSampleTest.java
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ResourceBundle;
import org.dbunit.DatabaseTestCase;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;

public class DbUnitSampleTest extends DatabaseTestCase{

    public void setUp() throws Exception{
        super.setUp();
    }

    public void tearDown() throws Exception{
        super.tearDown();
    }

    protected IDatabaseConnection getConnection() throws Exception {
        ResourceBundle bundle = ResourceBundle.getBundle("application");
        Class.forName(bundle.getString("db.driver"));
        Connection con = DriverManager.getConnection(bundle.getString("db.url"),
                                                     bundle.getString("db.user"),
                                                     bundle.getString("db.pass"));
        return new DatabaseConnection(con);
    }

    protected IDataSet getDataSet() throws Exception {
        return new FlatXmlDataSet(new FileInputStream("config/DbUnitSampleTestData.xml"));
    }

    public void testXXX() throws Exception{
        Connection con = null;
        try{
            // 接続
            con = getConnection().getConnection();

            // 問合せ実行
            PreparedStatement stmt = con.prepareStatement("select id, name, age, createdate from user");
            ResultSet result = stmt.executeQuery();

            // 行数確認
            result.last();
            assertEquals(result.getRow(), 4);

            // 内容確認
            result.first();
            assertEquals(result.getString(1), "1");
            assertEquals(result.getString(2), "tarou");
            assertEquals(result.getString(3), "10");
            assertEquals(result.getString(4), "2005-01-01 00:00:00.0");
        }finally{
            con.close();
        }
    }
}
上記の例ではtestXXXメソッドが実際のテスト用メソッド。テスト用コードはプレフィックスにtestを付加したメソッド名にする(例:testConnection, testSelect)

Microsoft Excelファイルでテストデータを記述する

DbUnitでは、Excelのファイルを利用してテストデータを定義することもできる。作成の際には、以下の条件にしたがってファイルを作成すればよい。
ワークシート名:テーブル名
1行目:ヘッダ。テーブルのカラム名
2行目以降:データを記述。

図1:テストデータサンプルイメージ
図1:テストデータサンプルイメージ

テストコードでは、getDataSet()メソッドを以下のように記述すればよい。
protected IDataSet getDataSet() throws Exception {
    return new XlsDataSet(new FileInputStream("config/DbUnitSampleTestData.xls"));
}

リンク

Advertisement

ショートカット

634トップページ
このカテゴリのトップページに戻る
634ラボ

サイト検索

Google

Web サイト内

Y!ログール