Gradleビルド(バージョン1.0)に統合テストを追加したい。 Webアプリケーションをlocalhostにデプロイする必要があるため、通常のテストとは別に実行する必要があります(Webアプリケーションをテストします)。テストでは、メインのソースセットで定義されたクラスを使用できる必要があります。どうすればこれを実現できますか?
これを理解するのに時間がかかり、オンラインリソースはあまり良くありませんでした。そこで、自分の解決策を文書化したかったのです。
これは、メインおよびテストソースセットに加えてintTestソースセットを持つ単純なgradleビルドスクリプトです。
apply plugin: "Java"
sourceSets {
// Note that just declaring this sourceset creates two configurations.
intTest {
Java {
compileClasspath += main.output
runtimeClasspath += main.output
}
}
}
configurations {
intTestCompile.extendsFrom testCompile
intTestRuntime.extendsFrom testRuntime
}
task intTest(type:Test){
description = "Run integration tests (located in src/intTest/...)."
testClassesDir = project.sourceSets.intTest.output.classesDir
classpath = project.sourceSets.intTest.runtimeClasspath
}
configurations{ }
を使用せずにこれを達成した方法を次に示します。
apply plugin: 'Java'
sourceCompatibility = JavaVersion.VERSION_1_6
sourceSets {
integrationTest {
Java {
srcDir 'src/integrationtest/Java'
}
resources {
srcDir 'src/integrationtest/resources'
}
compileClasspath += sourceSets.main.runtimeClasspath
}
}
task integrationTest(type: Test) {
description = "Runs Integration Tests"
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath += sourceSets.integrationTest.runtimeClasspath
}
以下を使用してテスト済み Gradle 1.4およびGradle 1.6
これは2016年にGradle 2.x/3.x用に一度書かれたもので、はるかに時代遅れです!!ご覧ください Gradle 4以降で文書化されたソリューションで
両方の古い答えを要約するには(両方の世界で最良と最小の実行可能性を得る):
最初にいくつかの暖かい言葉:
まず、sourceSet
を定義する必要があります。
sourceSets {
integrationTest
}
次に、sourceSet
からtest
を展開します。そのため、派生したtest
のクラスパスとしてtest.runtimeClasspath
(test
およびsourceSet
自体からのすべての依存関係を含む)を使用します。
sourceSets {
integrationTest {
compileClasspath += sourceSets.test.runtimeClasspath
runtimeClasspath += sourceSets.test.runtimeClasspath // ***)
}
}
sourceSets.integrationTest.runtimeClasspath
の再宣言/拡張が必要ですが、runtimeClasspath
は常にoutput + runtimeSourceSet
を展開するので、関係ないはずです、取得しないでください統合テストを実行するための専用タスクを定義します。
task integrationTest(type: Test) {
}
integrationTest
テストクラスとクラスパスの使用を構成します。 Java
プラグインのデフォルトでは、test
sourceSet
を使用します
task integrationTest(type: Test) {
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
(オプション)auto run aftertest
integrationTest.dependsOn test
(オプション)check
から依存関係を追加します(したがって、build
またはcheck
が実行されるときに常に実行されます)
tasks.check.dependsOn(tasks.integrationTest)
(オプション)Java、リソースをsourceSet
に追加して、自動検出をサポートし、IDEでこれらの「部分」を作成します。つまり、IntelliJ IDEAは、変数が存在しない場合、各セットのsourceSet
ディレクトリJavaおよびリソースを自動的に作成します。
sourceSets {
integrationTest {
Java
resources
}
}
tl; dr
apply plugin: 'Java'
// apply the runtimeClasspath from "test" sourceSet to the new one
// to include any needed assets: test, main, test-dependencies and main-dependencies
sourceSets {
integrationTest {
// not necessary but Nice for IDEa's
Java
resources
compileClasspath += sourceSets.test.runtimeClasspath
// somehow this redeclaration is needed, but should be irrelevant
// since runtimeClasspath always expands compileClasspath
runtimeClasspath += sourceSets.test.runtimeClasspath
}
}
// define custom test task for running integration tests
task integrationTest(type: Test) {
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
tasks.integrationTest.dependsOn(tasks.test)
参照:
残念ながら、 github.com/gradle/gradle/subprojects/docs/src/samples/Java/customizedLayout/build.gradle または …/ gradle /…/ withIntegrationTests/buildのサンプルコード.gradle はこれを処理していないようであるか、異なる/より複雑です/とにかく明確な解決策はありません!
nebula-facet プラグインは定型文を削除します:
apply plugin: 'nebula.facet'
facets {
integrationTest {
parentSourceSet = 'test'
}
}
特に統合テストの場合、 これはあなたのために行われます でさえ、単に適用します:
apply plugin: 'nebula.integtest'
それぞれのGradleプラグインポータルリンクは次のとおりです。
使用している場合
IntelliJにカスタムソースセットをテストソースルートとして認識させるには:
plugin {
idea
}
idea {
module {
testSourceDirs = testSourceDirs + sourceSets["intTest"].allJava.srcDirs
testResourceDirs = testResourceDirs + sourceSets["intTest"].resources.srcDirs
}
}
Gradle 4.0の時点で、私にとって有効なものは次のとおりです。
sourceSets {
integrationTest {
compileClasspath += sourceSets.test.compileClasspath
runtimeClasspath += sourceSets.test.runtimeClasspath
}
}
task integrationTest(type: Test) {
description = "Runs the integration tests."
group = 'verification'
testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath
}
バージョン4.0の時点で、Gradleはソースセット内の言語ごとに個別のクラスディレクトリを使用するようになりました。したがって、ビルドスクリプトでsourceSets.integrationTest.output.classesDir
を使用している場合、次の非推奨警告が表示されます。
Gradleは、JVM言語ごとに個別の出力ディレクトリを使用するようになりましたが、このビルドでは、ソースセットのすべてのクラスに対して単一のディレクトリを想定しています。この動作は廃止され、Gradle 5.0で削除される予定です。
この警告を取り除くには、代わりにsourceSets.integrationTest.output.classesDirs
に切り替えてください。詳細については、 Gradle 4.0リリースノート を参照してください。