dbunitng (0.6) | 2008-10-02 16:31 |
こんなのができます。
DbUnitのアノテーション対応。
@SetUpOperationでテスト実行前にテストデータを投入する。 アノテーションの属性でDbUnitのDatabaseOperationを指定したり、テストデータのファイルを指定したりできる。
さすがに単体ではできないので、TestNGと連携させます。
DbUnitNG( http://sourceforge.jp/projects/dbunitng/ )はDbUnit( http://www.dbunit.org/ )の機能をアノテーションとして利用するためのオープンソースライブラリです。
テスト実行前の初期データの投入や実行後のクリーンアップ処理をコードで書く必要はなく、アノテーションで設定できます。
DbUnitNGはテスティングフレームワークTestNG( http://testng.org/doc/ )のリスナーとして実装しているため、設定ファイルに数行記述するだけで簡単に利用できます。
DbUnitNGには大きく3つの機能があります。
初期データの投入や期待値とプログラムの実行結果の比較検証といった、データベースに実際に接続してテストを実施する際に必要となる処理をアノテーションで設定できることでテスト作成の工数を削減します。
またテストプログラムの作成自体はTestNGをそのまま利用できるため、学習のコストは非常に低く、TestNGとDbUnitを連携する作業もまったく必要ありません。
依存ライブラリは以下。
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アノテーションに接続情報を記述することもできます。
@SetupOperationでDbUnitのDatabaseOperationを指定できるわけですが、 テストメソッドごとに毎回指定するのは手間なので、 テストスイート全体でデフォルトを設定できるようにしました。
testng.xmlか@DbUnitNGアノテーションで指定することができます。 もちろんデフォルトを指定しないこともできます。
こんな感じです。
アノテーションであればdefaultOperation属性にEnumのDatabaseOperationTypeを指定します。
XMLであれば<parameter>要素にname「defaultOperation」で指定します。
defaultOperationの値は次の文字列を指定します。
- <suite name="!DbUnitNG">
- <parameter name="defaultOperation" value="CLEAN_INSERT"></parameter>
- <parameter name="driver" value="com.mysql.jdbc.Driver"></parameter>
- <parameter name="url" value="jdbc:mysql://127.0.0.1/testframework"></parameter>
- <parameter name="username" value="root"></parameter>
- <parameter name="password" value="root"></parameter>
もちろん、デフォルトを指定していても@SetUpOperationや@TearDownOpearionで指定すれば、後者を優先します。
テストメソッド(@Testを付与したメソッド)に対して、初期データの投入を@SetUpOperationで指定します。 @SetUpOperationに属性を指定します。
valueにはEnumであるDatabaseOperationTypeを指定します。
こんな感じで指定します。
@SetUpOperation(value = DatabaseOperationType.CLEAN_INSERT, pathname = "org/dbunitng/dept-emp.xml")DbUnitと同様で、XML形式とExcel形式に対応してます。 DatabaseOperationTypeは8つの値があります。
意味はDbUnitそのままです。
これでテストメソッド実行前にテストデータを投入します。
初期値や期待値のファイルとしてCSVにも対応しました。
DbUnitではCSVファイルの場合「table-ordering.txt」というファイルが必須なので、このファイルをアノテーションに指定した場合、CSVとして処理します。
「table-ordering.txt」は定数としてDbUnitNGConstrantsにあります。 こんな感じです。
pathname属性にファイル名「table * ordering.txt」だけ指定しているので、テストクラスと同じパッケージに配置します。
「table-ordering.txt」はこんな感じ。
テーブル名を記述します。 そして、この名前に対応するCSVファイルをテキストファイルと同じパッケージに配置します。dept.csvとemp.csvです。
1行目は列名、2行目以降にデータを記述します。nullの場合はそのままnullと書きます。
BeanのリストをDbUnitのDataSetに変換してアサートできます。
DbUnitライブラリでDBデータをXML,Excel,CSVに出力するクラスを作りました。