Gradleビルド(バージョン1.0)に統合テストを追加したいと思います。Webアプリをローカルホストにデプロイする必要があるため、通常のテストとは別に実行する必要があります(そのWebアプリをテストします)。テストでは、メインのソースセットで定義されたクラスを使用できる必要があります。どうすればこれを実現できますか?
8 に答える
2021年の更新:
8年で多くの変化がありました。Gradleは引き続き優れたツールです。これで、統合テストの構成専用のセクション全体がドキュメントにあります。今すぐドキュメントを読むことをお勧めします。
元の回答:
これは私が理解するのに時間がかかり、オンラインリソースは素晴らしいものではありませんでした。だから私は自分の解決策を文書化したかった。
これは、メインおよびテストソースセットに加えて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
}
使用してテスト済み: Gradle1.4およびGradle1.6
これはかつて2016年にGradle2.x/ 3.x用に作成されたもので、はるかに時代遅れです。Gradle4以降で文書化されたソリューションをご覧ください
両方の古い答えを要約するには(両方の世界で最高の実行可能性と最小の実行可能性を取得します):
最初にいくつかの暖かい言葉:
まず、
sourceSet
:を定義する必要があります。sourceSets { integrationTest }
次に、
sourceSet
fromを展開します。そのため、派生のクラスパスとして( AND自体からのすべての依存関係を含む)test
を使用します。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のサンプルコードはこれを処理していないか、異なるものがあります/より複雑/私にとってはとにかく明確な解決策はありません!
nebula-facetプラグインは、定型文を排除します。
apply plugin: 'nebula.facet'
facets {
integrationTest {
parentSourceSet = 'test'
}
}
特に統合テストの場合、これもあなたのために行われます。適用するだけです。
apply plugin: 'nebula.integtest'
それぞれのGradleプラグインポータルリンクは次のとおりです。
使用している場合
- Gradle 5.xの詳細については、ドキュメントセクション「Javaのテスト>統合テストの構成
例14および15」を参照してください(GroovyとKotlin DSLの両方、どちらかお好みで)
- alt: 2の「現在の」Gradleドキュメントリンクですが、将来延期される可能性があります。例が変更されたかどうかを確認する必要があります)
- Gradle 4については、@Spinaが2012年に投稿したものに近い古代バージョン3をご覧ください。
IntelliJにカスタムソースセットをテストソースルートとして認識させるには:
plugin {
idea
}
idea {
module {
testSourceDirs = testSourceDirs + sourceSets["intTest"].allJava.srcDirs
testResourceDirs = testResourceDirs + sourceSets["intTest"].resources.srcDirs
}
}
Gradle4.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言語ごとに個別の出力ディレクトリを使用するようになりましたが、このビルドでは、ソースセットのすべてのクラスに対して単一のディレクトリを想定しています。この動作は非推奨になり、Gradle5.0で削除される予定です。
この警告を取り除くには、sourceSets.integrationTest.output.classesDirs
代わりにに切り替えてください。詳細については、Gradle4.0リリースノートを参照してください。
この質問が出された2012年にはドキュメントはあまり良くありませんでしたが、2020年以降にこれを読んでいる人のために:統合テスト用のソースセットを追加する方法についてのセクション全体がドキュメントにあります。ここでコードスニペットをコピーして貼り付けて壁に頭をぶつけて、2012年から2016年の回答がうまくいかない理由を理解するのではなく、実際に読んでください。
答えはおそらく単純ですが、あなたが思っているよりも微妙なニュアンスがあり、必要な正確なコードは、私が必要とするコードとは異なる可能性があります。たとえば、統合テストで単体テストと同じ依存関係を使用しますか?
Gradle 6.0.1 JUnit 4.12を使用して、Gradleを初めて使用します。これが私がこの問題を解決するために思いついたものです。
apply plugin: 'java'
repositories { jcenter() }
dependencies {
testImplementation 'junit:junit:4.12'
}
sourceSets {
main {
java {
srcDirs = ['src']
}
}
test {
java {
srcDirs = ['tests']
}
}
}
メインソースとテストソースが別々に参照されていることに注意してください。1つはアンダーmain
、もう1つはアンダーtest
です。
下のtestImplementation
項目dependencies
は、のソースをコンパイルするためにのみ使用されtest
ます。メインコードが実際にJUnitに依存している場合は、のimplementation
下にも指定しますdependencies
。
これを機能させるにはセクションを指定する必要がありましたrepositories
が、それが最善/唯一の方法ではないかと思います。