카테고리 없음

Gradle을 사용하여 다양한 명령에서 테스트를 준수하고 빌드합니다.

기록만이살길 2021. 2. 20. 14:34
반응형

Gradle을 사용하여 다양한 명령에서 테스트를 준수하고 빌드합니다.

1. 질문(문제점):

단위 유지, 통합 승인 테스트 등을 위해 다른 디렉토리 접근 방식을 만들기 위해 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

2. 해결방안:

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"
    }
}
65763622
반응형