回答:
これを理解するのにしばらく時間がかかり、オンラインリソースはあまりよくありませんでした。だから私は自分の解決策を文書化したかった。
これは、メインおよびテストソースセットに加えて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
java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' }それだけで再宣言するので関係ありませんsrc/<sourceSetName>/...しsrc/integrationtest/...、ここで:下のトンへの資本Tに変更
compileClasspath += sourceSets.main.runtimeClasspath2つのファイルセットを結合しています。依存関係の通常の競合解決はありません。同じライブラリの2つのバージョンになる可能性があります。構成を拡張することはそれを助けます。
これは、Gradle 2.x / 3.x用に2016年に作成されたもので、古くなっています。Gradle 4以降のドキュメント化されたソリューションをご覧ください
両方の古い答えを要約するには(両方の世界で最高と最低の実行可能性を得る):
最初に暖かい言葉:
最初に、以下を定義する必要がありますsourceSet。
sourceSets {
integrationTest
}次に、sourceSetfrom を展開しtestます。そのため、派生したクラスパスとして(AND 自体test.runtimeClasspathからのすべての依存関係を含む)を使用します。testtestsourceSet
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
}(オプション)テスト後に自動実行
integrationTest.dependsOnテスト
(オプション)依存関係を追加しますcheck(そのため、常に実行されるbuildかcheck実行されます)
tasks.check.dependsOn(tasks.integrationTest)(省略可能) java、resourcesをに追加して、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は、これを処理していないと思われるか、別のを持っています/より複雑/とにかく私には明確な解決策はありません!
compileTestJava
classesDirclassesDirs
星雲ファセット排除定型プラグイン:
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リリースノートを参照してください。
Gradleを初めて使用し、Gradle 6.0.1 JUnit 4.12を使用しています。これが私がこの問題を解決するために思いついたものです。
apply plugin: 'java'
repositories { jcenter() }
dependencies {
testImplementation 'junit:junit:4.12'
}
sourceSets {
main {
java {
srcDirs = ['src']
}
}
test {
java {
srcDirs = ['tests']
}
}
}
メインソースとテストソースを別々に参照されている旨の通知、下1 mainと一つ下test。
testImplementation下の項目dependenciesは、でソースをコンパイルするためにのみ使用されtestます。あなたのメインのコードは、実際のJUnitへの依存性を持っていた場合、あなたはまた、指定しますimplementation下dependencies。
repositoriesこれを機能させるにはセクションを指定する必要がありましたが、それが最善の/唯一の方法であるとは思えません。
java/withIntegrationTests、完全なGradleディストリビューションにサンプルがあります。