dbunit

以下muimi 様より借用

DBUnitを利用したテストを行うには、以下のJARをクラスパスに含めます。

JUnitのJAR
DBUnitのJAR
JDBCドライバのJAR

テスト対象のクラスの作成

テストを行うには、何かの処理を行うクラスが必要です。ここでは、簡単ですが、以下のクラスを用意しました。ConnectionManagerはDBに接続してConnectionを取得するクラスと考えてください。

package hoge;

import java.sql.Connection;
import java.sql.Statement;

public class Sample {

public void tatakiuri() throws Exception{

Connection con = ConnectionManager.getConnection();
Statement smt = con.createStatement();
smt.execute("update cd set price=10");
//con.commit();//autocommit
con.close();
}
}

テストケースの作成

このクラスに対する単体テストを記述します。次のようになります。

SampleTest.java(テストケースの例)

package hoge;

import junit.framework.TestCase;

import org.dbunit.Assertion;
import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;

public class SampleTest extends TestCase {

public void testTatakiuri() throws Exception {

//準備データをDBに入れる
DatabaseOperation.CLEAN_INSERT.execute(getConnection(),
new FlatXmlDataSet(SampleTest.class
.getResourceAsStream("prepare.xml")));

//ロジックの実行
Sample sample = new Sample();
sample.tatakiuri();

//DBから実際のデータの取得
IDataSet databaseDataSet = getConnection().createDataSet();
ITable actualTable = databaseDataSet.getTable("cd");

//期待値データの取得
IDataSet expectedDataSet = new FlatXmlDataSet(SampleTest.class
.getResourceAsStream("expected.xml"));
ITable expectedTable = expectedDataSet.getTable("cd");

//期待値と実際のデータの比較
Assertion.assertEquals(expectedTable, actualTable);
}

protected IDatabaseConnection getConnection() throws Exception {
return new DatabaseConnection(ConnectionManager.getConnection());
}

}

データの作成

次に準備データと期待値データを用意します。準備データは先ほどAntタスクでエクスポートしたXMLをそのまま利用します。期待値データは、準備データをコピーして値を書き換えます。

expected.xml(期待結果のデータ)





これでJUnitテストを実行すると、テストが実行できます。ここではテストメソッド内でデータ準備を行っていますが、setUp()で行ってもいいでしょう。また、DBUnitのWebページのチュートリアル(Qucik Start)では、TestCaseでなく、DatabaseTestCaseを継承した例が示されています。ここでは更新系のテストなので、期待値データを準備しましたが、照会系であれば、いらないでしょう。また、テストデータをクラスパス(ソースパス)に含めていますが、別のフォルダに置いてもいいでしょう。テストのやり方はいろいろ考えられます。

その他
EXCELでテストデータを記述

DBUnitのテスト用データは基本はXMLですが、元々2次元のテーブルデータであるわけで、やっぱりEXCELなどでデータは編集した方がやりやすいです。DBUnitでは、EXCELデータも読み込めるようになっています。

まず、DBからのエクスポートですが、Antタスクはない(マニュアル上は)ようなので、とりあえずコードを書いてエクスポートします。といっても2、3行のコードです。

XLSExporter.java(DBデータをEXCELにエクスポート)

package hoge;

import java.io.FileOutputStream;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.excel.XlsDataSet;

public class XLSExporter {

public static void main(String[] args) throws Exception {

DatabaseConnection con = new DatabaseConnection(ConnectionManager
.getConnection());
IDataSet dataset = con.createDataSet();
XlsDataSet.write(dataset, new FileOutputStream("export.xls"));

}
}

で、テストケース上では、FlatXmlDataSetを利用していたところを、XlsDataSetに変えればEXCELデータを読み込んでのテストが行えます。

なお、XlsDataSetは内部でJakarta POI(http://jakarta.apache.org/poi/)を利用しているので、上記を実行するには、POIをダウンロードしてきて、JARをクラスパスに含める必要があります。一応最新リリースの2.5.1では動きました。

lib以下に以下のJARが必要に応じて必要です

dbunit-2.1.jar
mysql-connector-java-3.0.14-production-bin.jar
poi-2.5.1-final-20040804.jar