回答:
これを理解するのにしばらく時間がかかり、オンラインリソースはあまりよくありませんでした。だから私は自分の解決策を文書化したかった。
これは、メインおよびテストソースセットに加えて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.runtimeClasspath
2つのファイルセットを結合しています。依存関係の通常の競合解決はありません。同じライブラリの2つのバージョンになる可能性があります。構成を拡張することはそれを助けます。
これは、Gradle 2.x / 3.x用に2016年に作成されたもので、古くなっています。Gradle 4以降のドキュメント化されたソリューションをご覧ください
両方の古い答えを要約するには(両方の世界で最高と最低の実行可能性を得る):
最初に暖かい言葉:
最初に、以下を定義する必要がありますsourceSet
。
sourceSets {
integrationTest
}
次に、sourceSet
from を展開しtest
ます。そのため、派生したクラスパスとして(AND 自体test.runtimeClasspath
からのすべての依存関係を含む)を使用します。test
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
}
(オプション)テスト後に自動実行
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
classesDir
classesDirs
星雲ファセット排除定型プラグイン:
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ディストリビューションにサンプルがあります。