JavaなプロジェクトはGroovyでテストを書こう

2日連続のテストに関するエントリである。

前回、テストコードは仕様書だという事を書いた。

入力、出力、エラー系等様々なケースが網羅されることで初めて価値がある。そうなって初めて、「テストは仕様書だ」と声に大にして言えるだろう。

ただ、JavaJUnitを使ってテストを書く開発においては若干負い目を感じざるを得ない。

表現力の欠如

価値のあるテストはJUnitでも十分書ける。ただ、テストコードの表現力という面においてはどうだろう。

hamcrestのMatcherを利用することで多少マシになったとはいえ、Javaの古臭い文法や冗長な記述により、テスト仕様の本質ではないコードがどうしても多くなる。

TDDやBDDをやるならテストコードが「仕様」であることを表現できることが何よりも重要だ。

そして、その仕様は誰が見ても自明なものでなくてはならない。

プログラマであっても、パッ見でもなんとなくテストの意味が理解できるレベルの表現力が必要だ(非プログラマが直接テストケースのパターンチェックをするという運用も可能になる)

これをJavaで実現するのはかなり無理がある。そのような言語を使って、ちゃんとテスト書けや(゚Д゚)ゴルァ!!と強いるのはちょっと違うんじゃないかと考え始めた。

Spock

spock というGroovy製BDDフレームワークがある。

ご存知の通りGroovyはDSLをサポートしているため、新たな制御構造を構築することが可能だ。

これは公式のサンプルだが、とりあえず見てほしい。

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的に仕様・入力・期待値だけが簡潔に記述されていて、まったく無駄がない。特にwhere部分の表現力は爽快だ。まるでテーブルだ。

他にもテストを書く上で必要な機能は一通り備わっている。

SpockにはWebコンソールが存在するので、まずはその手軽さと表現力を実際に体感してほしい。

Spock Web Console

GroovyはJVM系言語のため、Javaのコードをこのspockを使ってテストすることができる。

Java開発で無理してJUnitを使う理由は、もはや無い。