LoginSignup
25
31

More than 5 years have passed since last update.

Spockノウハウの簡単なまとめ

Last updated at Posted at 2016-11-04

G*Advent Calendar(Groovy,Grails,Gradle,Spock...) Advent Calendar 2016 4日目。
前日→@PoohSunnyさん
翌日→@h1romas4さん

TL;DR

Spockでテスト書くときの細々としたノウハウまとめ。

Spockとは

  • テストフレームワーク
  • 名前の由来はスタートレックの分析官
  • Groovyだけでなく、JavaのUnit Testにも使える
  • パラメータの値をパラメタライズする試験を簡単に書ける

テスト作成方法

  • SpecificationクラスをextendすればOK

Eclipse利用

JUnitとほぼ同じ感じで作れる

ファイル手作り

おすすめは
* 拡張子を.groovyにする
* テスト実行クラス名の末尾をSpecにする

テスト実行方法

Eclipse利用

  • JUnitと同じで、メソッド名やクラス名からテストを実行できる

コマンドライン

gradle testmvn testから実行できる。

gradle test

動かすだけ

gradle test

オススメ

gradle --info test

単一テスト実行

gradle --info test -Dtest.single=XyzSpec

mvn test

mvn test

JUnitとの比較

観点 JUnit Spock
テストクラス命名 Test Spec
テストクラス初期化 @BeforeClass def setupSpec()
テストクラス後始末 @AfterClass def cleanupSpec()
テストケース呼び方 Test Case Feature
テスト初期化 @Before def setup()
テスト後始末 @After def cleanup()
網羅試験 @Theory @Unroll
正常系の期待値確認 Assertion Conditions(when, then)
異常系の期待値確認 @Test(expected=...) @FailsWith() or Thrown()
spockの例
import spock.lang.Specification

class XyzSpec extends Specification {
  def setupSpec() {
    //テストクラス内で一度きりの初期化
  }

  def setup() {
    //テストケースごとの初期化
  }

  //@Unroll 書くならここに付ける
  def "何かのテスト"() {
    setup:
    //何かの初期化

    expect:
    //何らかの期待値

    when:
    //何らかの条件

    then:
    //モックメソッドの呼び出し回数確認など

    cleanup:
    //後始末(あれば)
  }

  def cleanup() {}

  def cleanupSpec() {}
}

Theoriesの話の参考(JUnit)→ http://tt4cs.blogspot.jp/2013/02/theories-and-parameterized-in-junit-4.11.html

@Unrollの話の参考(Spock)→ http://d.hatena.ne.jp/kiy0taka/20111205/1323096586

setup,cleanupの話の参考(Spock)→ http://spockframework.org/spock/docs/1.1-rc-2/all_in_one.html (Fixture Methods)

よくはまるポイント

@Unroll使う時はパラメータをdefしないように気をつける

ダメな例
@Unroll
def "このテストは実行エラーになります"() {
  def expectedValue

  expect:
  expectedValue == someObject.someMethod(parameterA, parameterB)

  where:
  expectedValue || parameterA | parameterB
  1             || 2          | 3
  2             || 2          | 1
}
よい例
@Unroll
def "このテストは実行できます"() {
  expect:
  expectedValue == someObject.someMethod(parameterA, parameterB)

  where:
  expectedValue || parameterA | parameterB
  1             || 2          | 3
  2             || 2          | 1
}

defした変数はwhere句のパラメータとして選べない。

参考になるサイト(随時更新予定)

「Spockのモックサポート」https://github.com/yamkazu/spock-workshop/blob/master/docs/04_mock.md
「SpockにおけるMock、Stub、Spyの違い」 http://uehaj.hatenablog.com/entry/2014/05/09/120930
「モックの基本的な使い方」https://github.com/yamkazu/spock-workshop/blob/master/src/test/groovy/learning/mock/MockSpec.groovy

25
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
31