こんにちわ、みけです。
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のスクリプトを書いてみました。
要件
実行したいテストのやり方は次のとおりです。
- 実行時間の速いものだけをテストする
- 実行時間の遅いものだけをテストする
- 実行時間の遅いものを除外したテストを通常のテストとする
準備
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
実行結果は次のとおりとなります。
見事、FastTests
を付与したテスト(7個)だけが実行されたようです。
次に、 2. 実行時間の遅いものだけをテストしてみます。
以下のようにタスクを起動します。
$ gradle slowTest
実行結果は次のようになります。
こちらもSlowTests
を付与したテスト(3個)だけが実行されたようです。
最後に通常のテスト(実行時間の遅いものだけを除外したテスト)を実行してみます。
$ gradle test
実行結果は次のとおりとなります。
82 + 7 = 89個のテストが実行されています。
以上からスクリプトをうまく書けたようです。
もうちょっと細かく設定したい
あと、もう少しだけ、テストの実行パターンを増やしてみましょう。
実行するテストは次のとおりです。
- 実行時間の速いテストと遅いテストだけを実行する
これに対応するスクリプトは以下のとおりになります。
task fastAndSlowTest (type: Test, dependsOn: testClasses) { useJUnit { includeCategories ('sample.categories.SlowTests', 'sample.categories.FastTests') excludeCategories 'sample.categories.NormalTests' } }
これを実行してみます。
gradle fastAndSlowTest
この結果は次のとおりです。
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', ...) } }