[build] gradle을 사용한 다중 프로젝트 테스트 종속성

다중 프로젝트 구성이 있고 gradle을 사용하고 싶습니다.

내 프로젝트는 다음과 같습니다

  • 프로젝트 A

    • -> src/main/java
    • -> src/test/java
  • 프로젝트 B

    • -> src/main/java( 프로젝트 Asrc/main/java 에 따라 다름 )
    • -> src/test/java( 프로젝트 Asrc/test/java 에 따라 다름 )

프로젝트 B build.gradle 파일은 다음과 같습니다.

apply plugin: 'java'
dependencies {
  compile project(':ProjectA')
}

작업 compileJava은 훌륭하지만 프로젝트 AcompileTestJava 의 테스트 파일을 컴파일하지는 않습니다 .



답변

더 이상 사용되지 않음-Gradle 5.6 이상에서는 이 답변을 사용 하십시오 .

프로젝트 B 에서는 testCompile종속성 을 추가하기 만하면됩니다 .

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

Gradle 1.7로 테스트되었습니다.


답변

간단한 방법은 ProjectB에 명시적인 작업 종속성을 추가하는 것입니다.

compileTestJava.dependsOn tasks.getByPath(':ProjectA:testClasses')

어려운 (그러나 더 명확한) 방법은 ProjectA에 대한 추가 아티팩트 구성을 작성하는 것입니다.

task myTestsJar(type: Jar) {
  // pack whatever you need...
}

configurations {
  testArtifacts
}

artifacts {
   testArtifacts myTestsJar
}

testCompileProjectB 에 대한 종속성을 추가하십시오.

apply plugin: 'java'
dependencies {
  compile project(':ProjectA')
  testCompile project(path: ':ProjectA', configuration: 'testArtifacts')
}


답변

이것은 이제 Gradle의 최고급 기능으로 지원됩니다.플러그인 이 java있거나 java-library포함 된 모듈 에는 java-test-fixtures헬퍼와 함께 사용할 헬퍼 클래스 및 자원을 표시 하는 플러그인 도 포함될 수 있습니다 testFixtures. 아티팩트 및 분류 자에 대한이 방법의 이점은 다음과 같습니다.

  • 적절한 의존성 관리 (구현 / api)
  • 테스트 코드와의 분리 (별도의 소스 세트)
  • 유틸리티 만 노출하기 위해 테스트 클래스를 필터링 할 필요가 없습니다.
  • Gradle에 의해 유지

:modul:one

modul / one / build.gradle

plugins {
  id "java-library" // or "java"
  id "java-test-fixtures"
}

modul / one / src / testFixtures / java / com / example / Helper.java

package com.example;
public class Helper {}

:modul:other

모듈 / 기타 /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

5.6에서 추가되었습니다 :
https://docs.gradle.org/5.6/release-notes.html#test-fixtures-for-java-projects


답변

나는 최근 에이 문제를 직접 겪었으며 사람은 이것이 답을 찾기가 어려운 문제라는 것입니다.

실수는 프로젝트가 기본 아티팩트 및 종속성을 내보내는 것과 같은 방식으로 테스트 요소를 내 보내야한다는 생각입니다.

개인적으로 더 많은 성공을 거둔 것은 Gradle에서 새 프로젝트를 만드는 것이 었습니다. 당신의 예에서, 나는 그것을 이름을 지정할 것입니다

프로젝트 A_Test-> src / main / java

현재 프로젝트 A / src / test / java에있는 파일을 src / main / java에 넣을 것입니다. 프로젝트 A의 모든 테스트 컴파일 종속성을 작성하십시오. 프로젝트 A_Test의 컴파일 종속성.

그런 다음 프로젝트 A_Test를 프로젝트 B의 testCompile 종속성으로 만듭니다.

두 프로젝트의 저자 관점에서 볼 때 논리적이지 않지만 junit 및 scalatest (및 다른 프로젝트와 같은 프로젝트에 대해 생각할 때 많은 의미가 있다고 생각합니다.이 프레임 워크는 테스트와 관련이 있지만) 자체 프레임 워크 내에서 “테스트”대상의 일부로 간주되지 않습니다. 다른 프로젝트가 테스트 구성 내에서 사용하게되는 주요 아티팩트를 생성합니다.

여기에 나열된 다른 답변을 시도해도 개인적으로 효과가 없었지만 (Gradle 1.9 사용) 여기서 설명하는 패턴이 더 깨끗한 솔루션이라는 것을 알았습니다.


답변

나는 그것이 오래된 질문이라는 것을 알고 있지만 방금 같은 문제가 있었고 무슨 일이 일어나고 있는지 알아내는 데 시간을 보냈습니다. Gradle 1.9를 사용하고 있습니다. 모든 변경 사항은 ProjectB에 있어야합니다.build.gradle

ProjectB 테스트에서 ProjectA의 테스트 클래스를 사용하려면

