2008年2月15日金曜日

JUnit 4.4 の機能,assertThat と Assumptions,Theories について.

JUnit を知れば知るほどおもしろくなってきた♪JUnit 4.4 の機能について調べても日本語の情報があんまりなかったから,メモとして書いとこう.

さて,まずはassertThatについて.このメソッドの説明は,実際の使用例を見てもらった方がわかりやすいと思うので,まず次の使用例をみてみて.(JUnit 4.4 Release Notesより.)
assertThat(x, is(3));
assertThat(x, is(not(4)));
assertThat(responseString, either(containsString("color")).or(containsString("colour")));
assertThat(myList, hasItem("3"));

深読みせずに読むと,上から「x は3.」「x は4ではない.」「responseString は,color か colour を含む文字列.」「myList は,3を要素として含む.」というふうになる.いつもなら(といえるほど使い込んでない僕が言ってみるw),assertEquals(x, 3) とかってやるんだけどね〜.

さて,この書き方を見ておおすげぇと思わなかった僕と同じ人種の人は,つぎの利点をみて考えてみよう♪

・主語,述語,目的語の順だから読みやすい.
・not(s) や either(s).or(t) のような Matcher の組み合わせが可能.
・テスト失敗のときのメッセージが読みやすい.
・Matcher インタフェースを実装することで,カスタム Matcher を作成できる.

ということらしい.便利だなたぶん・・・.まっ,いままでの assertEquals とかもなくなるわけじゃないから,使いやすい方を使えばいいと思う.

つぎっ!Assumptions.ん〜,よくわかってないんだけど説明するか.Google 先生に教えてもらいながらね.

assumption とは前提のこと.つまり,プログラマが想定しているテストの前提条件を明示的に記述するためのメソッド.普通に考えると不思議に思うのは,前提が満たされないとテストは成功すること.これは,数理論理学の論理包含(含意)を考えると解決すると思う.assumptionassertionってことだね.

File.separatorChar(ファイル区切り文字)が'/'であることを前提としている場合はつぎのようになるらしい.
import static org.junit.Assume.*

@Test public void filenameIncludesUsername() {
assumeThat(File.separatorChar, is('/'));
assertThat(new User("optimus").configFileName(), is("configfiles/optimus.cfg"));
}


うーん,便利さがいまひとつわからないなぁ.

最後〜.Theories.これも今ひとつふーんてかんじでわからん.

Theory とは,定理のこと.この定理は,メソッドが入力値の無限集合のすべての要素に対して,おそらく正しく振る舞うことらしい.(意訳だから違うかも.)この定理を JUnit で実現するみたいなかんじ.

僕の勝手な解釈では,あるメソッドの処理に具体的な値をいろいろとぶっ込んで,メソッドが定理であるようにテストするということ.

使用例はこんなかんじらしい.(めんどくて実行してない.ここまで書いて,NetBeans の JUnit はバージョン4.1じゃんってことに気づいたんだよね・・・orz)
@RunWith(Theories.class)
public class UserTest {
@DataPoint public static String GOOD_USERNAME = "optimus";
@DataPoint public static String USERNAME_WITH_SLASH = "optimus/prime";

@Theory public void filenameIncludesUsername(String username) {
assumeThat(username, not(containsString("/")));
assertThat(new User(username).configFileName(), containsString(username));
}
}

JUnit 4.4 Release Notes をなんとな〜くよんでみると,UserTest クラスは,filenameIncludesUsername メソッドを DataPoint アノテーションが付いたデータを引数として各々実行するみたい・・・.(本当かぁ?)

ということで,最後はぐだぐだなかんじでしめたw詳しく解る人はぜひ教えてください.

参考文献:
速攻解説! JUnit 4.4 - 新アサーションメソッド「assertThat」の用途とは
速攻解説! JUnit 4.4 - 前提条件をAssumeで表現、実験的アサーションTheory
JUnit4をやってみよう
JUnit 4.4 Release Notes
popper Tutorial(POP3サーバとは関係ないよw)
The Practice of Theories(読んでないけど参考になるはず.)

1 件のコメント:

師子乃 さんのコメント...

こんばんは。

英語の文法通りになっていたのは見ていて感動でした!