단위 유지, 통합 승인 테스트 등을 위해 다른 디렉토리 접근 방식을 만들기 위해 POC를 시도하고 있습니다. 사람들이 main 및 test와 함께 폴더를 만드는 많은 블로그를 보았지만 제 의도는 분리가 아니라 아래에 통합하는 것입니다. 시험 자체 폴더에 있습니다. 이 접근 방식에 대한 귀하의 견해를 알고 싶습니다. 여기에 함정이 있는지 잘 모르겠습니다.
위의 시나리오에서는 단위 테스트, 통합 테스트 및 수락 테스트를 유지하기 위해 아래와 같이 스프링 부트 애플리케이션 의 테스트 폴더 아래에 세 개의 폴더를 만들었습니다 .
내 Gradle 구성은 다음과 같습니다.
sourceSets {
test {
java {
srcDirs += ['src/test/integration/java', 'src/test/unit/java', 'src/test/acceptance/java']
}
resources {
srcDirs += ['src/test/integration/resources', 'src/test/unit/resources', 'src/test/acceptance/resources']
}
}
}
위의 구성이 잘 작동하고 있습니다. 유일한 문제는
./gradle test -----------> builds unit, integration, acceptance tests & generates report
./gradle unit -----------> builds only unit tests & generates report
./gradle integration ----> builds only integration tests & generates report
./gradle acceptance -----> builds only acceptance tests & generates report
gradle
두 경우 모두에 대해 구성을 만들었습니다 : 분리 및 통합 테스트. 통합 테스트의 경우 구성이 매우 간단하고 classpath
항상 하나 라는 것을 알 수 있습니다. src/test/java
이 접근 방식은 테스트 위치에 대한 매우 간단한 인간 이해를 제공합니다. 분리 된 테스트의 경우 구성이 복잡하고 미세 조정이 필요합니다. 테스트 이름 패턴이없는 경우 클래스 및 리소스 충돌이 발생하고이 경우 선택하는 테스트 작성 유형에 중요한 의미가 있습니다.
다음은 다중 테스트 폴더에 대한 구성입니다.
configurations {
integrationImplementation.extendsFrom(testImplementation)
integrationRuntimeOnly.extendsFrom(testRuntimeOnly)
unitRuntimeOnly.extendsFrom(testRuntimeOnly)
unitImplementation.extendsFrom(testImplementation)
}
sourceSets {
integration {
compileClasspath += sourceSets.main.output
runtimeClasspath += sourceSets.main.output
java {
srcDir file('src/test/integration/java')
}
resources {
srcDir file('src/test/integration/resources')
}
}
unit {
compileClasspath += sourceSets.main.output
runtimeClasspath += sourceSets.main.output
java {
srcDir file('src/test/unit/java')
}
resources {
srcDir file('src/test/unit/resources')
}
}
}
test {
useJUnitPlatform()
testClassesDirs += sourceSets.integration.output.classesDirs
testClassesDirs += sourceSets.unit.output.classesDirs
classpath += sourceSets.integration.runtimeClasspath
classpath += sourceSets.unit.runtimeClasspath
beforeTest { descriptor ->
logger.lifecycle("Running test: $descriptor")
}
testLogging {
events "PASSED", "FAILED", "SKIPPED"
}
}
task integration(type: Test) {
useJUnitPlatform()
testClassesDirs += sourceSets.integration.output.classesDirs
classpath += sourceSets.integration.runtimeClasspath
beforeTest { descriptor ->
logger.lifecycle("Running test: $descriptor")
}
testLogging {
events "PASSED", "FAILED", "SKIPPED"
}
}
task unit(type: Test) {
useJUnitPlatform()
testClassesDirs = sourceSets.unit.output.classesDirs
classpath = sourceSets.unit.runtimeClasspath
beforeTest { descriptor ->
logger.lifecycle("Running test: $descriptor")
}
testLogging {
events "PASSED", "FAILED", "SKIPPED"
}
}
모든 테스트 유형에 대해 단일 폴더가있는 경우 구성은 다음과 같습니다.
task integrationSingleFolder(type: Test) {
filter {
includeTestsMatching "*IT"
}
useJUnitPlatform()
testLogging {
events "PASSED", "FAILED", "SKIPPED"
}
}
task unitSingleFolder(type: Test) {
filter {
includeTestsMatching "*Test"
}
useJUnitPlatform()
testLogging {
events "PASSED", "FAILED", "SKIPPED"
}
}