home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

技術/TDD/TestNG/デフォルトのAssertion, カスタムAssertionの作成

技術/TDD/TestNG/デフォルトのAssertion, カスタムAssertionの作成

技術 / TDD / TestNG / デフォルトのAssertion, カスタムAssertionの作成
id: 1194 所有者: msakamoto-sf    作成日: 2013-06-22 23:09:06
カテゴリ: Java TDD TestNG 

TestNGのデフォルトのAssertion

TestNGのデフォルトのAssertionは、 org.testng.Assert クラスにstaticメソッドとして用意されてます。
import staticして使う形になると思います。

primitive型, Object, byte[], Object[], Collection, Set, Map などひと通り揃っています。
デフォルトのCollectionのassertは順番に依存します。順番がどうなるか分からないけど、要素だけ一致しているか確認したい場合は、一度Object[]に直した上でassertEqualsNoOrder()を使えば良いと思います。

自前のクラスのインスタンスを使ってる場合も、ちゃんとhashCode()やequals()を実装しておけば一致チェックしてくれる筈です・・・多分・・・。hashCode(), equals(), toString()はEclipseの自動生成を使うと楽ちんです。

というわけで、ざっくりとassertionを色々と呼び出してみたサンプルが以下になります:

カスタムAssertionの作成

上記の"TestAssertionSamples.java"に含めていますが、基本的にはお好みの一致チェックメソッドを作成して、一致に失敗したら org.testng.Assertのfaile()メソッドを呼び出します。
(原理的には java.lang.AssertionError をthrowしても同等に思えるのですが、試してみたらEclipse上のTestNGプラグインやコンソールのスタックトレースが一個前のassertEquals()になってしまいうまく動かなかったため、fail()の方を使ってます。github上のTestNGのソースを読めば、fail()も最終的にはAssertionErrorをthrowしてます)

void assertCalendarYearIs(Calendar actualCalendar, int expectedYear)
            throws AssertionError {
        int actualYear = actualCalendar.get(Calendar.YEAR);
        if (actualYear != expectedYear) {
            fail(String.format("expected [%d] but found [%d] in [%s]",
                    expectedYear, actualYear, actualCalendar.toString()));
        }
    }
 
    @Test
    public void assertCalenderAndCustomAssertion() {
        Calendar ac = Calendar.getInstance();
        ac.set(2000, 1, 2, 3, 4, 5);
        Calendar ec = Calendar.getInstance();
        ec.set(2000, 1, 2, 3, 4, 5);
        assertEquals(ac, ec);
        assertCalendarYearIs(ac, 2000);
    }

Compositeデザパタを適用したりした、複雑なオブジェクトの場合は、上記のような技法で専用のassertionを用意する必要があるかもしれません。
あるいは、単に一致しているかどうかだけでなく、値が範囲内に収まっているかとか、Collectionに値が含まれているかなどドメインに特化したタイプのassertionの作成にも使えそうです。

assertionのカスタマイズとなりますと、JUnitの文化圏ではhamcrestとの組み合わせがメジャーな状況(2013/06現在)ですが、TestNGでは地雷を踏まない形でのhamcrestとのintegrationの例やドキュメントがなかなか見当たりません。決して「英語のようにスラスラ読める」訳ではありませんし、どちらかと言うと泥臭い技法になりますが、上記のようなカスタムassertionの作成は選択肢の一つに入れておいて損はないと思います。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-06-22 23:25:12
md5:338290385dbc69128779e565e1f67f44
sha1:a308315df2bee657d3d4ff608113915c4eb65d83
コメント
コメントを投稿するにはログインして下さい。