본문 바로가기

Development/Application Test

[JUnit 5] Assertions VS Assumptions

1- 개요

  • Assertions와 Assumptions를 비교해보고자 함

2- 학습 내용 기반으로 차이점 요약

  • Assertions은 테스트 실행 조건이 아닌 테스트 통과 조건에 초점된 클래스
  • Assumptions는 테스트 실행 조건에 초점이 맞추어진 클래스

3- 비교

  • Assertions
    - 테스트 통과 조건을 통과하는지 확인할 때 사용
    - 주요 메서드는 이전에 포스팅된 글 참고

  • Assumptions
    - 메소드별 조건에 따라 테스트 수행 여부 결정
    - 주로 수행 OS, 환경변수, JRE 버전 등에 따른 조건을 입력함
    - assumeTrue : 테스트 실패시 에러 
    - assumeFalse : 테스트 성공시 에러
    - assumingThat( boolean, executable )
      : 첫 번째 인자가 True면 두 번째 인자로 들어온 함수 수행
      : 첫 번째 인자가 False이어도 이후 테스트를 스킵하지 않고 다음 코드 진행

 

  • assumingThat 예시 코드

 

  • Assumptions 활용 테스트 코드 예시
package me.jeongsky.inflearnthejavatest;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.*;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;

@DisplayNameGeneration(DisplayNameGenerator.IndicativeSentences.class)
public class StudyTest_Condition {

    /*
        조건에 따라 테스트 코드 실행하기
        - 여기서 명시한 조건: 특정 OS, 자바 버전, 환경 변수, 시스템 버전 등
        - 위 예시에 따른 실행 여부 결정하기
     */

    @Test
    @DisplayName("테스트 환경 확인 테스트")
    void createNewStudy() {

        // org.junit.jupiter.api.Assumptions 에서 제공하는 메서드
        //  case 1. 테스트 환경이 로컬인 경우
        String env = System.getenv("TEST_ENV");
        System.out.println("env = " + env);

        //      parameter 로 받은 조건에 만족하는지 테스트
        assumeTrue("LOCAL".equalsIgnoreCase(System.getenv("TEST_ENV")));

    }

    @Test
    @DisplayName("특정 조건에 따른 테스트 수행")
    void each_env_test() {

        //      특정 조건에 만족한다면 이거
        //      -> 하늘 추측. 로컬 환경에서 접속하는 DB IP 확인에서 확인할수도 있고
        assumingThat(
                "LOCAL".equalsIgnoreCase(System.getenv("TEST_ENV")),
                () -> {
                    System.out.println("LOCAL 환경");
                    Study study = new Study(10);
                    assertThat(study.getLimit()).isGreaterThan(0);
                }
        );

        //      위에거가 아닌 다른 조건에 만족한다면 이 테스트
        //      -> 여기서 또 다른 거일수 있고
        assumingThat(
                "sky".equalsIgnoreCase(System.getenv("TEST_ENV")),
                () -> {
                    System.out.println("sky 환경");
                    Study study = new Study(20);
                    assertThat(study.getLimit()).isGreaterThan(15);
                }
        );

    }


    // 위 내용은 Annotation으로 테스트 가능함

    //  case1. Mac OS
    //      @EnabledOnOs    -> 특정 운영체제인 경우 실행
    //      @DisabledOnOs   -> 특정 운영체제인 경우 비실행
    @Test
    @DisplayName("Mac인 경우 실행하는 테스트")
    @EnabledOnOs(OS.MAC)
    void doRunOnMac() {
        assumingThat("LOCAL".equalsIgnoreCase(System.getenv("TEST_ENV")),
                () -> {
                    Study study = new Study(2);
                    assertThat(study.getLimit()).isGreaterThan(0);
                }
        );
    }

    @Test
    @DisplayName("Mac인 경우 실행하지 않는 테스트")
    @DisabledOnOs(OS.MAC)
    void doNotRunOnMac() {
        assumingThat("LOCAL".equalsIgnoreCase(System.getenv("TEST_ENV")),
                () -> {
                    Study study = new Study(15);
                    assertThat(study.getLimit()).isGreaterThan(10);
                });
    }

    // case2. 여러 개의 운영체제를 대상으로 하는 경우
    //      배열로 넘길 수 있음
    @Test
    @DisplayName("다수의 OS를 실행하는 경우")
    @EnabledOnOs({OS.MAC, OS.LINUX})
    void doRunOnMacOrLinux() {
        String jreVersion = System.getenv("JAVA_HOME");
        System.out.println("jreVersion = " + jreVersion);
        System.out.println("Hello~~ Running on Mac Or Linux" );
    }

    // case3. 특정 자바 버전에 따른 실행
    @Test
    @DisplayName("자바 8 ~ 15 버전에 수행")
    @EnabledOnJre({ JRE.JAVA_8, JRE.JAVA_9, JRE.JAVA_10, JRE.JAVA_11, JRE.JAVA_12, JRE.JAVA_13, JRE.JAVA_14, JRE.JAVA_15})
    void doRunOnJre8to15() {
        System.out.println("JRE 8 ~ 15");
    }

    @Test
    @DisplayName("위 언급된 버전 외에 것들 수행")
    @EnabledOnJre({JRE.OTHER})
    void doRunOnJreOther() {
        System.out.println("JRE 8 ~ 11 외 버전 수행");
    }

    // case4. 사용하고자 하는 환경 변수에 따른 테스트
    //      named   : 환경 변수 key 값
    //      matches : key 값의 value 조건
    @Test
    @DisplayName("사용하고자 하는 환경 변수에 대한 테스트")
    @EnabledIfEnvironmentVariable(named = "TEST_ENV", matches = "LOCAL")
    void doRunValueIsLocal() {
        String test_env = System.getenv("TEST_ENV");
        System.out.println("test_env = " + test_env);
    }

}

 

https://github.com/Jeong-sky-1003/JUnit5_Study/blob/master/src/test/java/me/jeongsky/inflearnthejavatest/StudyTest_Condition.java

 

GitHub - Jeong-sky-1003/JUnit5_Study

Contribute to Jeong-sky-1003/JUnit5_Study development by creating an account on GitHub.

github.com

 

'Development > Application Test' 카테고리의 다른 글

[JUnit 5] Assertions의 사용  (0) 2022.08.29
[JUnit 5] 테스트 이름 표기하기  (0) 2022.08.14
[JUnit] JUnit 5 (1) 소개  (0) 2022.08.03