Java/Junit 5

Junit 5 - 조건부 테스트 실행

kjwc 2023. 3. 9. 22:25
728x90

Junit 5 조건부 테스트 실행이 무엇인지 살펴보고 Jupiter api가 지원하는 다양한 조건이 무엇인지 몇 가지 예를 통해 살펴보겠습니다.

 

1. Junit 5 조건부 테스트 실행

다음은 Junit 5 Jupiter API가 테스트 사례를 활성화 또는 비활성화하기 위해 지원하는 몇 가지 조건입니다.
1. @EnabledOnOs 및 @DisabledOnOs Annotaton을 통한 운영 체제 조건
2. @EnabledOnJre, @DisabledOnJre, @EnabledForJreRange 및 @DisabledForJreRange Annotaton을 통한 

    자바 런타임 환경 조건
3. @EnabledIfSystemProperty 및 @DisabledIfSystemProperty Annotaton을 통한 시스템 속성 조건
4. @EnabledIfEnvironmentVariable 및 @DisabledIfEnvironmentVariable Annotaton을 통한 환경 변수 조건
5. @EnabledIf 또는 @DisabledIf Annotaton을 통한 스크립트 기반 조건
6. ExecutionCondition 확장 API.1을 사용하여 맞춤 조건을 만듭니다.

 

 

2. 운영체제(Operating System) 조건 지정하기

@EnabledOnOs 및 @DisabledOnOs Annotaton을 통해 특정 운영 체제를 기반으로 테스트를 활성화 또는 비활성화합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.tistory.itbaewom.conditional;
 
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnOs;
import org.junit.jupiter.api.condition.EnabledOnOs;
import org.junit.jupiter.api.condition.OS;
 
// 운영체제(Operating System) 조건지정
public class OSConditionalTest {
 
    @Test
    @EnabledOnOs(OS.MAC)
    void runOnlyOnMacOs() {
        System.out.println("MAC OS에서만 이 테스트 작업 실행합니다.");
    }
 
    @Test
    @EnabledOnOs({ OS.LINUX, OS.MAC })
    void runOnlyOnLinuxOrMac() {
        System.out.println("LINUX 또는 MAC OS에서만 테스트 작업 실행합니다.");
    }
 
    @Test
    @DisabledOnOs(OS.WINDOWS)
    void notRunOnWindows() {
        System.out.println("WINDOWS OS에서 테스트 작업을 실행하지 않습니다.");
    }
 
    @Test
    @EnabledOnOs({ OS.WINDOWS })
    void runOnlyOnWindows() {
        System.out.println("Windows OS에서만 테스트 작업 실행합니다.");
    }
 
    @Test
    @DisabledOnOs({ OS.AIX, OS.LINUX, OS.SOLARIS })
    void notRunOnAIXorLinuxOrSolaris() {
        System.out.println("AIX, LINUX 또는 SOLARIS에서 테스트 작업을 실행하지 않습니다.");
    }
}
cs

 

테스트 수행 결과 입니다. 3개의 테스트 메서드는 테스트를 수행하지 않고 2개의 메서드만 테스트를 수행 했습니다.

@EnabledOnOs({ OS.WINDOWS }) : Windows 운영체제에서 활성화 합니다.
@EnabledOnOs(OS.MAC) : MAC 운영체제에서 활성화 합니다.
@EnabledOnOs({ OS.LINUX, OS.MAC }) :  Linux와 Mac 운영체제에서 활성화 합니다.

@DisabledOnOs(OS.WINDOWS) : Windows 운영체제에서 비활성화 합니다.
@DisabledOnOs({ OS.AIX, OS.LINUX, OS.SOLARIS }) : AIX, Linux, Solaris 운영체제에서 활성화 합니다.

 

 

콘솔창에 나타난 결과 입니다.

@EnabledOnOs({ OS.WINDOWS })와 @DisabledOnOs({ OS.AIX, OS.LINUX, OS.SOLARIS }) Annotation이 붙은 메서드만 실행되었습니다.

 

 

2. 자바 런타임 환경 조건 지정하기

@EnabledOnJre 및 @DisabledOnJre Annotation을 통해 특정 JRE(Java Runtime Environment)를 기반으로 테스트를 활성화 또는 비활성화합니다.

 

@EnabledForJreRange 및 @DisabledForJreRange 주석( Junit 5.6.0에 도입됨)을 통해 JRE의 특정 특정 범위 버전을 기반으로 테스트를 활성화 또는 비활성화했습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.tistory.itbaewom.conditional;
 
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnJre;
import org.junit.jupiter.api.condition.EnabledOnJre;
import org.junit.jupiter.api.condition.JRE;
 
