Programming/Spring

[Spring] JUnit5 조건부 테스트 실행방법

기록하는 백앤드개발자 2024. 6. 27. 10:10
반응형

ㅁ 개요

ㅇ 테스트를 진행 시 특정 조건에 맞추어 테스트를 실행해야 할 때가 있다. 
ㅇ 예를 들어, 환경 변수, properties 설정 값, OS, JRE 버전 등에 따라 테스트를 실행할 필요가 있다.
ㅇ JUnit5는 이러한 조건에 맞춰 테스트를 실행할 수 있는 다양한 방법을 제공한다. 
ㅇ 이번 글에서는 JUnit5의 조건에 따라 테스트를 실행하는 방법을 정리하였다.

ㅁ EnabledOnOs

    // OsConditionTest
    @Test
    @EnabledOnOs(OS.WINDOWS)
    fun test1() {
        println("enabled on windows")
    }

    @Test
    @EnabledOnOs(OS.MAC, OS.LINUX)
    fun test2() {
        println("enabled on mac");
    }

    @Test
    @DisabledOnOs(OS.AIX, OS.SOLARIS, disableReason = "비활성화 이유를 적을 수 있다.")
    fun test3() {
        println("disabled on windows");
    }

    @Test
    @DisabledOnOs(OS.MAC)
    fun test4() {
        println("disabled on mac");
    }

ㅇ EnabledOnOs: 가능한 OS

ㅇ DisableOnOs: 불가능한 OS

ㅇ disableReason에 비활성화 이유를 적을 수 있다.

ㅇ 어노테이션에 OS 상수 값을 지정할 수 있고, 그 상수는 다음과 같다.

public enum OS {
    AIX,
    LINUX,
    MAC,
    SOLARIS,
    WINDOWS,
    OTHER;
// ...

ㅇ 로컬개발의 환경과 운영환경에 차이가 있다면, 이 조건부 테스트는 운영 테스트를 막을 수 있다.

ㅁ Java 버전

    // Java 버젼 조건
    @Test
    @EnabledOnJre(JRE.JAVA_17)
    fun jreTest1() {
        println("enabled on java 17")
    }

    @Test
    @EnabledOnJre(JRE.JAVA_17, JRE.JAVA_18)
    fun jreTest2() {
        println("enabled on java 17, 18")
    }

    @Test
    @EnabledForJreRange(min = JRE.JAVA_8, max = JRE.JAVA_18)
    fun jreTest3() {
        println("enabled on java 8~18")
    }
    
    @Test
    @DisabledOnJre(JRE.JAVA_8, JRE.JAVA_9)
    fun jreTest4() {
        println("disabled on java 8,9")
    }
    
    @Test
    @DisabledForJreRange(min = JRE.JAVA_8, max = JRE.JAVA_18)
    fun jreTest5() {
        println("disabled on java 8~18")
    }

ㅇ JAVA 버젼에 따라 조건부로 테스트를 수행할 수 있다.

ㅁ 시스템 속성

    // SystemProperty
    @Test
    @EnabledIfSystemProperty(named = "java.vendor", matches = "AdoptOpenJDK")
    fun systemTest1() {
        println("enabled if AdoptOpenJDK");
    }

    @Test
    @EnabledIfSystemProperty(named = "java.vendor", matches = "Oracle.*")
    fun systemTest2() {
        println("enabled if Oracle");
    }

    @Test
    @DisabledIfSystemProperty(named = "java.vendor", matches = "AdoptOpenJDK")
    fun systemTest3() {
        println("disabled if AdoptOpenJDK");
    }

    @Test
    @DisabledIfSystemProperty(named = "java.vendor", matches = "Oracle.*")
    fun systemTest4() {
        println("disabled if Oracle");
    }

ㅇ named: 시스템 속성의 이름
ㅇ matches: 조건이 되는 값을 정규 표현으로 지정한다. 전체가 일치해야함.

ㅁ 환경 변수

    // EnvironmentVariable
    @Test
    @EnabledIfEnvironmentVariable(named = "JAVA_HOME", matches = "AdoptOpenJDK")
    fun evTest1() {
        println("enabled if AdoptOpenJDK")
    }

    @Test
    @EnabledIfEnvironmentVariable(named = "JAVA_HOME", matches = ".*\\\\OpenJDK\\\\.*")
    fun evTest2() {
        println("enabled if OpenJDK")
    }

    @Test
    @DisabledIfEnvironmentVariable(named = "JAVA_HOME", matches = ".*\\\\AdoptOpenJDK\\\\.*")
    fun evTest3() {
        println("disabled if AdoptOpenJDK")
    }

    @Test
    @DisabledIfEnvironmentVariable(named = "JAVA_HOME", matches = ".*\\\\OpenJDK\\\\.*")
    fun evTest4() {
        println("disabled if OpenJDK")
    }

 named: 환경변수의 이름
ㅇ matches: 조건이 되는 값을 정규 표현으로 지정한다. 전체가 일치해야함.

ㅁ 스크립트 기반 조건

    @Test
    @EnabledIf("'FR' == systemProperty.get('user.country')")
    fun onlyFrenchPeopleWillRunThisMethod() {
        println("enabled if onlyFrenchPeopleWillRunThisMethod")
    }

    @Test
    @DisabledIf("java.lang.System.getProperty('os.name').toLowerCase().contains('mac')")
    fun shouldNotRunOnMacOS() {
        println("disabled if mac os")
    }

ㅇ 값 – 실행할 실제 스크립트가 포함되어 있다.
ㅇ 엔진(선택 사항) – 사용할 스크립팅 엔진을 지정한다. 기본값은  Oracle Nashorn 이다.
ㅇ 이유(선택 사항) – 로깅 목적으로 테스트가 실패할 경우 JUnit이 인쇄해야 하는 메시지를 지정한다.

참조: Script-Based Conditions

ㅁ Assumptions 클래스

import static org.junit.jupiter.api.Assumptions.*;

@Test
fun trueAssumption() {
    assumeTrue(5 > 1)
    assertEquals(5 + 2, 7)
}

@Test
fun falseAssumption() {
    assumeFalse(5 < 1)
    assertEquals(5 + 2, 7)
}

@Test
fun assumptionThat() {
    val someString = "Just a string"
    assumingThat(
        someString == "Just a string"
    ) { assertEquals(2 + 2, 4) }
}

ㅇ Assumptions은 특정 조건이 충족되는 경우에만 테스트를 실행하는 데 사용된다.

ㅇ 이는 일반적으로 테스트가 제대로 실행되는 데 필요하지만 테스트 중인 항목과 직접적인 관련이 없는 외부 조건에 사용된다.

ㅇ submitTrue() , acquireFalse() 및 assumingThat() 을 사용하여 가정을 선언할 수 있다.

ㅁ 함께 보면 좋은 사이트

A Guide to JUnit 5

JUnit 5 Conditional Test Execution with Annotations

JUnit5 조건부 테스트 - @EnabledOnOs, @EnabledOnJre, @EnabledIfEnvironmentVariable

반응형