小ネタ。JUnitにて./gradlew test
で実行するテスト(Unitテスト)とは別に複数の要素が絡む総合テスト(Integration Test)を動かしたいことがあります。今回はその実装方法について。
結論
早速結論です。build.gradle
に以下のように書けば良いです。
sourceSets { integrationTest { java { compileClasspath += main.output + test.output runtimeClasspath += main.output + test.output srcDir file('src/intTest/java') } resources.srcDir file('src/intTest/resources') } } configurations { integrationTestImplementation.extendsFrom testImplementation integrationTestRuntime.extendsFrom testRuntime } task integrationTest(type: Test) { useJUnitPlatform() testClassesDirs = sourceSets.integrationTest.output.classesDirs // DirではなくDirsにする classpath = sourceSets.integrationTest.runtimeClasspath outputs.upToDateWhen { false } }
あとはsrc/intTest/java
以下にIntegration Test用のテストプログラムを書き、
./gradlew clean integrationTest
を実行すればOKです。
調査の流れ
実装するために調査したところ、以下のブログがヒットしました。
上記のブログはGroovyの例なのですが、JavaでもsourceSets
を変えれば良いかなと思って始めました。こんな感じに書きました。
sourceSets { integrationTest { java { compileClasspath += main.output + test.output runtimeClasspath += main.output + test.output srcDir file('src/intTest/java') } resources.srcDir file('src/intTest/resources') } }
テスト用のクラスパスを通すために以下の記述を追加。
configurations { integrationTestImplementation.extendsFrom testImplementation integrationTestRuntime.extendsFrom testRuntime }
動かしたときにパッケージorg.junit.jupiter.apiは存在しません
みたいなエラーメッセージが出たら、上記の設定を見直すか、build.gradle
のdependencies
に以下の記述があることを確認します。
dependencies { // 他のものは省略 testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.8.1' }
最後にtaskの定義です。
task integrationTest(type: Test) { useJUnitPlatform() testClassesDirs = sourceSets.integrationTest.output.classesDirs // DirではなくDirsにする classpath = sourceSets.integrationTest.runtimeClasspath outputs.upToDateWhen { false } }
useJUnitPlatform()
がないと./gradlew clean integrationTest
を実行してもテストが実行されず、しばらくハマりました。
参考
理解を深めるための各種参考資料。
- SourceSet - Gradle DSL Version 7.4
- sourceSetの定義用DSL
- Configuration - Gradle DSL Version 7.4
- configurationsの定義用DSL
- Task - Gradle DSL Version 7.4
- taskの定義用DSL
- Test - Gradle DSL Version 7.4
- taskの定義の時に指定する
Test
typeの各種設定項目
- taskの定義の時に指定する