DbUnitNG プロジェクト Wiki

概要

こんなのができます。

  1. @SetUpOperation(value = DatabaseOperationType.CLEAN_INSERT, pathname = "org/dbunitng/dept-emp.xml")
  2. @Test
  3. public void verifySelectAllFromDept() {
  4. // call target method and assert...
  5. }

DbUnitのアノテーション対応。

@SetUpOperationでテスト実行前にテストデータを投入する。 アノテーションの属性でDbUnitのDatabaseOperationを指定したり、テストデータのファイルを指定したりできる。

さすがに単体ではできないので、TestNGと連携させます。


DbUnitアノテーション化ライブラリ「DbUnitNG」

DbUnitNG( http://sourceforge.jp/projects/dbunitng/ )はDbUnit( http://www.dbunit.org/ )の機能をアノテーションとして利用するためのオープンソースライブラリです。

テスト実行前の初期データの投入や実行後のクリーンアップ処理をコードで書く必要はなく、アノテーションで設定できます。

DbUnitNGはテスティングフレームワークTestNG( http://testng.org/doc/ )のリスナーとして実装しているため、設定ファイルに数行記述するだけで簡単に利用できます。

DbUnitNGには大きく3つの機能があります。

  • DbUnitを利用した初期データ投入やクリーンアップ処理をアノテーションで設定できる
  • Java BeansのListをDbUnitのデータセットに変換し、期待値ファイルの内容と比較検証できる
  • データベースのテーブルの内容と期待値ファイルの内容を自動的に比較検証するアノテーションを利用できる

初期データの投入や期待値とプログラムの実行結果の比較検証といった、データベースに実際に接続してテストを実施する際に必要となる処理をアノテーションで設定できることでテスト作成の工数を削減します。

またテストプログラムの作成自体はTestNGをそのまま利用できるため、学習のコストは非常に低く、TestNGとDbUnitを連携する作業もまったく必要ありません。


依存ライブラリ

依存ライブラリは以下。

  • TestNG
  • DbUnit
  • Commons Lang
  • JUnit 4.x(DbUnitが依存)
  • SLF4J(DbUnitが依存。slf4j-api.jarとslf4j-nop.jarが必要。)
  • Commons Collections(DbUnitが依存)
  • Apache POI(DbUnitが依存。テストデータをExcelに記述する場合必要。)
  • Commons DBCP(利用する場合必要)
  • Commons Pool(DBCPを利用する場合必要)

DbUnitアノテーションの使い方

TestNGとの連携

TestNGのリスナーとしてDbUnitとの連携を実現します。 testng.xmlにリスナーを記述します。

	<listeners>
		<listener class-name="org.dbunitng.listeners.DbUnitNGTestListener"></listener>
	</listeners>

TestNGのテストスイートファイルであるtestng.xmlにデータベース接続情報を記述します。

<parameter name="driver" value="com.mysql.jdbc.Driver"></parameter>
<parameter name="url" value="jdbc:mysql://127.0.0.1/データベース名"></parameter>
<parameter name="username" value="ユーザー名"></parameter>
<parameter name="password" value="パスワード"></parameter>

データベースに接続する際のConnectionは、特に指定がなければDriverManagerで生成します。 もしテストメソッド間でDataSourceを利用したい場合、testng-xmlに「DBCP」と指定します。

<parameter name="datasource" value="DBCP"></parameter>
この場合、もちろんDBCPとPoolのJARが必要です。

もっとも簡単なTestNGの設定ファイルは次のようなものです。

すべてのパッケージにあるテストクラスを実行します。

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="DbUnitNG Function">
	<parameter name="driver" value="org.postgresql.Driver"></parameter>
	<parameter name="url" value="jdbc:postgresql://localhost:5432/sampledatabase"></parameter>
	<parameter name="username" value="postgres"></parameter>
	<parameter name="password" value="postgres"></parameter>
	<listeners>
		<listener class-name="org.dbunitng.listeners.DbUnitNGTestListener"></listener>
	</listeners>
	<test verbose="2" name="sample" annotations="JDK">
		<packages>
			<package name="*"></package>
		</packages>
	</test>
</suite>

また、DbUnitNGアノテーションに接続情報を記述することもできます。

デフォルトのDatabaseOperation

@SetupOperationでDbUnitのDatabaseOperationを指定できるわけですが、 テストメソッドごとに毎回指定するのは手間なので、 テストスイート全体でデフォルトを設定できるようにしました。

testng.xmlか@DbUnitNGアノテーションで指定することができます。 もちろんデフォルトを指定しないこともできます。

こんな感じです。

  1. @BeforeSuite
  2. @!DbUnitNG(driver = "com.mysql.jdbc.Driver", password = "root", url = "jdbc:mysql://127.0.0.1/testframework", username = "root", defaultOperation = DatabaseOperationType.CLEAN_INSERT)
  3. public void beforeSuite() {}
アノテーションであればdefaultOperation属性にEnumのDatabaseOperationTypeを指定します。

XMLであれば<parameter>要素にname「defaultOperation」で指定します。

  1. <suite name="!DbUnitNG">
  2. <parameter name="defaultOperation" value="CLEAN_INSERT"></parameter>
  3. <parameter name="driver" value="com.mysql.jdbc.Driver"></parameter>
  4. <parameter name="url" value="jdbc:mysql://127.0.0.1/testframework"></parameter>
  5. <parameter name="username" value="root"></parameter>
  6. <parameter name="password" value="root"></parameter>
defaultOperationの値は次の文字列を指定します。

  • NONE
  • UPDATE
  • INSERT
  • REFRESH
  • DELETE
  • DELETE_ALL
  • TRUNCATE_TABLE
  • CLEAN_INSERT

もちろん、デフォルトを指定していても@SetUpOperationや@TearDownOpearionで指定すれば、後者を優先します。

アノテーション

テストメソッド(@Testを付与したメソッド)に対して、初期データの投入を@SetUpOperationで指定します。 @SetUpOperationに属性を指定します。

  • value(データベース操作方法の指定。要はDbUnitのDatabaseOperationの定数。デフォルトはNONE。)
  • pathname(テストデータを記述したファイルパス。クラスパスでの位置。)

valueにはEnumであるDatabaseOperationTypeを指定します。

こんな感じで指定します。

@SetUpOperation(value = DatabaseOperationType.CLEAN_INSERT, pathname = "org/dbunitng/dept-emp.xml")
DbUnitと同様で、XML形式とExcel形式に対応してます。 DatabaseOperationTypeは8つの値があります。

  • NONE
  • UPDATE
  • INSERT
  • REFRESH
  • DELETE
  • DELETE_ALL
  • TRUNCATE_TABLE
  • CLEAN_INSERT

意味はDbUnitそのままです。

これでテストメソッド実行前にテストデータを投入します。

CSV対応

初期値や期待値のファイルとしてCSVにも対応しました。

DbUnitではCSVファイルの場合「table-ordering.txt」というファイルが必須なので、このファイルをアノテーションに指定した場合、CSVとして処理します。

「table-ordering.txt」は定数としてDbUnitNGConstrantsにあります。 こんな感じです。

  1. @SetUpOperation(pathname = DbUnitNGConstrants.CSV_ORDER_FILE, value = DatabaseOperationType.CLEAN_INSERT)
  2. public void testCsvFile() {
  3. }
pathname属性にファイル名「table * ordering.txt」だけ指定しているので、テストクラスと同じパッケージに配置します。

「table-ordering.txt」はこんな感じ。

  1. dept
  2. emp
テーブル名を記述します。 そして、この名前に対応するCSVファイルをテキストファイルと同じパッケージに配置します。dept.csvとemp.csvです。
  1. DEPTNO,DNAME,LOC
  2. 10,ACCOUNTING,NEW YORK
  1. EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO
  2. 7782,CLARK,MANAGER,7839,1981 * 01 * 09,2450.0,null,10
1行目は列名、2行目以降にデータを記述します。nullの場合はそのままnullと書きます。

各アノテーションの属性とデフォルト値

各アノテーションの属性とデフォルト値を一覧にしました。

BeanのListをDbUnitのDataSetに変換

BeanのリストをDbUnitのDataSetに変換してアサートできます。

パフォーマンス

簡単なパフォーマンステストを実行しました。

DBからテストデータのファイルを作成

DbUnitライブラリでDBデータをXML,Excel,CSVに出力するクラスを作りました。

DBテーブルと期待値ファイルをアノテーションでアサートする

@TableAssertでDBとアサートできます

※「DbUnitNG」プロジェクトは、株式会社クロノスのサポートのもと、有志により運営しています。