[Spring] JUnit5 조건부 테스트 실행방법
ㅁ 개요
ㅇ 테스트를 진행 시 특정 조건에 맞추어 테스트를 실행해야 할 때가 있다.
ㅇ 예를 들어, 환경 변수, 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이 인쇄해야 하는 메시지를 지정한다.
ㅁ 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() 을 사용하여 가정을 선언할 수 있다.
ㅁ 함께 보면 좋은 사이트
ㅇ JUnit 5 Conditional Test Execution with Annotations
ㅇ JUnit5 조건부 테스트 - @EnabledOnOs, @EnabledOnJre, @EnabledIfEnvironmentVariable