プロジェクト 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用です。グルーヴィーにも使えると思います。
This is a simpler solution that doesn't require an intermediate jar file:
dependencies {
...
testCompile project(':aProject').sourceSets.test.output
}
There's more discussion in this question: Multi-project test dependencies with 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")
これは、Gradle のファースト クラス機能としてサポートされるようになりました(5.6 以降)。
java
またはプラグインを含むモジュールには、testFixtures ヘルパーで使用されるヘルパー クラスとリソースを公開するプラグインjava-library
を含めることもできます。アーティファクトと分類子に対するこのアプローチの利点は次のとおりです。java-test-fixtures
例:
:モジュール:1
モジュール/1/build.gradle
plugins {
id "java-library" // or "java"
id "java-test-fixtures"
}
dependencies {
testFixturesImplementation("your.jar:dependency:0.0.1")
}
または、メイン構成のすべての依存関係をlazyly
追加するだけです:implementation
val testFixturesImplementation by configurations.existing
val implementation by configurations.existing
testFixturesImplementation.get().extendsFrom(implementation.get())
modul /one/src/ testFixtures /java/com/example/Helper.java
package com.example;
public class Helper {}
:モジュール:その他
モジュール/その他/build.gradle
plugins {
id "java" // or "java-library"
}
dependencies {
testImplementation(testFixtures(project(":modul:one")))
}
modul/other/src/test/java/com/example/other/SomeTest.java
package com.example.other;
import com.example.Helper;
public class SomeTest {
@Test void f() {
new Helper(); // used from :modul:one's testFixtures
}
}
詳細については、ドキュメントを参照してください: https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures
上記の解決策は機能しますが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.gradlearchives
のセクションにコマンドを追加する必要があります。artifacts
task testsJar(type: Jar, dependsOn: testClasses) {
classifier = 'tests'
from sourceSets.test.output
}
configurations {
tests
}
artifacts {
tests testsJar
archives testsJar
}
jar.finalizedBy(testsJar)
ProjectA の成果物が成果物に公開されると、-tests jar が含まれます。この-tests jar は、ProjectB の testCompile 依存関係として追加できます (上記を参照)。
最新のgradleバージョン(私は現在2.14.1を使用しています)のAndroidの場合、プロジェクトAからすべてのテスト依存関係を取得するには、プロジェクトBに以下を追加するだけです.
dependencies {
androidTestComplie project(path: ':ProjectA')
}
Gradleの場合1.5
task testJar(type: Jar, dependsOn: testClasses) {
from sourceSets.test.java
classifier "tests"
}