それでも Spock を使い続ける理由

2011年も残すところ後1ヶ月となりました。
12月と言えば アドベントカレンダーですが、技術系アドベントカレンダーには参加できなかったので勝手にやっちゃいます。
3日坊主だけにはなりたくないですが やれるところまでがんばってみるかな…

と言うことで 第1日目は 誰にも理解されず 約半年間 Javaユニットテストで Spock を使い続けてきた理由を挙げてみます。

まず Spock を知らない人のために...
Spock は Groovy ベースの BDD フレームワークで こんな感じで書きます。
ちなみに プロジェクトページは http://code.google.com/p/spock/ です。

class HelloSpock extends spock.lang.Specification {
    def "length of Spock's and his friends' names"() {
        expect:
        name.size() == length

        where:
        name     | length
        "Spock"  | 5
        "Kirk"   | 4
        "Scotty" | 6
    }
}  

BDD と聞くとなんか敷居が高いですが Spock はぜんぜんそんなことはありません。
BDD にこだわる必要なんかないんです。好きなように使っていいんです。Spock は...
もちろん TDD にだって使えます。難しいこと考えずに JUnit 使うくらいなら Spock 使いましょう。

ということで Spock を使い続けてきた理由です。

その1. 手軽に始められる

Spock は Groovy と JUnit をベースに作られています。
イマドキの IDE や ビルドツールであれば 大抵 Groovy も JUnit もサポートしているので Spock だって直ぐに使えるし、 Groovy は ほとんど Java と同じシンタックスなので、一般的な Java プログラマであれば 苦労することなく始められるはずです。
IDE のサポートさえあれば、とりあえず自分一人だって始められますよ。

その2. とにかく見た目が美しい

Spock のコードは とにかく少なくて見やすいです。一目見ただけで 直ぐに理解することができます。
もともと BDD のために開発されたフレームワークですので、当然コードを見ただけで簡単に仕様を把握できるように作られているのですが...
見やすさという点では 特に where ブロックはすばらしいです。
こんな感じで データを列挙するだけで たくさんの入出力パターンのテストが書けちゃうんです。

    where:
    name     | length
    "Spock"  | 5
    "Kirk"   | 4
    "Scotty" | 6
一度見ちゃうと JUnit には戻れなくなりますよ。
あと Mock も とっても分かりやすく書けるのでお気に入りです。

その3. エラー情報が半端ない

こんな感じです。ここまで必要なの?と思わずつぶやいてしまうくらい詳細に出力してくれます。

    Condition not satisfied:

    max(a, b) == c
    |   |  |  |  |
    3   1  3  |  2
              false

Spock の良さが少しでも伝わったでしょうか? 勝手にアドベントカレンダーはまだまだ続きます。
次回も Spock ネタかな。暫く引っ張りますよ。次はもう少し役に立つ情報を...