技術空間

DBUnit

DBUnitの導入とxml,Excel,CSVのサンプルプログラム


TOP > DBUnit > DBUnitの導入とxml,Excel,CSVのサンプルプログラム



■DBUnitとは

■DBUnitの導入

下記のjarをダウンロードする。(バージョンは必要に応じて読み替える)


DBUnitのjar

なぜか公式サイトにリンクされているSourceForgeからダウンロードできないので、 Maven Repository(http://mvnrepository.com/)のサイトから直接ダウンロードする。("dbunit"で検索)


slf4jのjar

内部的にslf4jを利用しているため公式サイト(http://www.slf4j.org/)から下記jarもダウンロードする。


poiのjar

Excelを利用する場合、poiのライブラリが必要なため、Apacheのサイト(http://poi.apache.org/)からダウンロードする。

拡張子が「xlsx」のファイルを扱う場合は以下も必要。いずれもpoiをダウンロードすると同梱されている。

■xmlを使ってのサンプルプログラム
DBの準備

まずデータベースにID(id)と名前(name)の2つのカラムを持つsampletblテーブルを作成する(今回はmysqlを使用)。データはまだ入れない。

テーブル作成
mysql> create table sampletbl(id int, name varchar(100));
Query OK, 0 rows affected (0.26 sec)

mysql> desc sampletbl;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(100) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.08 sec)

mysql> select * from sampletbl;
Empty set (0.05 sec)

サンプルプログラム

作成したテーブルに投入するテストデータをxmlファイルで用意する。

sampledb.xml
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <sampletbl id="1" name="Bill" />
  <sampletbl id="2" name="Kay" />
</dataset>

タグの名前(sampletbl)がテーブル名、属性名(id, name)がカラム名と紐づいている。またsampletblタグ1つが1レコードとなる。

次にテストクラスを作成する。サンプルでは、xmlデータをDBに投入するところまでのコードを記述する。(テストメソッドのコードは省略)

SampleTest.java
package test;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;
import org.junit.Test;

public class SampleTest {

    @Before
    public void setUp() throws Exception {
    
        // ①DBコネクション取得
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/sampledb","userid","password");
        IDatabaseConnection dbconn = new DatabaseConnection(conn);
        
        // ②xml用データセット作成
        IDataSet dataset = new FlatXmlDataSetBuilder().build(new File("dataset/sampledb.xml"));
                
        // ③データの全削除
        DatabaseOperation.DELETE_ALL.execute(dbconn, dataset);
        
        // ④データの挿入
        DatabaseOperation.INSERT.execute(dbconn, dataset);
    }

    @Test
    public void test() {
        // テストは省略
    }
}

[説明]


①DBコネクションの取得

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/sampledb","userid","password");
IDatabaseConnection dbconn = new DatabaseConnection(conn);

DBコネクションはDriverManager.getConnectionで取得する。取得したコネクションはDatabaseConnection(IDatabaseConnectionインタフェースを実装)のコンストラクタの引数に渡す。


②xml用データセット作成

IDataSet dataset = new FlatXmlDataSetBuilder().build(new File("dataset/sampledb.xml"));

DBUnitではテストデータや実際のDBデータをIDataSetで扱う。これをデータセットと呼ぶ。 xmlの場合、FlatXmlDataSetBuilderbuildメソッドを使ってIDataSetを取得できる。


③データの全削除

DatabaseOperation.DELETE_ALL.execute(dbconn, dataset);

テストは常に同じ状態で実施することが望ましい。よって、データ挿入前に今あるデータをいったん全部削除する。DatabaseOperation.DELETE_ALLexecuteメソッドを実行するとxmlデータで使用しているテーブルのデータが全て削除される(関係ないテーブルは消さない)。

テーブル内のデータ全削除ではなく、xmlで使用しているデータだけ削除したい場合はDatabaseOperation.DELETEを使う。但し、テーブルにプライマリキーが設定されてなければいけない。削除するデータが特定できないからである。 プライマリキーが無い場合、NoPrimaryKeyExceptionが発生する。

テスト環境に制限がなければDELETE_ALLを使った方が確実なテストができる。


④データの挿入

DatabaseOperation.INSERT.execute(dbconn, dataset);

テストデータファイルのデータをDBへ投入する。DatabaseOperation.INSERTのexecuteメソッドを使う。

データ投入後のテーブルは以下のとおり。これでテストをする準備が完了。(テスト部分のコードは省略)

インサート結果
mysql> select * from sampletbl;
+------+------+
| id   | name |
+------+------+
|    1 | Bill |
|    2 | Kay  |
+------+------+
2 rows in set (0.00 sec)
■Excelを使ってのサンプルプログラム

前述のサンプルはxmlにデータを記述していたが、ExcelやCSVにデータを記述することも可能。まずはExcel。

sampledb.xlsx

シート名(sampletbl)がテーブル名、1行目がカラム名(id, name)、2行目以降がデータとなる。

以下テストコード。

SampleTest.java
package test;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.excel.XlsDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;
import org.junit.Test;

public class SampleTest {

    @Before
    public void setUp() throws Exception {
    
        // ①DBコネクション取得
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/sampledb","userid","password");
        IDatabaseConnection dbconn = new DatabaseConnection(conn);
        
        // ②Excel用データセット作成
        IDataSet dataset = new XlsDataSet(new File("dataset/sampletb.xlsx"));
                
        // ③データの全削除
        DatabaseOperation.DELETE_ALL.execute(dbconn, dataset);
        
        // ④データの挿入
        DatabaseOperation.INSERT.execute(dbconn, dataset);
    }

    @Test
    public void test() {
        // テストは省略
    }
}

コードはxmlの場合とほぼ一緒。データセットだけExcel用に変更する。Excelの場合、XlsDataSetを使用する。(コード中の②参照)

■CSVを使ってのサンプルプログラム

次にCSV。

sampletbl.csv
id,name
1,Bill
2,Kay

拡張子を抜いたファイル名(smpletbl)がテーブル名、1行目(id, name)がカラム名、2行目以降がデータとする。

CSVの場合、もう1つtable-ordering.txtというファイルが必要。

table-ordering.txt
sampletbl

CSVの場合、ファイル名がテーブル名になるため、xmlやExcelのように複数のテーブルを1つのファイルに記述することができない。そのためtable-ordering.txtというファイルを用意し、このファイルにインサートするテーブル(=ファイル名)を列挙する。列挙した順にインサートされる。

下記の場合、sampletbl、sampletbl2、sampletbl3の3テーブルが存在し、それぞれsampletbl.csv、sampletbl2.csv、sampletbl.3.csvを用意する。

テーブルが複数ある場合(例)
sampletbl
sampletbl2
sampletbl3

最後にテストプログラム。

SampleTest.java
package test;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.database.IDatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.csv.CsvDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.Before;
import org.junit.Test;

public class SampleTest {

    @Before
    public void setUp() throws Exception {
    
        // ①DBコネクション取得
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/sampledb","userid","password");
        IDatabaseConnection dbconn = new DatabaseConnection(conn);
        
        // ②CSV用データセット作成
        IDataSet dataset = new CsvDataSet(new File("dataset"));
                
        // ③データの全削除
        DatabaseOperation.DELETE_ALL.execute(dbconn, dataset);
        
        // ④データの挿入
        DatabaseOperation.INSERT.execute(dbconn, dataset);
    }

    @Test
    public void test() {
        // テストは省略
    }
}

これもコードはxmlの場合とほぼ一緒。データセットだけCSV用のCsvDataSetに変更する。(コード中の②参照)

CsvDataSetに渡すFileクラスの引数にはファイル名ではなく、table-ordering.txtが存在するフォルダ(上記サンプルの場合datasetフォルダ)を指定する。



TOP > DBUnit > DBUnitの導入とxml,Excel,CSVのサンプルプログラム

Tweet ̃Gg[͂ĂȃubN}[Nɒlj
技術空間