Spockを試す

JavaでBehavior Driven Developmentをするためのフレームワーク、つまり、機械に読める仕様書を書くためのフレームワークの1つであるSpockをeclipse上で試す。ついでにGradleも試す。

github.com

Eclipseの設定

SpockはGroovyを使うので、EclipseでGroovyを使えるように設定します。新しめのEclipse用のプラグインは公式のマーケットプレイスにないので、

Home · groovy/groovy-eclipse Wiki · GitHub

にあるURL(Eclipse Marsの場合はhttp://dist.springsource.org/snapshot/GRECLIPSE/e4.5/)からプラグインをインストールする。

Help -> Install New Software

でwork with:にgroovy-eclipseリポジトリのURLを追加して、Groovy-Eclipseプラグインをインストールする。

Gradleプロジェクトの作成

Gradleでプロジェクトを作ってみる。

File -> New -> Gradle Project

で言われるがままに設定していけば出来上がる。

build.gradleを以下のように設定する。*1

apply plugin: 'java'
apply plugin: 'groovy'

repositories {
  jcenter()
}

dependencies {
  compile 'org.codehaus.groovy:groovy-all:2.3.11'
  testCompile 'org.spockframework:spock-core:1.0-groovy-2.3'
}

Mavenのpom.xmlより設定ファイルがシンプルで良いですね。

プロジェクトを右クリック -> Gradle -> Refresh Gradle Project

で設定が読み込まれるよう。

テスト対象

テスト対象のJavaのクラスは以下。

package org.example.spocktest;

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

テストの記述

src/test/groovyというディレクトリを作成して、src/test/groovyをSource Pathに加える。

GroovyでCalculatorクラスの仕様を記述する。例えば以下のような仕様が書ける。

package org.example.spocktest

import spock.lang.Specification
import spock.lang.Unroll

class CalculatorSpec extends Specification {

  @Unroll
  def add() {
    given:
      def calc = new Calculator()

    when:
      def result = calc.add(a, b)

    then:
      result == expected

    where:
      a  | b  | expected
      1  | 1  | 2
      0  | 0  | 0
      1  | 0  | 1
      0  | 1  | 1
  }
}

JUnitと同じようにテスト出来る。whereで指定する組み合わせは、PICTを用いて機械的に生成したい。

PICTを試す - 超ウィザード級ハッカーのたのしみ

感想と今後調べること

Spockは、Eclipse, Gradle, 今回は試していないがMavenといったJavaの標準的なツールとの連携もよく出来ている印象だ。 また、可読性が高い点が非常によい。

JUnitで世の中回っているので、併用する形になると思うが、Spockを使う場面とJUnitを使う場面をどう分けるかが難しいところ。

また、Coverageを算出する方法も調べたい。全てのBehaviorを記述してCoverageが100%にならない場合は、余計なコードが存在するということが分かる。

他に気になる点として、仕様変更に対して柔軟かどうかというのも検討する必要がありそうだ。

参考

魅惑的(Fascinating)なテスティングフレームワーク Spock - A Memorandum

Spockを使ってみる (導入編) - Qiita

Gradle + Spock + Eclipse環境 - Qiita

*1:意味が分かっていないので正しいかは?javaプラグインは要るのか?groovyのバージョンが2.3になってしまったので、2.3用のプラグインを使う。groovyのバージョンはどこで変える?