プロジェクトAとプロジェクトBの2つのプロジェクトがあります。どちらもGroovyで記述されており、ビルドシステムとしてgradleを使用しています。
プロジェクトAにはプロジェクトBが必要です。これは、コンパイルコードとテストコードの両方に当てはまります。
プロジェクトAのテストクラスがプロジェクトBのテストクラスにアクセスできるように構成するにはどうすればよいですか?
プロジェクトAとプロジェクトBの2つのプロジェクトがあります。どちらもGroovyで記述されており、ビルドシステムとしてgradleを使用しています。
プロジェクトAにはプロジェクトBが必要です。これは、コンパイルコードとテストコードの両方に当てはまります。
プロジェクトAのテストクラスがプロジェクトBのテストクラスにアクセスできるように構成するにはどうすればよいですか?
回答:
'tests'構成を介してテストクラスを公開し、その構成に対するtestCompile依存関係を定義できます。
私はすべてのJavaプロジェクトにこのブロックを持っています。これはすべてのテストコードをjarします:
task testJar(type: Jar, dependsOn: testClasses) {
baseName = "test-${project.archivesBaseName}"
from sourceSets.test.output
}
configurations {
tests
}
artifacts {
tests testJar
}
次に、使用するプロジェクト間でアクセスしたいテストコードがある場合
dependencies {
testCompile project(path: ':aProject', configuration: 'tests')
}
これはJava用です。グルーヴィーにも使えると思います。
configurations { tests { extendsFrom testRuntime } }
Could not get unknown property 'testClasses'
これは、中間のjarファイルを必要としないより単純なソリューションです。
dependencies {
...
testCompile project(':aProject').sourceSets.test.output
}
この質問にはさらに議論があります:gradleを使用したマルチプロジェクトテストの依存関係
これは私のために働きます(Java)
// use test classes from spring-common as dependency to tests of current module
testCompile files(this.project(':spring-common').sourceSets.test.output)
testCompile files(this.project(':spring-common').sourceSets.test.runtimeClasspath)
// filter dublicated dependency for IDEA export
def isClassesDependency(module) {
(module instanceof org.gradle.plugins.ide.idea.model.ModuleLibrary) && module.classes.iterator()[0].url.toString().contains(rootProject.name)
}
idea {
module {
iml.whenMerged { module ->
module.dependencies.removeAll(module.dependencies.grep{isClassesDependency(it)})
module.dependencies*.exported = true
}
}
}
.....
// and somewhere to include test classes
testRuntime project(":spring-common")
上記のソリューションは機能しますが、最新バージョン1.0-rc3
のGradleでは機能しません。
task testJar(type: Jar, dependsOn: testClasses) {
baseName = "test-${project.archivesBaseName}"
// in the latest version of Gradle 1.0-rc3
// sourceSets.test.classes no longer works
// It has been replaced with
// sourceSets.test.output
from sourceSets.test.output
}
ProjectAにProjectBで使用するテストコードが含まれていて、ProjectBがアーティファクトを使用してテストコードを含める場合、ProjectBのbuild.gradleは次のようになります。
dependencies {
testCompile("com.example:projecta:1.0.0-SNAPSHOT:tests")
}
次に、ProjectAのbuild.gradleのセクションにarchives
コマンドを追加する必要がありますartifacts
。
task testsJar(type: Jar, dependsOn: testClasses) {
classifier = 'tests'
from sourceSets.test.output
}
configurations {
tests
}
artifacts {
tests testsJar
archives testsJar
}
jar.finalizedBy(testsJar)
これで、ProjectAのアーティファクトがアーティファクトに公開されると、-testsjarが含まれます。この-testsjarは、ProjectBのtestCompile依存関係として追加できます(上記を参照)。
最新のgradleバージョン(私は現在2.14.1を使用しています)のAndroidの場合、プロジェクトAからすべてのテスト依存関係を取得するには、プロジェクトBに以下を追加する必要があります。
dependencies {
androidTestComplie project(path: ':ProjectA')
}