그래들과의 복수 프로젝트 테스트 의존성
멀티프로젝트 구성으로 gradle을 사용하고 싶습니다.
제 프로젝트는 다음과 같습니다.
프로젝트 A
- ->
src/main/java
- ->
src/test/java
- ->
프로젝트 B
- ->
src/main/java
(점등(점등)src/main/java
(프로젝트 A) - ->
src/test/java
(점등(점등)src/test/java
(프로젝트 A)
- ->
마이프로젝트 build.gradle
을 사용하다
apply plugin: 'java'
dependencies {
compile project(':ProjectA')
}
' ' ''compileJava
잘 작동하지만compileTestJava
는 프로젝트 A의 테스트파일을 컴파일하지 않습니다.
권장되지 않음 - Gradle 5.6 이상의 경우 이 답변을 사용합니다.
프로젝트 B에서는 다음 명령어를 추가하면 됩니다.testCompile
★★★★★★★★★★★★★★★★★★:
dependencies {
...
testCompile project(':A').sourceSets.test.output
}
Gradle 1.7로 테스트 완료.
이 기능은 현재 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/test Fiatures/java/com/example/Helper.java
package com.example;
public class Helper {}
:modul:other
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_fixtureshttpsdocs.gradle.org/current/userguide/java_testing.html#sec:
5에 되었습니다.6월 6일
https://docs.gradle.org/5.6/release-notes.html#test-fixtures-for-java-projectshttpsdocs.gradle.org/5.6/release-notes.html#
간단한 방법은 프로젝트 B에 명시적인 태스크 의존성을 추가하는 것입니다.
compileTestJava.dependsOn tasks.getByPath(':ProjectA:testClasses')
어려운(그러나 보다 명확한) 방법은 프로젝트에 대한 추가 아티팩트 구성을 생성하는 것입니다.답:
task myTestsJar(type: Jar) {
// pack whatever you need...
}
configurations {
testArtifacts
}
artifacts {
testArtifacts myTestsJar
}
해서 ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ를 요.testCompile
BXXXXXXXXXXXXB
apply plugin: 'java'
dependencies {
compile project(':ProjectA')
testCompile project(path: ':ProjectA', configuration: 'testArtifacts')
}
오래된 질문인 건 알지만 같은 문제가 있어서 무슨 일이 일어나고 있는지 알아보는 데 시간이 좀 걸렸어요.1.9로 하겠습니다.의 B에 있어야 합니다.build.gradle
프로젝트 B의 테스트에서 프로젝트 A의 테스트 클래스를 사용하려면:
testCompile files(project(':ProjectA').sourceSets.test.output.classesDir)
「 「 」를 하기 .sourceSets
는 Project에서 사용할 수 있습니다.
evaluationDependsOn(':ProjectA')
프로젝트 B를 컴파일할 때 프로젝트 A의 테스트 클래스가 실제로 있는지 확인하려면:
compileTestJava.dependsOn tasks.getByPath(':ProjectA:testClasses')
저도 최근에 이 문제를 접한 적이 있는데, 그 해답을 찾기가 어려운 문제예요.
프로젝트에서 기본 아티팩트 및 종속성을 내보내는 것과 동일한 방식으로 테스트 요소를 내보내야 한다고 생각하는 실수입니다.
개인적으로 더 큰 성공을 거둔 것은 Gradle에서 새로운 프로젝트를 만드는 것이었습니다.당신의 예에서는 이름을 붙이겠습니다.
프로젝트 A_Test -> src/main/java
현재 프로젝트 A/src/test/java에 있는 파일을 src/main/java에 넣습니다.프로젝트 A의 모든 testCompile 종속성을 프로젝트 A_Test의 종속성을 컴파일합니다.
그런 다음 프로젝트 A_Test를 프로젝트 B의 컴파일 종속성으로 만듭니다.
두 프로젝트의 저자 입장에서 보면 논리적이지 않지만 junit이나 scalatest(및 기타)와 같은 프로젝트를 생각하면 이치에 맞는다고 생각합니다.이러한 프레임워크는 테스트와 관련이 있지만 자체 프레임워크 내에서 "테스트" 대상의 일부로 간주되지 않습니다. 테스트 구성 내에서 다른 프로젝트가 사용하는 주요 아티팩트를 생성합니다.그냥 똑같은 패턴을 따르기만 하면 돼
여기에 기재되어 있는 다른 답변은 개인적으로 (Gradle 1.9를 사용하여) 기능하지 않았지만, 어쨌든 여기서 설명하는 패턴은 보다 깔끔한 솔루션임을 알 수 있었습니다.
아래 업데이트 내용을 읽어보십시오.
JustJust에서 설명한 것과 같은 는 합니다.IntelliJ IDEA ACLuless 신입사원는 입니다.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에서 인식되는 의존관계는 모듈 설정 -> 의존관계(테스트 범위)에서 확인할 수 있습니다.
그나저나 이것은 좋은 해결책이 아니므로 리팩터링은 고려할 가치가 있다.Gradle 자체에는 테스트 지원 클래스만을 포함하는 특별한 하위 프로젝트가 있습니다.https://docs.gradle.org/current/userguide/test_kit.html 를 참조해 주세요.
업데이트 2016-06-05 제안 솔루션에 대해 더 많이 생각하고 있지만 별로 마음에 들지 않습니다.여기에는 몇 가지 문제가 있습니다.
- IDEA에서 두 가지 종속성을 생성합니다.하나는 다른 하나는 컴파일된 클래스에 대한 소스 테스트 포인트입니다.그리고 이러한 의존성이 IDEA에 의해 어떤 순서로 인식되는지가 중요하다.[ Module settings ]-> [ Dependencies ]탭에서 의존관계 순서를 변경하여 조작할 수 있습니다.
- 이러한 의존관계를 선언하면 의존관계 구조가 불필요하게 오염됩니다.
그럼 어떻게 하면 좋을까요?새로운 커스텀 소스 세트를 만들고 공유 클래스를 거기에 넣는 것이라고 생각합니다.실제로 Gradle 프로젝트의 작성자는 테스트 피규어 소스 세트를 작성했습니다.
이 작업을 수행하려면 다음 작업을 수행해야 합니다.
- 소스 세트를 생성하고 필요한 구성을 추가합니다.Gradle 프로젝트에서 사용되는 스크립트 플러그인을 확인합니다.https://github.com/gradle/gradle/blob/v4.0.0/gradle/testFixtures.gradle
종속 프로젝트에서 적절한 종속성 선언:
dependencies { testCompile project(path: ':module-with-shared-classes', configuration: 'testFixturesUsageCompile') }
- 그래들 프로젝트를 IDEA로 Import하고 Import하는 동안 "소스 세트별로 개별 모듈 작성" 옵션을 사용합니다.
gradle 플러그인으로 사용할 수 있는 새로운 testJar 기반(중요 종속성 지원 솔루션:
https://github.com/hauner/gradle-plugins/tree/master/jartest
https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0
매뉴얼에서
다중 프로젝트 그래들 빌드를 사용하는 경우 하위 프로젝트 간에 테스트 종속성이 있을 수 있습니다(프로젝트의 구조가 적절하지 않다는 것을 의미할 수 있습니다).
예를 들어 하위 프로젝트 B가 프로젝트 A에 의존하고 B가 컴파일 종속성뿐만 아니라 테스트 종속성까지 갖는 프로젝트를 가정해 보겠습니다.B의 테스트를 컴파일하고 실행하기 위해서는 A의 테스트 도우미 클래스가 필요합니다.
기본적으로 그라들은 프로젝트의 테스트 빌드 출력에서 jar 아티팩트를 생성하지 않습니다.
이 플러그인은 testArchives 구성(testCompile 기반)과 jarTest 작업을 추가하여 테스트 소스 세트에서 jar를 만듭니다(자르 이름에 분류자 테스트가 추가됨).그런 다음 B에서 A의 testArchives 구성에 의존할 수 있습니다(A의 transitive 의존 관계도 포함됩니다).
A에서는 build.gradle에 플러그인을 추가합니다.
apply plugin: 'com.github.hauner.jarTest'
B에서는 다음과 같이 testArchives 설정을 참조합니다.
dependencies {
...
testCompile project (path: ':ProjectA', configuration: 'testArchives')
}
Fesler의 솔루션은 Android 프로젝트(gradle 2.2.0)를 구축하려고 했을 때 효과가 없었습니다.그래서 저는 필수 수업을 수동으로 참조해야 했습니다.
android {
sourceSets {
androidTest {
java.srcDir project(':A').file("src/androidTest/java")
}
test {
java.srcDir project(':A').file("src/test/java")
}
}
}
파티에 너무 늦었지만(Gradle v4.4가 되었습니다), 이것을 발견한 사람은 다음과 같습니다.
전제 조건:
~/allProjects
|
|-/ProjectA/module-a/src/test/java
|
|-/ProjectB/module-b/src/test/java
ㅇㅇㅇㅇㅇㅇ로 가보세요.build.gradle
프로젝트 B(A의 일부 테스트 클래스가 필요한 프로젝트)의 다음 항목을 추가합니다.
sourceSets {
String sharedTestDir = "${projectDir}"+'/module-b/src/test/java'
test {
java.srcDir sharedTestDir
}
}
또는 (프로젝트의 이름이 지정되어 있는 경우)ProjectB
)
sourceSets {
String sharedTestDir = project(':ProjectB').file("module-b/src/test/java")
test {
java.srcDir sharedTestDir
}
}
보일라!
여기서 Kotlin DSL을 사용하는 경우 Gradle 문서에 따라 작업을 생성해야 합니다.
이전 답변과 마찬가지로 테스트 클래스와 기본 클래스가 혼재되지 않도록 프로젝트 내에 테스트 클래스를 공유하는 특수 구성을 만들어야 합니다.
간단한 순서
- 프로젝트 A에서 다음 항목을 추가해야 합니다.
build.gradle.kts
:
configurations {
create("test")
}
tasks.register<Jar>("testArchive") {
archiveBaseName.set("ProjectA-test")
from(project.the<SourceSetContainer>()["test"].output)
}
artifacts {
add("test", tasks["testArchive"])
}
- 그런 다음 의존관계에 있는 프로젝트 B에서 다음을 추가해야 합니다.
build.gradle.kts
:
dependencies {
implementation(project(":ProjectA"))
testImplementation(project(":ProjectA", "test"))
}
Gradle 6.6.x의 test-jar 작성
많은 정보원이 '괜찮지 않다'고 말하고 있는 것을 알고 있습니다.
이건 는 단지 의 시험 이 마음에 들지 않는다.testFixtures
더입니니다다
모듈 A는 다음과 같습니다.
task jarTests(type: Jar, dependsOn: testClasses) {
classifier = 'tests'
from sourceSets.test.output
}
configurations {
tests {
extendsFrom testRuntime
}
}
artifacts {
tests jarTests
}
모듈 B에서는:
testImplementation project(':moduleA')
testImplementation project(path: ':moduleA', configuration: 'tests')
그리고 효과가 있어!
아티팩트 종속성을 사용하여 다음을 수행하려는 경우:
- 프로젝트 B의 소스 클래스는 프로젝트 A의 소스 클래스에 의존합니다.
- 프로젝트 B의 테스트 클래스는 프로젝트 A의 테스트 클래스에 따라 달라집니다.
build.gradle의 Project B 의존관계 섹션은 다음과 같습니다.
dependencies {
compile("com.example:projecta:1.0.0")
testCompile("com.example:projecta:1.0.0:tests")
}
이 작업을 수행하려면 프로젝트A가 -tests jar를 작성하여 생성하는 아티팩트에 포함시켜야 합니다.
Project A의 build.gradle에는 다음과 같은 구성이 포함되어 있어야 합니다.
task testsJar(type: Jar, dependsOn: testClasses) {
classifier = 'tests'
from sourceSets.test.output
}
configurations {
tests
}
artifacts {
tests testsJar
archives testsJar
}
jar.finalizedBy(testsJar)
프로젝트 시A의 아티팩트가 아티팩토리에 게시되고 -tests jar가 포함됩니다.
Project B의 의존관계 섹션의 test Compile은 -tests jar에 클래스를 가져옵니다.
플랫 프로젝트를 포함하려는 경우A의 소스 클래스 및 테스트 클래스는 개발 목적으로 프로젝트 B의 build.gradle의 의존성 섹션은 다음과 같습니다.
dependencies {
compile project(':projecta')
testCompile project(path: ':projecta', configuration: 'tests')
}
새 수 .projectA-mock
다음 .ProjectA
★★★★★★★★★★★★★★★★★」ProjectB
:
dependencies {
testCompile project(':projectA-mock')
}
이지만, 만약 테스트를 가 있는 ProjectA
ProjectB
하다
Nikita가 언급한 Android+Kotlin용 솔루션은 다음과 같습니다.
task jarTests(type: Jar, dependsOn: "assembleDebugUnitTest") {
getArchiveClassifier().set('tests')
from "$buildDir/tmp/kotlin-classes/debugUnitTest"
}
configurations {
unitTestArtifact
}
artifacts {
unitTestArtifact jarTests
}
종속성을 사용하는 프로젝트의 그라데이션:
testImplementation project(path: ':shared', configuration: 'unitTestArtifact')
Gradle이 다른 프로젝트의 테스트 클래스를 감지하지 못했거나 가져올 때 Eclipse 프로젝트의 종속성이 잘못되었으므로 다른 응답 중 몇 가지 오류가 발생했습니다.같은 문제를 안고 있는 사람이 있다면 다음 방법을 사용할 것을 권장합니다.
testCompile project(':core')
testCompile files(project(':core').sourceSets.test.output.classesDir)
첫 번째 행은 Eclipse가 다른 프로젝트를 종속성으로 연결하도록 강제하므로 모든 소스가 포함되고 최신 상태가 됩니다.두 번째는 Gradle이 소스를 실제로 볼 수 있도록 하며 다음과 같은 잘못된 종속성 오류를 발생시키지 않습니다.testCompile project(':core').sourceSets.test.output
Gradle Kotlin DSL에 솔루션을 적응하는 데 어려움을 겪고 있다면 다음과 같습니다.
configurations {
register("testClasses") {
extendsFrom(testImplementation.get())
}
}
val testJar = tasks.register<Jar>("testJar") {
archiveClassifier.set("test")
from(sourceSets.test)
}
artifacts.add("testClasses", testJar)
프로젝트 B:
dependencies {
testCompile project(':projectA').sourceSets.test.output
}
1.7-rc-2로 동작하는 것 같습니다.
언급URL : https://stackoverflow.com/questions/5644011/multi-project-test-dependencies-with-gradle
'programing' 카테고리의 다른 글
Java 컨스트럭터 상속 (0) | 2022.06.10 |
---|---|
vuex 모듈에도 네임스페이스가 필요합니까? (0) | 2022.06.10 |
uint_fast32_t보다 uint32_t가 선호되지 않는 이유는 무엇입니까? (0) | 2022.06.10 |
vuex ajax 호출 및 여러 구성 요소 (0) | 2022.06.10 |
Nuxt.js 기반 사이트를 개선하여 Google PageSpeed 통찰력을 얻는 방법 (0) | 2022.06.10 |