1/6のエントリ「Arquillian Persistence Extensionを触ってみる」の続きで、ドキュメントにもあるShouldMatchDataSetアノテーションを使ってみました。
これを利用することで簡単にテーブルデータの比較テストができますようです。
テスト内容
dataset.xmlで定義した名簿テーブルからIDが0002のエンティティを取得して
名前を変更して保存します。その変えた内容をexpected_dataset.xmlに定義して
正しく更新されたかどうかのテーブル比較テストを行います。
元データ
dataset.xmlとして以下を定義しました。
xml version="1.0" encoding="UTF-8"
<dataset>
<mymeibo id = "0001" name = "horikita" />
<mymeibo id = "0002" name = "makimaki" />
</dataset>
期待データ
プログラムが正しく動けば、こうなるはず、というデータをexpected_dataset.xmlとして定義しました。2レコード目のname属性を「maki」とします。
xml version="1.0" encoding="UTF-8"
<dataset>
<mymeibo id = "0001" name = "horikita" />
<mymeibo id = "0002" name = "maki" />
</dataset>
テストコード
以下のような感じで実行しました。
@Test
@UsingDataSet("dataset.xml")
@ShouldMatchDataSet("expected_dataset.xml")
public void データベースの更新テスト(){
MyMeibo myMeibo = meibo.find(0002);
assertThat(myMeibo.getName(), is("makimaki"));
myMeibo.setName("maki");
meibo.edit(meibo);
}
通常はテストコード内でデータ更新のコードとか書くのではなく、テストされる側のメソッド内で書かれると思いますが、今回は@ShouldMatchDataSetの挙動確認サンプルということでご了承下さい。。
実行 成功パターン
NetBeansでは、メソッドを右クリックすると「フォーカスしたテスト・メソッドの実行」というメニューがあるので、それを選択します。
おおー。あっさり成功。
実行 失敗パターン
あまりに簡単に動いたので、「これホントに比較してくれてるのか…?」と疑ってしまいました(^^;
で、わざと期待データを変えて(makiをmakidayoとプログラム結果では合わないものを記述)実行すると…。
xml version="1.0" encoding="UTF-8"
<dataset>
<mymeibo id = "0001" name = "horikita" />
<mymeibo id = "0002" name = "makidayo" />
</dataset>
失敗!
すごい!失敗の理由もちゃんと記述されてるし。熱いです。
感想
DB関連はちょっとしたミスでバグが出やすいかと思います。普段コードを書いて、実際に走らせて、DBを見に行って、目視で「うむ」と確認して進みますが、リグレッションテストも毎回目視というのは正直しんどくて、改造が頻繁にあったりするシステムだと泣きます…というか今まで泣いてました(;_;)
でもこんな簡単にDB含めてテストできるなら、絶対やるべきだなと痛感。
JUnitやDbUnitを組合わせても同じことができるかと思いますが、ArquillianはJava EEと相性が抜群、というか、warを実際にデプロイして動かしてる辺り、なんともいえない安心感があったり。。。素人感覚ですがテストコードが書きやすい気がします(^^;
とりあえず、次期案件で実際に利用してみよう。