뭐라도 끄적이는 BLOG

JUnit5 조건에 따라 테스트 실행하기 본문

Java/JUnit5

JUnit5 조건에 따라 테스트 실행하기

Drawhale 2021. 12. 5. 17:28

테스트를 진행하다보면 특정 조건에 맞도록 테스트하는 과정도 필요합니다. 환경변수에 따라 실행되어야 하는 테스트가 있을 수 있고 properties에 설정된 값에 맞도록 실행되어야 하는 테스트 그리고 OS나 JRE 버전에따라 진행되어야 하는 테스트가 모두 따로 있을 수 있습니다. 이러한 조건에 맞도록 테스트 하는 방법을 살펴보도록 하겠습니다.

 

Assumptions

Assumptions는 특정한 조건에 따라 테스를 실행하고자 할때 사용하는 클래스입니다. 조건을 설정하는 여러메소드중 주요한 몇가지만 살펴보도록 하겠습니다.

 

assumeTrue

조건이 참이면 아래 테스트가 진행됩니다.

@Value("${test.env}")
private String testEnv;

@Test
@DisplayName("test.env가 LOCAL인 경우 스터디 만들기 테스트")
void create_new_study() throws IllegalAccessException {
    System.out.println("test_env = " + testEnv);
    assumeTrue("LOCAL".equalsIgnoreCase(testEnv));

    Study actual = new Study(10);
    assertThat(actual.getLimit()).isGreaterThan(0);
}

해당 테스트에선 properties에 설정된 값을 가져와 사용했지만 System.getEnv()와 같은 메소드를 사용해서 환경변수의 값을 사용할 수 도 있습니다.

assumingThat

조건이 참이면 매개변수에 담긴 람다식 안의 조건을 테스트하게 됩니다.

@Test
@DisplayName("test.env설정에 따른 테스트")
void setting_according_to_test(){
    assumingThat("LOCAL".equalsIgnoreCase(testEnv), ()->{
        Study actual = new Study(10);
        assertThat(actual.getLimit()).isGreaterThan(0);
    });
    Assumptions.assumingThat("DEV".equalsIgnoreCase(testEnv), ()->{
        Study actual = new Study(100);
        assertThat(actual.getLimit()).isGreaterThan(10);
    });
}

마찬가지로 properties에 설정된 값에따라 테스트가 진행됩니다.

@EnabledOn*

이번엔 특정 OS, JRE, 환경변수에 따라 테스트를 진행하는 방법에 대해 알아보겠습니다. Assumptions으로 System.getEnv()로 환경변수 값을 가지고와 설정할 수도 있습니다.

@EnabledOnOs

OS에 따라 테스트를 진행할 수 있습니다.

@EnabledOnOs(OS.WINDOWS)
void windows_os_shouldRun() throws IllegalAccessException {
    System.out.println(System.getenv());
    System.out.println("windows os");
    Study actual = new Study(100);
    assertThat(actual.getLimit()).isGreaterThan(10);
}

@Test
@DisplayName("Linus os에서만 테스트 실행")
@EnabledOnOs(OS.LINUX)
void linux_os_shouldRun() throws IllegalAccessException {
    System.out.println("Linux os");
    Study actual = new Study(100);
    assertThat(actual.getLimit()).isGreaterThan(10);
}

딱 한가지 OS만이 아닌 여러 OS를 지정할 수도 있습니다.

@EnabledOnJre

Jre버전에 따라 테스트를 진행할 수 있습니다.

@Test
@DisplayName("JRE version에따른 테스트 실행")
@EnabledOnJre({JRE.JAVA_17, JRE.JAVA_11})
void jre11_shouldRun() throws IllegalAccessException {
    Study actual = new Study(100);
    assertThat(actual.getLimit()).isGreaterThan(10);
}

 

@EnabledIfEnvironmentVariable

환경변수에 설정된 값에따라 테스트를 진행할 수 있습니다.

@Test
@DisplayName("환경변수에따른 테스트 실행")
@EnabledIfEnvironmentVariable(named = "TEST_ENV", matches = "local")
void environment_variable_shouldRun() throws IllegalAccessException {
    System.out.println("windows os");
    Study actual = new Study(100);
    assertThat(actual.getLimit()).isGreaterThan(10);
}

 

@Tag

각 테스트마다 Tag를 설정해놓고 Tag가 설정된 테스트만 진행할수 있습니다. IntelliJ에서 해당 태그들을 실행하는 방법과 Gradle에서 실행하는 방법을 알아보겠습니다.

IntelliJ

fast라는 태그를 지정하여 설정해 보도록 하겠습니다. 해당 테스트 코드는 다음과 같이 태그만 설정하고 아무것도 하지 않습니다. 그리고 해당 태그만 테스트가 진행되는지 확인을 위해 다른 태그의 테스트도 함께 넣도록 하겠습니다.

@Test
@DisplayName("tag fast")
@Tag("fast")
void tag_fast() {

}

@Test
@DisplayName("tag slow")
@Tag("slow") // CI환경에서
void tag_slow() {

}

이제 해당 테스트만 진행할 설정을 만들겠습니다.

오른쪽 상단에서 Edit Configurations를 찾아 설정 창을 열어줍니다.

Run/Debug Configurations 창이 나오면 왼쪽상단에서 +기호를 클릭한후 JUnit을 선택합니다.

이제 Test이름을 설정해주고 classPath를 테스터가 있는 곳으로 설정한뒤 Tags에 실행할 테스트의 태그를 기입합니다. 그리고 해당 테스트를 실행하면 다음과같이 fast태그만 설정된 테스트만이 진행되는것을 볼 수 있습니다.

Gradle

기본으로 springboot를 생성하면 다음과 같은 test태스크에서 useJUnitPlatform이 선언된 것을 확인할 수 있습니다.

test {
    useJUnitPlatform()
}

useJUnitPlatform의 Option으로 includeTags에 사용할 태그를 설정하겠습니다.

test {
    useJUnitPlatform{
        includeTags 'fast'
    }
}

그리고 Gradle로 테스트를 실행할때 해당 태그가 설정된 테스트만 진행되는것을 볼 수 있습니다.

 

Custom Tag

여러가지 어노테이션을 조합해서 태그를 생성할 수 있습니다. 가급적이면 오타를 줄이고 테스트를 지정할 수 있습니다.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Test
@Tag("fast")
public @interface FastTest {
}

 


참고 자료

 

더 자바, 코드를 조작하는 다양한 방법 - 인프런 | 강의

여러분이 사용하고 있는 많은 자바 라이브러리와 프레임워크가 "어떻게" 이런 기능을 제공할 지 궁금한적 있으신가요? 이번 강좌를 통해 자바가 제공하는 다양한 코드 또는 객체를 조작하는 방

www.inflearn.com

 

 

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model will not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and cus

junit.org

https://www.baeldung.com/junit-5-gradle

반응형

'Java > JUnit5' 카테고리의 다른 글

JUnit5 Assertions  (0) 2021.12.03
JUnit5 소개  (0) 2021.12.03