blog4j 2.0 このページをアンテナに追加 RSSフィード

2013-03-10

Groovy基礎勉強会でSpockについて話してきた #GroovyBase

| 01:17 | Groovy基礎勉強会でSpockについて話してきた #GroovyBase - blog4j 2.0 を含むブックマーク

Groovy基礎勉強会でSpockの コードを読んだ感想 基礎について話してきました。

普段Spockを使ったり、Spockの拡張を書いてみたりしてたので、なんとなく話せるかなと思ってたのですが、基礎勉強会的にSpockの使い方とか拡張の実装方法とかを話したら負けかなと思って、コンパイル時(AST変換)と実行時(Specification)について話しました。「なるほど、わからん」と思っていただければ嬉しいです。

SpockのAST変換はいろいろやっていて発表ではひどいことを言いましたが、Spockの半分はやさしさで出来ています。やさしさの代名詞であるPowerAssertは、Spockの実装がGroovyに取り入れられたぐらいですし。発表の中でもちらっと話しましたが、Spockの書き方を間違えるとAST変換時にいろいろと、やさしく教えてくれます。

例えば、setup()メソッドをsetUp()と書くと、コンパイルエラーが発生します。

class HelloSpock extends Specification {
    void setUp() {
        println 'setUp'
    }
}
1 compilation error:

Misspelled 'setup()' method (wrong capitalization) 

他にもAST変換時に色々とチェックしてくれるようになっています。Spockは全然こわくないです。

Java基礎勉強会から久しぶりの基礎勉強会参加でしたが、あいかわらず勉強になったのかなってないのかわからん勉強会でした。

2011-12-05

Spockでデータドリブンなテスト

| 23:49 | Spockでデータドリブンなテスト - blog4j 2.0 を含むブックマーク

G* Advent Calendar 2011 5日目です。

本当は、GradleとGebとSpockでSIerの大好物な画面キャプチャを貼りつけたExcelを出力しようとしたんですが、なぜか出力される画像ファイルのファイル名が文字化けする現象にハマってしまったので、Spock小ネタで勘弁して下さい。Excelネタは別エントリか誰かがやってくれると思います。

で、Spockでデータドリブンなテストですが、データドリブンなテストとはJUnitで「@RunWith(Parameterized.class)」ってやるアレです。JUnitのやり方だとかなり面倒なのですが、Spockだと簡潔に書けます。例としてSpockのトップページにも載ってるサンプルです。

# おそらく一番有名なSpockコードですね。

import spock.lang.*

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

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

これでJUnitのParameterizedと同じようなことができますが、異なる点があります。whereラベルで定義されているデータセットの数だけテストが実行されますが、テスト結果は1つにまとめられてしまいます。

これはこれで嬉しかったり、嫌だったりします。テストによってはデータごとにレポートが欲しかったり、欲しくなかったりします。

で、Spockには@Unrollというアノテーションがあってこれを使うとJUnitのようにデータセットの数だけテスト結果も出せるようになります。

import spock.lang.*

class HelloSpock extends Specification {
    @Unroll
    def "length of Spock's and his friends' names"() {
        ...
    }
}

結果

これでJUnitと同じようになりましたが、JUnitと同じように「テストメソッド名 + [インデックス]」という残念なテスト名でレポートされます。

@Unrollアノテーションにはもっと便利な使い方があって、クロージャを使ってテスト名を指定できます。

# 以前は文字列だけで良かった気がしたけど。

import spock.lang.*

class HelloSpock extends Specification {
    @Unroll({"$name の長さは $length"})
    def "length of Spock's and his friends' names"() {
        ...
    }
}

結果

これで、良い感じになりましたね!そんなわけで、次は @literalice さん!