Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

このエントリーは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さんです。よろしくお願いします!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away