任意のフィーチャーメソッドだけを実行する

Spock でも JUnit4 のCategory と同じように 任意のテスト (フィーチャー) だけを実行することや逆にスキップすることができます。

方法は簡単です。
あらかじめ、Specification (テストクラス) もしくは フィーチャー (テストメソッド) に 好きなだけアノテーションをつけましょう。
あとは 設定ファイルに 実行したい (もしくはスキップしたい) アノテーションを 指定するだけです。

では、まずは アノテーションを作成しましょう。
今回は Java で作成しましたが、もちろん Groovy で作成しても OK です。

package com.bluepapa32;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@interface Fast {}
package com.bluepapa32;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@interface Slow {}
package com.bluepapa32;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@interface Server {}

次に 作成したアノテーションを Specification (テストクラス) もしくは フィーチャー (テストメソッド) に付けましょう。

@Server
class HelloSpec extends Specification {

     @Fast
     def "a fast method"() {
          expect: true
     }

     @Slow
     def "a slow method"() {
          expect: true
     }

     def "a neither fast nor slow method"() {
          expect: true
     }
}

後は 実行したいアノテーションとスキップしたいアノテーションを 次のように設定ファイルに設定するだけです。

import com.bluepapa32.*

runner {
    include Server        // 実行したいもの
    exclude Fast, Slow    // スキップしたいもの
}
上記は @Server が付いた フィーチャーのうち @Fast と @Slow が付いていないものだけを実行するように設定しています。
今回の場合だと "a neither fast nor slow method" だけが実行されることになります。

上記の設定は

  • システムプロパティ spock.configuration に設定したファイル (例: -Dspock.configuration=MySpockConfig.groovy)
  • クラスパス上の SpockConfig.groovy
  • ${user.home}/.spock/SpockConfig.groovy
のいずれかで設定できます。

もし、Eclipse を利用しているのであれば 以下のように設定ファイルを作成しましょう。
まず、Specification クラス用のソースフォルダとは別のソースフォルダ (例えば src/test/resources) を作成します。
次に、その直下に SpockConfig.groovy を上記の内容で作成します。
最後に Groovy の設定の 『Compiler』 の 『Enable script foler support』 にチェックをいれます。
これは src/test/resources 配下の groovy ファイルが class ファイルにコンパイルされないようにするためです。
と言うのも SpockConfig.groovy ファイルは設定ファイルですので groovy ファイルのままクラスパス上にコピーされる必要があるからです。



ちなみに 設定ファイルには アノテーションの他にも実行したい Specification を直接指定することもできます。
上記の HelloSpec の Slow 以外のフィーチャーメソッドだけを実行したい場合は以下のように設定します。

import com.bluepapa32.*

runner {
    include HelloSpec
    exclude Slow
}