JavaのテストコードからはじめるGroovy #gadvent2012

本エントリーは、G* Advent Calendar 2012の24日目のエントリーです。前日は、@tetsurokitaharaさんのGroovyにProcessingを!でした。

何をネタに書こうかなと悩んだのですが、思うほどG*なネタは持っておらず、JUnitネタとなりました。実は、書籍「JUnit実践入門」でもGroovyを活用するトピックを入れる予定だったのですが、紙面の都合上、入れる事ができませんでした*1。そこで、少しだけですが、本エントリーで補足したいなと思います。

テストコードでGroovyを使う

Groovyは、Javaと親和性の高いプログラミング言語です。上司を説得する場合は「GroovyはJavaの拡張ライブラリです(キリッ」と言っても良いでしょう。本当は開発環境やビルドツールの設定などで一工夫しなければ利用できませんが、その辺は裏でしれっとやってしまえばOKです。
とはいっても、いきなりGroovyやるぞと言ってもチームのメンバーはびっくりしてしまうかもしれません。そこで少しずつ洗脳していくために、テストコードをGroovyで書くところから始めるとスムーズに導入できる可能性が高まると思います。
なぜならば、Groovyはこれまで書いていたJUnitのテストコードを、同じように、簡単に、楽して書くことができるからです*2

なお、EclipseでGroovyの開発を行うには、Market Placeで「Groovy」を検索し、Groovy-Eclipseをインストールするのが簡単です。お使いのEclipseに合わせて「Groovy-Eclipse for Juno」か「Groovy-Eclipse for Indigo」を選択してください。

テストコードの比較

Javaを利用したテストコードのサンプルは次のようになります。

public class CalculatorTest {
    @Test
    public void _4を2で割ると2を返す() throws Exception {
        Calculator sut = new Calculator();
        assertThat(sut.divide(4, 2), is(2.0));
    }
}

一方、Groovyで記述すると次のように書けます。

class CalculatorTest {
    @Test
    void "4を2で割ると2を返す"() {
        def sut = new Calculator()
        assertThat(sut.divide(4, 2), is(2.0))
    }
}

違いをみていきましょう。

publicの省略

Groovyでは、クラスやメソッドのアクセス修飾子を省略した場合、publicとなります。したがって、classの前のpublicやメソッド定義のpublicを省略できます。書いてあっても問題ありません。

セミコロンの省略

Groovyでは、黒魔術を使わなくとも、セミコロンを省略できます。

メソッド名の先頭に数字の利用

Groovyでは、メソッド名を文字列のようにダブルクオーテーションで囲むことができます。すると、Javaでは定義できなかったメソッド名を定義できます。例えば、先頭に数字を使うことや、小数点・カンマ・句点などが利用できるため、テストケース名(メソッド名)が理解しやすくなります。

throws Exceptionの省略

Groovyでは、例外はすべて非チェック例外のように振る舞います。したがって、Javaで必要であったthrows句やtry-catch句を省略可能です。
このことは、プロダクションコードを書く場合には、チェック例外を使用するか非チェック例外を使用するかで議論の分かれる部分かもしれません。しかし、テストコードでは議論の余地無く、throws Exceptionでしょう。でも、書くのが面倒…ならばGroovyです。

変数の型を省略

Groovyでは、変数をdefというキーワードを使い、宣言することができます。Java的にはObject型として宣言されていることと等価であるため、「Object sut」と宣言していることと変わりません。
Groovyでは、実行時に呼び出されたメソッドがあるかをチェックし、ない場合は例外を送出します。これはコンパイル時のチェックが甘くなるため、Javaの静的メリットを小さくするかもしれません。
ですが、ここで書いているのはテストコードです。メソッドが存在しないで例外が発生することは全くデメリットになりません。

それGroovyならできるよ

これから書くJavaのテストコードの拡張子はgroovyとし、簡単に省略できるところをGroovy化しましょう。
そして、テストコードを書いていくと、様々な「こんなこと出来たらなぁ」が発生します。特に、Rubyなどスクリプト言語を扱った経験があれば、ヒアドキュメントが書きたい、リストを簡単に宣言したいといった気分になるはずです。
そんな時は、「プログラミングGROOVY 」を開き、解決できないか確認してみてください。

少しずつGroovyっぽいコードになってくはずです。

もう、プロダクションコードもGroovyでいいんじゃね?

Yes!

明日は @kazuchikaです。

プログラミングGROOVY

プログラミングGROOVY

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

*1:Groovyの解説やインストール方法などを書くと少なく見積もっても後50Pは必要となったので

*2:テストコードを書いてない人は、まずJUnit実践入門をお買い求めください