두 개의 프로젝트, 프로젝트 A와 프로젝트 B가 있습니다. 둘 다 그루비로 작성되었으며 빌드 시스템으로 gradle을 사용합니다.
프로젝트 A에는 프로젝트 B가 필요합니다. 이는 컴파일 및 테스트 코드 모두에 적용됩니다.
프로젝트 A의 테스트 클래스가 프로젝트 B의 테스트 클래스에 액세스 할 수 있도록 구성하려면 어떻게해야합니까?
두 개의 프로젝트, 프로젝트 A와 프로젝트 B가 있습니다. 둘 다 그루비로 작성되었으며 빌드 시스템으로 gradle을 사용합니다.
프로젝트 A에는 프로젝트 B가 필요합니다. 이는 컴파일 및 테스트 코드 모두에 적용됩니다.
프로젝트 A의 테스트 클래스가 프로젝트 B의 테스트 클래스에 액세스 할 수 있도록 구성하려면 어떻게해야합니까?
답변:
'tests'구성을 통해 테스트 클래스를 노출 한 다음 해당 구성에 대한 testCompile 종속성을 정의 할 수 있습니다.
모든 테스트 코드가 포함 된 모든 자바 프로젝트에 대해이 블록이 있습니다.
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의 아티팩트가 아티 팩토리에 게시되면 -tests jar 가 포함됩니다 . 이 -tests jar는 ProjectB에 대한 testCompile 종속성으로 추가 될 수 있습니다 (위에 표시된대로).
최신 gradle 버전의 Android (현재 2.14.1에 있음)의 경우 프로젝트 A에서 모든 테스트 종속성을 가져 오려면 프로젝트 B에 아래를 추가하기 만하면됩니다.
dependencies {
androidTestComplie project(path: ':ProjectA')
}