DBUnitとは
JavaでDBのテストを行う際に、データをよしなにやってくれるすごいやつです。
XMLとかExcelとかにデータを書いておくと、勝手にDBにデータを設定してくれます。
TRUNCATEとかINSERTとかUPDATEとかいろいろできます。
使用バージョン
名称 | バージョン |
---|---|
JDK | 1.8.0_25 |
JUnit | 4.12 |
DBUnit | 2.5.1 |
「データセット」とは?
DBUnitについて調べてて気になったのが「データセット」という単語。
DBUnitの説明に必ず出てくる割には、これがどういったものなのかぴったりくる説明がありませんでした。
これは、テーブル名・カラム名・データ・主キー の情報のかたまりです。
この情報はIDataSet#getTableMetaData()
で取得できます。
ちなみに主キー情報はテーブルからデータを取得した時に設定されます。
DatabaseOperationの挙動
DatabaseOperationについて試したり調べたりする機会があったのですが、現在のバージョンではJavadoc(英語)くらいしかいい資料がなかったのでまとめてみました。
もし外部キー制約違反や一意性制約違反が起こった場合は、org.dbunit.DatabaseUnitException
が発生します。
この例外は、各DBMSの例外をラップしています。
全てのDatabaseOperationにおいて、外部キー制約違反となる場合は上記の例外が発生します。
INSERT
- データセットのデータがDBにインサートされる。
- 実行した結果一意性制約違反となる場合は例外が発生する。
- DBに主キーが設定されていない場合も実行可能。
CLEAN_INSERT
- データセットで指定したテーブルのデータが全て削除され、データセットのデータがDBにインサートされる。
- 実行した結果一意性制約違反となる場合は例外が発生する。
- DBに主キーが設定されていない場合も実行可能。
DELETE
- データセットのデータと主キーが一致しているデータが削除される。
- DBに主キーが設定されていない場合は、例外
org.dbunit.dataset.NoPrimaryKeyException
が発生する。
DELTE_ALL
- データセットで指定したテーブルの全データが削除される。
- データセットに入っている列名やデータの内容は関係ない。
- DBに主キーが設定されていない場合も実行可能。
- 「TRUNCATE_TABLE」と違い、低速だがロールバックが可能。(http://dbunit.sourceforge.net/apidocs/org/dbunit/operation/DeleteAllOperation.html)
UPDATE
- データセットのデータと主キーが一致しているデータが更新される。
- DBに主キーが設定されていない場合は、例外
org.dbunit.dataset.NoPrimaryKeyException
が発生する。
TRUNCATE_TABLE
- データセットで指定したテーブルの全データが削除される。
- データセットに入っている列名やデータの内容は関係ない。
- DBに主キーが設定されていない場合も実行可能。
- 「DELTE_ALL」と違い、高速だがロールバックが不可能。(http://dbunit.sourceforge.net/apidocs/org/dbunit/operation/TruncateTableOperation.html)
REFRESH
- データセットのデータと主キーが一致しているデータが存在しない場合はインサートされ、存在する場合はデータセットの内容に更新される。
- DBに主キーが設定されていない場合は、例外
org.dbunit.dataset.NoPrimaryKeyException
が発生する。
NONE
- 何もしない。
- プロパティの値によってDatabaseOperationを切り替えたい時に使うと便利。
補足
前のバージョン(いつかはわからない)だと「TRUNCATE_TABLE」でテーブル自体が消えてしまっていた?
DatabaseOperationを使用しただけでは、「テーブルの削除」「主キーの更新」等はできなさそうです。
DBUnitを使用した他のやりかたがあるのかは調べてません。
感想
テスト用途なのでCLEAN_INSERTとTRUNCATE_TABLEとNONEあたりが使えれば十分だと感じました。