はじめに

仕事で spockをつかうことになりそうなので、まずはHello, World的な簡単なサンプルを実行することにしました。

環境構築

環境情報

  • JDK 1.8
  • IntelliJ IDEA 2017.2.4
  • spock 1.1(groovy2.4)

IntelliJで プロジェクト作成

IntelliJ のツールバーより、

  • [ファイル] -> [新規] を選択。
  • Gradleプロジェクトを選択。
  • Java, Groovyにチェックを入れる。

あとは、デフォルトのままにOKを押していく。

build.gradleの修正

spockをダウンロードするようにbuild.gradleを修正。

version 1.0-SNAPSHOT

apply plugin: groovy
apply plugin: java

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile org.codehaus.groovy:groovy-all:2.3.11
    testCompile "org.spockframework:spock-core:1.1-groovy-2.4"
}

code

テスト対象コード

以下のクラスをテストします。src/main/java/sample/Calculator.java

package sample

class Calculator {
    int add(int a, int b) {
        return a + b
    }
}

テストクラス

以下のテストクラスを用意します。 test/groovy/CalculatorSpec

package spock

import sample.Calculator
import spock.lang.Specification

class CalculatorSpec extends Specification {

    def 足し算1() {
        setup:
        Calculator calc = new Calculator()

        expect:
        calc.add(1,1) == 2
    }
}
  • setup: ・・・ 前処理でやりたいことを書く
  • expect: ・・・期待するテスト結果を書く == でAssertする。

CalculatorSpecを選択して、実行する。テストが成功します。

テストクラスその2

こんどはわざと失敗するテストを書いてみます。

def 足し算1() {
    setup:
    Calculator calc = new Calculator()

    expect:
    calc.add(1,2) == 4
}

以下のようにわかりやすいエラー表示が出力されます。

Condition not satisfied:

calc.add(1,2) == 4
|    |        |
|    3        false
sample.Calculator@5e316c74

予想 :4

実際   :3

リファクタリング

前処理、後処理をまとめる関数が用意されています。

  • 前処理: setup(){}
  • 後処理: cleanup(){}
package spock

import sample.Calculator
import spock.lang.Specification

class CalculatorSpec extends Specification {
    def calc

    def setup() {
        calc = new Calculator()
    }

    def cleanup() {
        calc = null
    }

    def 足し算1() {
        expect:
        calc.add(1,1) == 2
    }

    def 足し算2() {
        expect:
        calc.add(1,2) == 3
    }
}

データ駆動テスト

where:を使うことで、データテーブルを使ったテストがかけます。

def "足し算:データ駆動テスト"() {
    expect:
    calc.add(a, b) == c

    where:
    a|b|c
    1|1|2
    2|3|5
    3|4|7
}

その他

コードはgithubにもあげています。

続き

今日はここまで!