Groovy
spock

「おなじテストを複数回実行する」から見るSpockのUnrollの世界

はじめに

このエントリーはG*Advent Calendar(Groovy,Grails,Gradle,Spock...) Advent Calendar 2016の3日目の記事です。
前日は@it__sseiさんのGroovyでログを出す方法まとめでした。

今日はSpockの小ネタ書きます。

複数回おなじテストを実行する

タイトルのとおりなのですが、まれにこういうケース、ありますよね。
どうやったらできるんだろう? ってわからなかったので調べました。

結論:Unrollでできる

こんな感じ

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

class RunMultipleTimesSpec extends Specification {

    @Unroll
    def "#n回目のテスト"() {
        expect:
        println n

        where:
        n << (1..10)
    }
}

Unroll、こういう記法もあるんですね。

なぜこんなことができるのか

Spockのwhereといえばテーブル記法のイメージだったので、こんな書き方もできるんだなー。
でもどうしてできるんだろう?

と思って調べたらドキュメントにかいてありました。
- 本家:http://spockframework.org/spock/docs/1.0/data_driven_testing.html
- 日本語版はこちら:http://spock-framework-reference-documentation-ja.readthedocs.io/ja/latest/data_driven_testing.html#data-pipes

曰く

データテーブルだけが、データ変数へデータを供給する唯一の方法ではありません。データテーブルは、実際には1つ、または複数のデータパイプのシンタックスシュガーです。
(中略)
データパイプは左シフト(<<)演算子を使用し、データ変数とデータプロバイダを接続します。データプロバイダはイテレーションごと1つ使用する、すべての値を保持します。データプロバイダには、Groovyでイテレーションが可能なオブジェクトであれば、どんなオブジェクトでも使用できます。

とのこと。なのでこういった書き方もできるらしい

where:
a << [3, 7, 0]
b << [5, 0, 0]
c << [5, 7, 0]

それどころか、

データプロバイダの値をテキストファイルや、データベース、スプレッドシート、またはランダムに生成したデータといった、外部リソースからデータを取得することもできます

とのことで、例にこんなのがでてました

where:
[a, b, _, c] << sql.rows("select * from maxdata") // 不要なデータは _ に入れると無視されるらしい

まとめ

SpockのUnrollとwhere、まだまだ奥深いので調べてみるともっといろんな場面でつかえそう!

明日のエントリー

再びの@it__sseiさんです。よろしくお願いします!!