Junit5 - 6. 실전 - 통합테스트 분리 (Feat. 회사 코드에 적용하기)

겔로그·2023년 8월 5일
0
post-thumbnail

오늘은 Junit5의 기능 @Tag를 활용한 통합테스트 분리 방법을 공유드리고자 합니다.

통합테스트 분리

1. @Tag를 활용한 어노테이션 생성

Junit5에는 테스트의 유형을 그룹핑할 수 있도록 @Tag 기능을 제공하고 있습니다. 해당 기능을 이용해 통합테스트와 단위테스트를 구분하고자 했으며, 이 때 태그로는 동일 명칭을 사용해야 통합테스트 분리에 용이하다고 판단하였습니다.

따라서 @Tag("integration")을 계속해서 쓰는 것은 귀찮으니 아래와 같은 새로운 어노테이션을 하나 만들었습니다.

import org.junit.jupiter.api.Tag;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("integration")
public @interface IntegrationTest {
}

2. 통합테스트에 어노테이션 적용

통합테스트를 구분하고자 통합테스트로 진행중인 클래스 및 메소드에 해당 어노테이션을 추가했습니다.

@ExtendWith(SpringExtension.class)
@IntegrationTest
@ActiveProfiles("junit")
public abstract class IntegrationSpringBootTest {
}

3. Gradle 설정 추가

Gradle 의 JunitPlatform에서는 Tag에 대해 포함할지 여부를 선택적으로 제공하기 위해 includeTags/excludeTags 기능을 제공합니다. 해당 기능을 이용하여 local profile(로컬 환경 실행)의 경우 통합테스트를 진행하지 않도록 제외하였습니다.

.gradle 설정

    test {
        profile = (!project.hasProperty('profile') || !profile) ? 'local' : profile
        println "profile : ${profile}"

        useJUnitPlatform {
            if(profile == 'local') {
                excludeTags 'integration'
            }
        }

결론

@Tag를 어노테이션으로 만들어 통합테스트를 분리하였으며, gradle 설정을 통해 local 환경에서는 통합테스트가 동작하지 않도록 테스트 분리를 진행하였습니다.

이로 인해 로컬 환경에서는 단위테스트만 수행되어 테스트 수행시간이 크게 단축되었지만... 단위테스트 수행시 다음과 같은 수행 시간이 소요되었습니다.

프로젝트테스트 수행시간 (개선 전)
api1m 4s
web17s
batch2m 43s
smtp31s
util10s
common9s

?? 생각보다 수행시간이 기네요...

다음 시간에는 단위테스트 수행 시간이 지연되는 원인을 분석해 단위테스트 수행시간을 단축하는 시간을 가져보겠습니다.

감사합니다.

profile
Gelog 나쁜 것만 드려요~

0개의 댓글