2005-12-03 (Sat) [長年日記]

_ DbUnit を使ってみた はてなブックマークに追加 del.icio.usに追加 MM/Memoに追加

DbUnit

setUp() で予め用意しておいた XML ファイルの定義にしたがって 表構造を初期化してテストを走らせる、というポリシーで テストを行うらしい。なかなか良いんじゃないか。

最初は「なんで XML なんだよ、うぜぇえええ」って思ったが、 よく調べてみると、

  • ant で DB に接続して XML を吐き出すことができる
  • 自分で数行のプログラムを書いて XML を吐き出すこともできる
  • Excel でデータの定義をしてそれを読み込むことも可能 (但し POI が必要)

などなど、なかなか親切になっているので、自分で XML を書くことはなく、 出力された XML をちょこっと微調整するぐらいで使えてしまった。

以下、コツとか疑問点とか。

開発者ごとにテスト専用のデータベースを用意すべし

同じ DB を使ってテストをすると複数の開発者で同時にテストを 走らせたときに正しく動かない可能性があるので、DB は分けた方が良い。

今のプロジェクトでは Spring Framework の DI コンテナを使って DB アクセス層を定義しているので、開発者ごとに DI コンテナの 定義を変えてしまえばコードを書き換えずに DB の使い分けができる。

setUp で commit してくれないような気が?

DBUnitTestCase.setUp を呼ぶと、指定した XML に従って DB を初期化 (データの削除、および、初期データの insert)などをしてくれること になっているのだが、初期化の後に commit が行われていないような 気がする。

自分で commit したくても、初期化時に使われた Connection クラスへの 参照はどこからも取得できないので、結局自分で setUp の中身を 書いて、commit してやる必要があった。

ant での XML 出力で、データの入っていないテーブルの定義が出力されない

XML になんらかの記述のあるテーブルに対してしか

delete from HogeTable;

という初期化 SQL を実行してくれないようなのだが、 ant から XML 出力をする と、データがまったく入っていないテーブルに対しては何も XML を 吐き出してくれないため、データが空のテーブルの初期化が行われない。

自分で

<HogeTable />

みたいな空の定義を XML に追加してやれば、

delete from HogeTable;

を実行してくれるのだが、 ant を走らせるたびに手作業で 空のテーブル用の定義を書くのも面倒臭い。

空のテーブル用の XML だけを予め手作業で用意しておいて、 ant から出力した XML と手作業で用意した定義を足し合わせた 定義を渡したくても、1 つの XML からしか定義を読み込めないような API になっているので、複数のファイルから定義を渡すことができない。

これも上記の setUp で commit されない問題と合わせて、 自前で複数の XML ファイルから初期化を行う処理を書くことで対処した。

関連記事

Permalink | このエントリを含むはてなブックマーク | このエントリをはてなブックマークに追加 | このエントリを含むMM/Memo | このエントリをMM/Memoに追加 | このエントリを含むdel.icio.us | このエントリをdel.icio.usに追加 | Tags: java
本日のツッコミ(全1件) [ツッコミを入れる]
_ muesc ofikst (2008-10-26 (Sun) 18:49)

bsfmvyeq wzqflsna ishzc gsmybf enjwgxqpl jtdbcl rkzwte

[]