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 test
やmvn 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() |
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