// Java Runtime Environment Conditional
public class JREConditionalTest {
 
    @Test
    @EnabledOnJre(JRE.JAVA_8)
    void runOnlyOnJava8() {
        System.out.println("JRE 8에서만 호환성 테스트를 실행합니다.");
    }
 
    @Test
    @EnabledOnJre({ JRE.JAVA_15, JRE.JAVA_16 })
    void runOnlyOnJava15OrJava16() {
        System.out.println("JRE 15 및 JRE 16에서만 호환성 테스트를 실행합니다.");
    }
 
    @Test
    @DisabledOnJre(JRE.JAVA_13)
    void notRunOnJava13() {
        System.out.println("JRE 13에서 호환성 테스트를 실행하지 않습니다.");
    }
 
    @Test
    @EnabledOnJre(JRE.JAVA_17)
    void runOnlyOnJava17() {
        System.out.println("JRE 17에서만 호환성 테스트 실행합니다.");
    }
 
    @Test
    @DisabledOnJre({ JRE.JAVA_10, JRE.JAVA_11 })
    void notRunOnJava10andJava11() {
        System.out.println("JRE 10 및 JRE 11에서 호환성 테스트를 실행하지 않습니다");
    }
}
cs

 

 

테스트 수행 결과 입니다. 2개의 테스트 메서드는 테스트를 수행하지 않고 3개의 메서드만 테스트를 수행 했습니다.

 

@EnabledOnJre(JRE.JAVA_8)  : JAVA 버전 8에서만 활성화
@EnabledOnJre({ JRE.JAVA_15, JRE.JAVA_16 }) : JAVA 버전 15, 16에서만 활성화
@EnabledOnJre(JRE.JAVA_17) : JAVA 버전 8에서만 활성화

 

@DisabledOnJre(JRE.JAVA_13) : JAVA 버전 13에서만 비활성화

@DisabledOnJre({ JRE.JAVA_10, JRE.JAVA_11 }) : JAVA 버전 10, 11에서만 비활성화

 

 

콘솔창에 나타난 결과 입니다.

 

 

 

3. 시스템 속성 조건 지정하기

@EnabledIfSystemProperty 및 @DisabledIfSystemProperty 주석을 통해 JVM 시스템 속성에서 명명된 값을 기반으로 테스트를 활성화 또는 비활성화 합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.tistory.itbaewom.conditional;
 
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledIfSystemProperty;
import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
 
// System Properties Conditional
public class SPConditionalTest {
 
    @Disabled // 시스템 프로퍼티를 확인하지 않으려면 이 줄을 주석처리 합니다.
    @Test
    void printSystemProperties() {
        System.out.println("-".repeat(100));
        System.out.println("시스템 프로퍼티 목록 보기");
        System.out.println("-".repeat(100));
        System.getProperties().forEach((key, value) -> System.out.println(key + " - " + value));
        System.out.println("-".repeat(100));
    }
 
    @Test
    @EnabledIfSystemProperty(named = "java.vm.vendor", matches = "Oracle.*")
    void runOnlyOnOracleJDK() {
        System.out.println("오라클 JDK에서만 실행합니다.");
    }
 
    @Test
    @EnabledIfSystemProperty(named = "os.arch", matches = ".*32.*")
    void runOnlyOn32bitOS() {
        System.out.println("32비트 OS에서만 실행");
    }
 
    @Test
    @DisabledIfSystemProperty(named = "os.version", matches = ".*10.*")
    void notRunOnlyOnWindows10() {
        System.out.println("Windows 10 버전에서만 실행되지 않습니다.");
    }
 
    @Test
    @EnabledIfSystemProperty(named = "os.version", matches = ".*10.*")
    void runOnlyOnWindows10() {
        System.out.println("Windows 10 버전에서만 실행합니다.");
    }
}
cs

 

테스트 수행 결과 입니다. 4개의 테스트 메서드는 테스트를 수행하지 않고 1개의 메서드만 테스트를 수행 했습니다.

 

@EnabledIfSystemProperty(named = "java.vm.vendor", matches = "Oracle.*") : 오라클 JDK에서만 활성화
@EnabledIfSystemProperty(named = "os.arch", matches = ".*32.*") : 32비트 운영체제에서만 활성화

@EnabledIfSystemProperty(named = "os.version", matches = ".*10.*") : OS버전에 10이 포함었을때 활성화
@DisabledIfSystemProperty(named = "os.version", matches = ".*10.*") : OS버전에 10이 포함었을때 비활성화

 

 

콘솔창에 나타난 결과 입니다.

 

 

 

