JUnit API探訪:@Caterogy アノテーション(テストのカテゴリ化)

@Caterogy アノテーション

@Categories
@Category
@ExcludeCategory
@IncludeCategory

この辺りのアノテーションを用いる事で、テスト実行の際のカテゴリ分けが出来る(実行させたいテストクラスの分類)、というもの。詳細はAPIを参照。


まずはカテゴリ化の為のインタフェースクラスを用意。(※上記エントリ群を見る限りだと、必ずしも作成する必要も無いみたいですね。)

package jp.shinyaa31.junitbc.categories;
public interface FastTests {}
package jp.shinyaa31.junitbc.categories;
public interface SlowTests {}

任意のテストクラスを作成し、テスト単位にカテゴリ付けを行います。

package jp.shinyaa31.junitbc.categories;

import org.junit.Test;
import org.junit.experimental.categories.Category;

public class TestClassA {

    @Test
    public void testA_method1() {
        System.out.println("testA_method1 done.");
    }

    @Category(SlowTests.class) // 【カテゴリ:SlowTests.classを設定】
    @Test
    public void testA_method2() {
        System.out.println("testA_method2 done.");
    }

    @Category(FastTests.class) // 【カテゴリ:FastTests.classを設定】
    @Test
    public void testA_method3() {
        System.out.println("testA_method3 done.");
    }

}

// 【カテゴリ:SlowTests.classを設定】

package jp.shinyaa31.junitbc.categories;

import org.junit.Test;
import org.junit.experimental.categories.Category;

public class TestClassB {

    @Category(FastTests.class) // 【カテゴリ:FastTests.classを設定】
    @Test
    public void testB_method1() {
        System.out.println("testB_method1 done.");
    }

    @Category(SlowTests.class) // 【カテゴリ:SlowTests.classを設定】
    @Test
    public void testB_method2() {
        System.out.println("testB_method2 done.");
    }

    @Category(SlowTests.class) // 【カテゴリ:SlowTests.classを設定】
    @Test
    public void testB_method3() {
        System.out.println("testB_method3 done.");
    }

}

2つのクラスに設定されたカテゴリはこのようになっています。

SlowTests.class testA_method2(), testB_method2(), testB_method3()
FastTests.class testA_method3(), testB_method1()

一括実行用のSuiteクラスを作成します。その際、@IncludeCategoryアノテーションで【SlowTests.class】を指定してみます。

package jp.shinyaa31.junitbc.categories;

import junit.framework.TestSuite;

import org.junit.experimental.categories.Categories;
import org.junit.experimental.categories.Categories.IncludeCategory;
import org.junit.runner.RunWith;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Categories.class)
@SuiteClasses({
    TestClassA.class,
    TestClassB.class
})
@IncludeCategory(SlowTests.class)
public class SlowTestSuite extends TestSuite {

}
  • 実行。結果はこうなりました。
testA_method2 done.
testB_method2 done.
testB_method3 done.