testCompile files(project(':ProjectA').sourceSets.test.output.classesDir)

sourceSetsProjectA에서 속성을 사용할 수 있도록하려면 :

evaluationDependsOn(':ProjectA')

ProjectB를 컴파일 할 때 ProjectA의 테스트 클래스가 실제로 있는지 확인하려면 다음을 수행하십시오.

compileTestJava.dependsOn tasks.getByPath(':ProjectA:testClasses')


답변

gradle 플러그인으로 제공되는 새로운 testJar 기반 (트랜스 티브 의존성 지원) 솔루션 :

https://github.com/hauner/gradle-plugins/tree/master/jartest

https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0

문서에서

다중 프로젝트 gradle 빌드가있는 경우 하위 프로젝트 사이에 테스트 종속성이있을 수 있습니다 (프로젝트가 제대로 구성되지 않았다는 힌트 일 수 있음).

예를 들어 하위 프로젝트 프로젝트 B가 프로젝트 A에 의존하고 B가 A에 대한 컴파일 종속성뿐만 아니라 테스트 종속성도있는 프로젝트를 가정합니다. B의 테스트를 컴파일하고 실행하려면 A의 테스트 도우미 클래스가 필요합니다.

기본적으로 gradle은 프로젝트의 테스트 빌드 출력에서 ​​jar 이슈를 생성하지 않습니다.

이 플러그인은 testArchives 구성 (testCompile 기반) 및 jarTest 태스크를 추가하여 테스트 소스 세트에서 jar을 작성합니다 (분류 자 테스트가 jar 이름에 추가됨). 그런 다음 B에서 A의 testArchives 구성 (A의 전이 종속성도 포함)에 의존 할 수 있습니다.

A에서는 build.gradle에 플러그인을 추가합니다.

apply plugin: 'com.github.hauner.jarTest'

B에서는 다음과 같이 testArchives 구성을 참조합니다.

dependencies {
    ...
    testCompile project (path: ':ProjectA', configuration: 'testArchives')
}


답변

다음 업데이트를 읽으십시오.

JustACluelessNewbie가 설명한 비슷한 문제가 IntelliJ IDEA에서 발생합니다. 문제는 그 의존성testCompile project(':core').sourceSets.test.output 실제로 “그라들 빌드 작업에 의해 생성 된 클래스에 따라”라는 것을 의미한다는 것입니다. 따라서 클래스가 생성되지 않은 깨끗한 프로젝트를 열면 IDEA가 클래스를 인식하지 못하고 오류를보고합니다.

이 문제를 해결하려면 컴파일 된 클래스에 대한 종속성 옆에 테스트 소스 파일에 대한 종속성을 추가해야합니다.

// First dependency is for IDEA
testCompileOnly files { project(':core').sourceSets.test.java.srcDirs }
// Second is for Gradle
testCompile project(':core').sourceSets.test.output

모듈 설정-> 종속성 (테스트 범위) 에서 IDEA가 인식 한 종속성을 관찰 할 수 있습니다. .

Btw. 이것은 좋은 해결책이 아니므로 리팩토링을 고려해 볼 가치가 있습니다. Gradle 자체에는 테스트 지원 클래스 만 포함하는 특수 하위 프로젝트가 있습니다. https://docs.gradle.org/current/userguide/test_kit.html을 참조 하십시오

2016-06-05 업데이트
더 제안 된 솔루션에 대해 생각하고 있습니다. 그것에 대한 몇 가지 문제가 있습니다 :

  1. IDEA에는 두 가지 종속성이 있습니다. 하나는 컴파일 된 클래스에 대한 다른 소스를 테스트하는 것입니다. 그리고 이러한 의존성을 IDEA가 인식하는 순서가 중요합니다. 모듈 설정-> 종속성 탭에서 종속성 순서를 변경하여 재생할 수 있습니다.
  2. 이러한 의존성을 선언함으로써 불필요하게 오염 구조를 오염시킬 수 있습니다.

더 나은 해결책은 무엇입니까? 제 생각에는 새로운 커스텀 소스 세트를 만들고 공유 클래스를 넣습니다. 실제로 Gradle 프로젝트의 저자는 testFixtures 소스 세트를 작성하여 수행했습니다.

이를 위해서는 다음을 수행해야합니다.

  1. 소스 세트를 작성하고 필요한 구성을 추가하십시오. Gradle 프로젝트에 사용 된이 스크립트 플러그인을 확인하십시오 : https://github.com/gradle/gradle/blob/v4.0.0/gradle/testFixtures.gradle
  2. 종속 프로젝트에서 적절한 종속성을 선언하십시오.

    dependencies {
        testCompile project(path: ':module-with-shared-classes', configuration: 'testFixturesUsageCompile')
    }
    
  3. Gradle 프로젝트를 IDEA로 가져오고 가져 오는 동안 “소스 세트마다 별도의 모듈 작성”옵션을 사용하십시오.