JUnit API探訪:@Caterogy アノテーション(テストのカテゴリ化)
@Caterogy アノテーション
@Categories @Category @ExcludeCategory @IncludeCategory
この辺りのアノテーションを用いる事で、テスト実行の際のカテゴリ分けが出来る(実行させたいテストクラスの分類)、というもの。詳細はAPIを参照。
まずはカテゴリ化の為のインタフェースクラスを用意。(※上記エントリ群を見る限りだと、必ずしも作成する必要も無いみたいですね。)
- FastTests.java
package jp.shinyaa31.junitbc.categories; public interface FastTests {}
- SlowTests.java
package jp.shinyaa31.junitbc.categories; public interface SlowTests {}
任意のテストクラスを作成し、テスト単位にカテゴリ付けを行います。
- TestClassA.java
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を設定】
- TestClassA.java
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.