Spock は素晴らしい!のですが、最大限機能を生かしきれてないと、よく感じるのでメモ。

基本形

package net.bucyou

import spock.lang.Specification

class SampleSpecification extends Specification {

    // すべての feature (テスト) 前に実行される
    def setup() {

    }

    // すべての feature (テスト) 後に実行される
    def cleanup() {

    }

    // 最初の feature (テスト) 前に実行される
    def setupSpec() {
    }

    // 最後の feature (テスト) 後に実行される
    def cleanupSpec() {
    }

    // feature method (テスト)
    def "うどんをたべるとうまい"() {
        given:
        def i = ..
        def udon = ..

        when:
        def result = i.eat(udon);

        then:
        result == "Umai"
    }
}

うどんはうまい。
このとき、result == “Mazui” とかを仮に結果に入れてみると、やたら詳しく比較が出てくれます。
これは、IntelliJ IDEA の機能ではなく、Spock の機能のようです。

スクリーンショット 2013-08-16 17.55.30

Map や List でも、同様に細かい比較を見ることができるので、大助かりであります。

featureの文法

feature は、setup, when, then, expect, cleanup, そして where
6つのブロックによって構成されています。
いつも、Gherkin の影響で given を使っていたのですが、
これは、setup の エイリアスとして定義されているので、動作に問題はありません。

Blocks2Phases

公式のドキュメントによると、流れは上のような感じ。

setup: データの準備とか (1)
when: 実際に何かを実行 (2)
then: 結果の検証 (3)
expect: 何かを実行して検証 (2,3)
cleanup: データのお掃除とか (4)
where: なんか図では、えらいことになってますが後述

then, when など順番を逆に書いたりすると、エラーって落ちたりするっぽいです。
when -> expect -> then というものダメです。
when, then, when, then と複数回書くのは問題ないようです。
then が前のブロックに続けて複数あるときなどは and も使えるようです。

where block

where は複数の入力データを、同じテスト (setup, when, then, cleanup) に通すときに便利なブロックです。

class SampleSpecification extends Specification {

    def "where!!"() {
        setup:
        println "setup"

        when:
        println "when"

        then:
        println "then"
        println "a=" + a
        println "b=" + b

        cleanup:
        println "cleanup"

        where:
        a | b
        1 | "Udon"
        2 | "Soba"
    }
}

これを実行すると、以下の様な結果がやってきます。

setup
when
then
a=1
b=Udon
cleanup
setup
when
then
a=2
b=Soba
cleanup
class SampleSpecification extends Specification {

    def "where!!"() {
        setup:
        println "setup"

        when:
        println "when"

        then:
        println "then"
        println "a=" + a
        println "b=" + b

        cleanup:
        println "cleanup"

        where:
        a | b
        1 | "Udon"
        2 | "Soba"
    }
}

こういう、表形式な書き方もできるので、テストをわかりやすくするためには
なかなかゴキゲンになれる機能ですね!

Mock については、また今度書きます。

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>