[testing] Gradle 테스트 종속성

두 개의 프로젝트, 프로젝트 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 용입니다. 나는 그것이 그루비에게도 효과가 있다고 가정하고 있습니다.


답변

이것은 중간 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 용 1.5

task testJar(type: Jar, dependsOn: testClasses) {
    from sourceSets.test.java
    classifier "tests"
}


답변

최신 gradle 버전의 Android (현재 2.14.1에 있음)의 경우 프로젝트 A에서 모든 테스트 종속성을 가져 오려면 프로젝트 B에 아래를 추가하기 만하면됩니다.

dependencies {
  androidTestComplie project(path: ':ProjectA')
}