mike-neckのブログ

Java or Groovy or Swift or Golang

gradleでJUnitのCategoryテストを実行する - 2014年版

こんにちわ、みけです。

Categoryテストをgradleで実施する方法を、

記載しています。

例によってだらだら書いているので、

結果だけ知りたい人は、まとめまで読み飛ばして下さい。

Categoryテスト

いまさらですが、渡辺修司さんの『JUnit実践入門』を読んでいるわけですが、

Categoryテストの実行方法についてmavenでの解説があったので、

そういえば、gradleでCategoryテストってどうするんだっけ?と思って

ちょっと調べてみました。

「gradle Category test」でググッた結果

はい、@irofさんの

JUnitのCategoryさんとGradleでの実行(1.6)

が出てきました。

というわけで、各自これを読んでおいて下さい。

いやいや、そうでなくって…

僕が気になっていたのは、

gradleのtestタスクではすべてのテストを流したいけど、各Categoryのテストもgradleで実行したい

ということなんです。

もう少し細かくCategoryテストを実行する

もう少しCategoryを使ってテストを実行するにはどうすればよいか、

build.gradleのスクリプトを書いてみました。

要件

実行したいテストのやり方は次のとおりです。

  1. 実行時間の速いものだけをテストする
  2. 実行時間の遅いものだけをテストする
  3. 実行時間の遅いものを除外したテストを通常のテストとする

準備

Categoryを下記の通り設定します。

  • sample.category.FastTests → 実行時間の速いテスト
  • sample.category.NormalTests → 実行時間がふつうのテスト
  • sample.category.SlowTests → 実行時間の遅いテスト

上記のように設定したCategoryを各テストに付与していきます。

以下のテストクラスには

  • sample.category.FastTests
  • sample.category.SlowTests

を付与します。

public class GradleCategoriesTest {

    @Category(FastTests.class)
    @Test
    public void fast1 () { assertThat(1, is(1));}

    @Category(FastTests.class)
    @Test
    public void fast2 () { assertThat(2, is(2));}

    /* 中略 */

    @Category(FastTests.class)
    @Test
    public void fast7 () { assertThat(7, is(7));}

    @Category(SlowTests.class)
    @Test
    public void slow1 () { assertThat(1, is(1));}

    /* 中略 */

    @Category(SlowTests.class)
    @Test
    public void slow3 () { assertThat(3, is(3));}
}

FastTestsは7個、SlowTestsは3個です。

その他82個あるテストにはsample.category.NormalTestsを付与します。

スクリプト

build.gradleには次のように記述します。

/* 一部略 */

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.2'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

/* 1. 実行時間の速いものだけをテストする */
task fastTest(type: Test, dependsOn: testClasses) {
    useJUnit {
        includeCategories 'sample.categories.FastTests'
        excludeCategories 'sample.categories.SlowTests'
    }
}

/* 2. 実行時間の遅いものだけをテストする */
task slowTest(type: Test, dependsOn: testClasses) {
    useJUnit {
        includeCategories 'sample.categories.SlowTests'
        excludeCategories 'sample.categories.FastTests'
    }
}

/* 3. 実行時間の遅いものを除外したテストを通常のテストとする */
test {
    useJUnit {
        excludeCategories 'sample.categories.SlowTests'
    }
}

/* 以下略 */

テストの実行

では早速、1. 実行時間の速いものだけをテストしてみます。

上記のスクリプトではfastTestというタスクを作成していますので、

これを実行します。

$ gradle fastTest

実行結果は次のとおりとなります。

f:id:mike_neck:20140708013103p:plain

見事、FastTestsを付与したテスト(7個)だけが実行されたようです。


次に、 2. 実行時間の遅いものだけをテストしてみます。

以下のようにタスクを起動します。

$ gradle slowTest

実行結果は次のようになります。

f:id:mike_neck:20140708012938p:plain

こちらもSlowTestsを付与したテスト(3個)だけが実行されたようです。


最後に通常のテスト(実行時間の遅いものだけを除外したテスト)を実行してみます。

$ gradle test

実行結果は次のとおりとなります。

f:id:mike_neck:20140708013906p:plain

82 + 7 = 89個のテストが実行されています。

以上からスクリプトをうまく書けたようです。


もうちょっと細かく設定したい

あと、もう少しだけ、テストの実行パターンを増やしてみましょう。

実行するテストは次のとおりです。

  • 実行時間の速いテストと遅いテストだけを実行する

これに対応するスクリプトは以下のとおりになります。

task fastAndSlowTest (type: Test, dependsOn: testClasses) {
    useJUnit {
        includeCategories ('sample.categories.SlowTests', 'sample.categories.FastTests')
        excludeCategories 'sample.categories.NormalTests'
    }
}

これを実行してみます。

gradle fastAndSlowTest

この結果は次のとおりです。

f:id:mike_neck:20140708014609p:plain

FastTestsの7個とSlowTestsの3個の計、10個のテストが実施されています。

という感じで、最初やりたかったテストの実行パターンがすべてできたようです。


まとめ

Categoryごとにテストをgradleから実行する場合の記述方法は次のとおりです。

task someTest(type: Test, dependsOn: testClasses) {
    useJUnit {
        includeCategories ('your.namespace.CategoryA', 'your.namespace.CategoryB', ...)
        excludeCategories ('your.namespace.ExCategoryA', 'your.namespace.ExCategoryB', ...)
    }
}