Spock1.1の新機能紹介

SpockというGroovy言語で記述するテスティングフレームワークがあります。 今回は2017/05/01にリリースされたバージョン1.1の新機能のうち3つを紹介します。

Spock リリースノート

本記事はG* Advent Calendar 2017の14日目です。

verifyAll メソッドによる(Soft Assert)

いろんな界隈で流行ってきているSoft AssertがついにSpockにも来ました。Integration Testにおいてはテストスクリプトもしくはライブラリ内で有用になる場面が多いこの機能。

Soft Assertというのは総称で、「複数の検査(assert)をグルーピングし、グループ内の検査が失敗してもグループ内の処理は全て実行してから、失敗を通知する」というものです。 これにより「あぁー、ここで失敗した場合には、この検査もしないと具体的にバグがわからないんだよなー」といって、テストコードを複雑にしてしまったり、デバッグ実行しながら変数の中身を確認するということを減らすことが出来ました。

Spockの場合は verifyAll というメソッドで提供されていて、引数にクロージャを受け付けます。 使い方はthen , expect などの普段なら boolean を返す行を連ねているところを verifyAll {} で包むとできます。

class WhenUsingSoftAssert extends Specification {

  def "should continue assert in verifyAll"(){
    expect:
    verifyAll {
      1 == 1
      2 == 3 // ここで失敗するけど、次行以降も評価される
      3 == 3
      4 == 5
    }
  }
}

where句のデータテーブルで左側の値を参照できる

Spockでは where句にテストの入出力をテーブル表記してパラメタライズテストをすることが出来ます。 このテーブルで左側の値を参照することが出来るようになりました。

使い方はwhere句のテーブルで現在列より左側の値はその変数名を記述するだけです。

lass WhenReadingTableLeftValue extends Specification {
  @Unroll
  def "should return left value in table"() {
    expect:
    x == y + z

    where:
    x  | y     | z
    10 | 1     | 9
    9  | x - 7 | 7
    8  | 2     | x - y
  }
}

@PendingFeatureで未実装機能マーカーでテストを実行しない

SpockのテストでTDD/BDD的にコードを書いていたり、テストコードをメモや要求のノート代わりに使っていると、未実装の振る舞いが存在する時間があります。 そのときにはそのフィーチャ(いわゆるテストメソッド)は @PendingFeature でマークすることでテストがスキップされます。 既存の @Ignore と異なるのでは、名前だけで @Ignore は「実装されているんだけどなんらかの理由で無視する」という用途に使い、 @PendingFeature は未実装だったり開発を中止しているものに使おうというものです。

@PendingFeature
def "not implemented yet"() { ... }

その他

  • Sprint Boot 1.4向けのアノテーション追加
  • Spyをすでに存在するオブジェクトに対して使える
  • Java 8の default メソッドをもっている interface に対してSpyを使える

Groovy in Action

Groovy in Action

  • 作者: Dierk Konig,Paul King,Guillaume Laforge,Hamlet D'arcy,Cedric Champeau
  • 出版社/メーカー: Manning Pubns Co
  • 発売日: 2015/06/27
  • メディア: ペーパーバック
  • この商品を含むブログを見る

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築