Gradle 테스트 종속성


81

두 개의 프로젝트, 프로젝트 A와 프로젝트 B가 있습니다. 둘 다 그루비로 작성되었으며 빌드 시스템으로 gradle을 사용합니다.

프로젝트 A에는 프로젝트 B가 필요합니다. 이는 컴파일 및 테스트 코드 모두에 적용됩니다.

프로젝트 A의 테스트 클래스가 프로젝트 B의 테스트 클래스에 액세스 할 수 있도록 구성하려면 어떻게해야합니까?


답변:


106

'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 용입니다. 나는 그것이 그루비에게도 효과가 있다고 가정하고 있습니다.


1
내가 당신의 질문을 이해한다면 예, 내가 아는 한 테스트 클래스를 컴파일하여 종속성으로 사용해야합니다.
David Resnick

1
이후 버전의 Gradle (1.3을 사용하고 있음)의 경우 "from sourceSets.test.classes"줄은 "from sourceSets.test.output"이어야합니다
Ben

2
테스트의 모든 전이 종속성을 가져 오기 위해 다음을 추가했습니다. configurations { tests { extendsFrom testRuntime } }
Ramon

3
androidTest 클래스에 대해 동일한 것을 달성하는 방법은 무엇입니까?
X-HuMan

3
나를 위해 일하지 않고 항상- Could not get unknown property 'testClasses'
pavle

17

이것은 중간 jar 파일이 필요하지 않은 더 간단한 솔루션입니다.

dependencies {
  ...
  testCompile project(':aProject').sourceSets.test.output
}

이 질문에는 더 많은 토론이 있습니다. gradle을 사용한 다중 프로젝트 테스트 종속성


7
이로 인해 IDE 통합이 중단되고 전 이적 종속성이 누락됩니다. 또한 항상 나쁜 습관 인 프로젝트의 캡슐화를 깨뜨립니다.
Stefan Oehme 2017

8

이것은 나를 위해 작동합니다 (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")

5

위의 솔루션은 작동하지만 최신 버전 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
     }

5

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 종속성으로 추가 될 수 있습니다 (위에 표시된대로).


0

Gradle 용 1.5

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

0

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

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.