読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

Arquillian Persistence Extensionでテーブルの比較テストに挑戦

Arquillian

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")); //取得できるのはmakimakiだよね?
    
    //ID 0002のレコードの名前をmakimakiからmakiへ変更するよー
    myMeibo.setName("maki");

    //更新してみるねー
    meibo.edit(meibo);
}

通常はテストコード内でデータ更新のコードとか書くのではなく、テストされる側のメソッド内で書かれると思いますが、今回は@ShouldMatchDataSetの挙動確認サンプルということでご了承下さい。。

実行 成功パターン

NetBeansでは、メソッドを右クリックすると「フォーカスしたテスト・メソッドの実行」というメニューがあるので、それを選択します。
f:id:kikutaro777:20130109195905j:plain
おおー。あっさり成功。

実行 失敗パターン

あまりに簡単に動いたので、「これホントに比較してくれてるのか…?」と疑ってしまいました(^^;
で、わざと期待データを変えて(makiをmakidayoとプログラム結果では合わないものを記述)実行すると…。

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <mymeibo id = "0001" name = "horikita" />
    <mymeibo id = "0002" name = "makidayo" />
</dataset>

失敗!
f:id:kikutaro777:20130109195914j:plain
すごい!失敗の理由もちゃんと記述されてるし。熱いです。

感想

DB関連はちょっとしたミスでバグが出やすいかと思います。普段コードを書いて、実際に走らせて、DBを見に行って、目視で「うむ」と確認して進みますが、リグレッションテストも毎回目視というのは正直しんどくて、改造が頻繁にあったりするシステムだと泣きます…というか今まで泣いてました(;_;)

でもこんな簡単にDB含めてテストできるなら、絶対やるべきだなと痛感。
JUnitDbUnitを組合わせても同じことができるかと思いますが、ArquillianはJava EEと相性が抜群、というか、warを実際にデプロイして動かしてる辺り、なんともいえない安心感があったり。。。素人感覚ですがテストコードが書きやすい気がします(^^;

とりあえず、次期案件で実際に利用してみよう。

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村