spock - all your bugs are belong to us
Groovyで出来てる新しいテスティングフレームワーク。作った人はトレッキーらしい。
→Introducing Spock, a testing and specification framework for the JVM - DZone Java
→http://docs.codehaus.org/display/GROOVY/2009/03/10/Meet+Spock!
JDaveやeasybもイマイチ感があったけど,spockは次の点でとっても興味深い。
JUnitに乗っかるって結構重要だと思う。おかげで何の苦労もなしにIntelliJから使えてる。あと,easybで感じたワケわからなさもなかったヨ。
使い方は,こちらに詳しい。→ Google Code Archive - Long-term storage for Google Code Project Hosting.
とりあえず,簡単な例を...
import org.junit.runner.RunWith import spock.lang.* @Speck @RunWith (Sputnik) public class SimpleSpock { def "簡単なテスト"() { when: "4と5で大きいのはどっち?" def x = Math.max(4, 5) then: "5だろJK" x == 5 } }
おもろいのがアサーションに失敗したときで,なかなか気の利いたメッセージを表示する。たとえば,こんな感じにわざと失敗させてみよう。
def "わざと失敗するケースを作ったよ"() { when: def list = [ 3, 2, 1 ] then: "3番目の値は3だ(ウソ)" list[2] == 3 }
Outputんところに注目しよう。こんな感じに,どこがどうなってるって表示してくれる。
list[2] == 3 | | | | 1 false [3, 2, 1]
そのほかに,データドリブンでテストする方法とか...
def x, y, z def "こうゆうのデータドリブンっていうの?"() { expect: "この式がなりたって欲しい" Math.max(x, y) == z where: "expectの変数に与えるデータを定義しとく" x << [ 4, 5, 8] y << [ 1, 8, 2] z << [ 4, 8, 8] }
モックを使うこともできるようだ。→Google Code Archive - Long-term storage for Google Code Project Hosting.
(↓)こんなインターフェイスがあったとして,
public interface ISomeOne { public int plus(int x, int y); }
(↓)こんな感じに使うらしい。
#でも,モックアプローチってイマイチ良さがわからんがの。:-P
def "モック使うこともできる"() { setup: "plus(1, 1)は 2 を返すと仕込む" def some = Mock(ISomeOne.class) some.plus(1, 1) >> 2 expect: "仕込んだとおりにリプレイするよ" some.plus(1, 1) == 2 }
まだバージョンも0.1だし,今後の成長が期待できますな。ラベル横に記述できるコメントの文言が実行時に出力されるようになるとか,専用のレポートツールが出来るとかしたらステキだ。:-D
...と言ったものの,これどこで使おう。:-(
少なくとも仕事つうかJUnitの置き換えってのはあり得んよな。ってんで,いつものように自分の引き出しにこっそりしまっておくことにする。
ps.
IntelliJでspockを使う上での注意がいくつかある。なんでか知らんが "Make Project (Ctrl+F9)" だと今回のように日本語を含んだテストケースのコンパイルに失敗する。不思議なことに,個別コンパイル "Compile XXXX (Ctrl+SHIFT+F9)"だと成功するので,こっちを使う。
同じ理由で,Run/Debug Configurations でも Before launch の "Make" のチェックを外しとくこと。