うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

Spockの知られざる機能

僕だけが知らなかったのかもしれません。。。

Spockではテストメソッドに@Unrollとつけると、パラメタライズがテストメソッド名に反映されます。これとっても見やすくてよいです。

こんな感じ。。。

class WhenWatchingUstream extends Specification {

    @Unroll
    def "should show #channel when click #channel window"(){
        expect:
        // click channel
        where:
        channel << ["Cooking", "Music", "Animation"]
    }

}

にしておくと

f:id:kyon_mm:20140807214827p:plain

ところがです。テストメソッドが大量になってくると、テストメソッドのたびに@Unrollとつけるのが鬱陶しくなります。JUnit4の@Testから逃れたと思ったら、今度は@Unrollがおってくる><

Unrollの定義をみるとだ

ところでUnrollの定義を見ると次のようになっています。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@ExtensionAnnotation(UnrollExtension.class)
public @interface Unroll {
  String value() default "";
}

つまり、クラス宣言につけられると。つまり、クラスにつけておけばそのクラスのテストメソッドは全てUnrollしたことと一緒になります!!!!(今日初めて知った

つまりこんな感じにできます。

@Unroll
class WhenWatchingUstream extends Specification {

    def "should show #channel when click #channel window"(){
        expect:
        // click channel
        where:
        channel << ["Cooking", "Music", "Animation"]
    }

    def "should show #sns message when send #sns message"(){
        expect:
        // send sns message
        where:
        sns << ["Facebook", "Twitter"]
    }

    def "Not Parameterize Feature"(){
        when:
        new Object()
        then:
        assert true
    }
}

f:id:kyon_mm:20140807215837p:plain

まとめ

@Unrollはクラス宣言につけましょう。