4. 환경변수 조건 지정하기

@EnabledIfEnvironmentVariable 및 @DisabledIfEnvironmentVariable Annotation을 통해 명명된 속성 값을 기반으로 테스트를 활성화 또는 비활성화 합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.tistory.itbaewom.conditional;
 
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
 
// Environment Variable Conditional
public class EVConditionalTest {
 
    @Disabled // 시스템 프로퍼티를 확인하지 않으려면 이 줄을 주석처리 합니다.
    @Test
    void printSystemProperties() {
        System.out.println("-".repeat(100));
        System.out.println("시스템 프로퍼티 목록 보기");
        System.out.println("-".repeat(100));
        System.getProperties().forEach((key, value) -> System.out.println(key + " - " + value));
        System.out.println("-".repeat(100));
    }
 
    @Test
    @EnabledIfEnvironmentVariable(named = "COMPUTERNAME", matches = "sysname")
    void runOnlyOnPerticularMachine() {
        System.out.println("특정 서버에서만 실행합니다.");
    }
 
    @Test
    @DisabledIfEnvironmentVariable(named = "PROCESSOR_ARCHITECTURE", matches = ".*32.*")
    void noRrunOn32bitOS() {
        System.out.println("32비트 OS에서는 실행 불가합니다.");
    }
 
    @Test
    @EnabledIfEnvironmentVariable(named = "USERNAME", matches = "username")
    void runOnlyForPerticularUser() {
        System.out.println("시스템의 특정 사용자에 대해서만 실행합니다.");
    }
}
cs

 

테스트 수행 결과 입니다. 3개의 테스트 메서드는 테스트를 수행하지 않고 1개의 메서드만 테스트를 수행 했습니다.

 

@EnabledIfEnvironmentVariable(named = "COMPUTERNAME", matches = "sysname") : 컴퓨터아름으로 활성화 

@EnabledIfEnvironmentVariable(named = "USERNAME", matches = "username") : 사용자 이름으로 활성화


@DisabledIfEnvironmentVariable(named = "PROCESSOR_ARCHITECTURE", matches = ".*32.*") : 32비트 OS에서 비활성화

 

 

콘솔창에 나타난 결과 입니다.

 

 

 

5. 사용자 조건 지정하기

사용자 Annotaton을 만들고 사용자가 만든 Annotation을 이용하여 조건을 지정해 보도록 하겠습니다.

 

사용자 Annotaton만들기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.tistory.itbaewom.conditional;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
import org.junit.jupiter.api.condition.EnabledOnOs;
import org.junit.jupiter.api.condition.OS;
 
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Test
@EnabledOnOs({ OS.WINDOWS })
@EnabledIfSystemProperty(named = "os.version", matches = ".*10.*")
@EnabledIfEnvironmentVariable(named = "PROCESSOR_ARCHITECTURE", matches = ".*64.*")
public @interface RunOnlyOn64bitWindows10 {
 
}
cs

 

사용자 Annotaton을 이용하여 조건지정하기

 

1
2
3
4
5
6
7
8
9
10
package com.tistory.itbaewom.conditional;
 
public class CustomConditionalTest {
 
    @RunOnlyOn64bitWindows10
    void runOnlyOn64bitWindows10() {
        System.out.println("64bit Windows 10 System에서만 실행됩니다.");
    }
 
}
cs

 

테스트 수행 결과 입니다. 

 

 

콘솔창에 나타난 결과 입니다.

 

 

참고로 비활성화 시키는 Annotation을 만들어서 적용해 보았습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.tistory.itbaewom.conditional;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledIfEnvironmentVariable;
import org.junit.jupiter.api.condition.DisabledIfSystemProperty;
import org.junit.jupiter.api.condition.DisabledOnOs;
import org.junit.jupiter.api.condition.OS;
 
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Test
@DisabledOnOs({ OS.WINDOWS })
@DisabledIfSystemProperty(named = "os.version", matches = ".*10.*")
@DisabledIfEnvironmentVariable(named = "PROCESSOR_ARCHITECTURE", matches = ".*64.*")
public @interface NotRunOnlyOn64bitWindows10 {
 
}
cs

 

1
2
3
4
5
6
7
8
9
package com.tistory.itbaewom.conditional;
 
public class CustomConditionalTest2 {
 
    @NotRunOnlyOn64bitWindows10
    void runOnlyOn64bitWindows10() {
        System.out.println("64bit Windows 10 System에서만 실행됩니다.");
    }
}
cs

 

테스트 수행 결과 입니다. 

 

 

콘솔창에 나타난 결과 입니다.

 

728x90