어제 오늘 내일

[JUnit5] Assumptions로 조건부 테스트 실행하는 방법 본문

IT/JUnit

[JUnit5] Assumptions로 조건부 테스트 실행하는 방법

hi.anna 2026. 1. 15. 01:19

JUnit5에서는 Assumptions를 사용하면 “특정 조건을 만족할 때만 테스트를 진행하고, 아니면 테스트를 건너뛰는” 방식으로 조건부 테스트를 만들 수 있습니다.
외부 환경, OS, 설정 값 등에 따라 테스트를 선택적으로 실행하고 싶을 때 유용합니다.

아래에서는 JUnit5 Assumptions를 활용해 조건부 테스트를 작성하는 방법을 단계별로 정리합니다.

 

1. Assumptions가 무엇인지 이해하기

JUnit5의 org.junit.jupiter.api.Assumptions 클래스는 다음 상황에서 사용합니다.

  • 요구 환경이 아니면 테스트를 실패로 처리하는 것이 아니라 “스킵” 하고 싶을 때
  • 특정 프로파일(예: dev, prod)이 아닐 때 테스트를 건너뛰고 싶을 때
  • 외부 시스템(예: 외부 API, DB)이 준비되지 않았다면 테스트를 하지 않도록 할 때

Assumption이 참(true) 이면 테스트를 계속 진행하고,
Assumption이 거짓(false) 이면 테스트는 “실패”가 아니라 “중단(Aborted)” 처리됩니다.

JUnit5에서 제공하는 주요 메서드는 다음과 같습니다.

  • Assumptions.assumeTrue(condition, message)
  • Assumptions.assumeFalse(condition, message)
  • Assumptions.assumingThat(condition, executable)

 

2. assumeTrue()로 조건이 참일 때만 테스트 실행하기

assumeTrue()는 조건이 true일 때만 테스트를 계속 진행합니다.
조건이 false면 테스트는 중단되고, 결과에서 “skipped/aborted”로 표시됩니다.

예제: 환경 변수가 DEV일 때만 테스트 실행

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledOnOs;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Assumptions;

class AssumptionTest {

    @Test
    void onlyOnDevProfile() {
        String profile = System.getenv("APP_PROFILE"); // 예: DEV, STAGE, PROD

        // APP_PROFILE이 DEV가 아니면 이 테스트는 건너뜀
        Assumptions.assumeTrue("DEV".equals(profile), 
                () -> "DEV 환경이 아니므로 테스트를 건너뜁니다. 현재 프로파일=" + profile);

        // 여기부터는 DEV 환경일 때만 실행됨
        Assertions.assertEquals(4, 2 + 2);
    }
}

설명

  • assumeTrue 조건이 만족되지 않으면 이후 코드는 실행되지 않고 테스트가 중단
  • 로컬 개발 환경에서만 돌려보고 싶은 테스트에 유용

 

3. assumeFalse()로 특정 조건에서만 건너뛰기

assumeFalse()는 조건이 false일 때만 테스트를 계속 실행합니다.
조건이 true면 테스트를 중단합니다.

예제: 운영(PROD) 환경에서는 위험한 테스트 건너뛰기

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.Assertions;

class ProdSafeTest {

    @Test
    void notOnProd() {
        String profile = System.getenv("APP_PROFILE"); // 예: DEV, STAGE, PROD

        // PROD 환경이면 이 테스트는 건너뜀
        Assumptions.assumeFalse("PROD".equals(profile),
                () -> "PROD 환경에서는 이 테스트를 실행하지 않습니다.");

        // PROD가 아닐 때만 실행되는 테스트 로직
        Assertions.assertTrue(true);
    }
}

설명

  • 운영 환경에서는 돌리면 위험한 테스트(데이터 삭제, 대량 Insert 등)를 보호하는 용도로 사용 가능

 

4. assumingThat()으로 일부 코드만 조건부 실행하기

assumingThat()은 테스트 전체가 아니라 테스트 본문 중 일부만 조건부로 실행하고 싶을 때 사용합니다.
조건이 false여도 테스트 전체가 중단되지는 않고, 해당 블록만 건너뜁니다.

예제: OS별로 추가 검사만 다르게 실행하기

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.Assertions;

class AssumingThatTest {

    @Test
    void osSpecificCheck() {
        String osName = System.getProperty("os.name").toLowerCase();

        // 공통 검증
        int result = 2 + 3;
        Assertions.assertEquals(5, result);

        // 윈도우일 때만 추가 검증 실행
        Assumptions.assumingThat(osName.contains("win"), () -> {
            System.out.println("윈도우 환경에서만 실행되는 추가 검증");
            Assertions.assertTrue(osName.contains("win"));
        });

        // assumingThat 조건이 false여도 이 아래 코드는 계속 실행됨
        Assertions.assertNotNull(osName);
    }
}

설명

  • assumingThat은 “테스트 전체 스킵”이 아니라 “해당 람다 블록만 조건부 실행”
  • 일부 환경 전용 추가 검증을 넣을 때 깔끔하게 표현 가능

 

5. Assumptions vs @EnabledOnOs/@DisabledOnOs 차이

JUnit5에는 Assumptions 말고도 조건부 실행을 위한 애너테이션이 있습니다.

  • @EnabledOnOs, @DisabledOnOs
  • @EnabledOnJre, @DisabledOnJre
  • @EnabledIfEnvironmentVariable, @DisabledIfEnvironmentVariable 등

이 애너테이션들은 테스트 메서드/클래스 단위로 조건을 선언적으로 지정하는 방식이고,
Assumptions는 테스트 내부에서 코드로 유연하게 조건을 제어하는 방식입니다.

정리하면

  • 애너테이션 기반: “이 테스트 자체를 특정 조건에서만 실행/비활성화”
  • Assumptions: “테스트 안에서 상황을 보고 일부 또는 전체를 건너뛰기”

둘을 함께 적절히 섞어서 사용하면 가장 깔끔한 구조를 만들 수 있습니다.

 

6. Assumptions 사용 시 주의할 점

  1. 남용 금지
    • Assumptions를 너무 많이 사용하면
      “어디서 왜 테스트가 스킵됐는지” 추적이 어려워질 수 있습니다.
    • 정말 환경 의존적인 테스트에만 사용하는 것이 좋습니다.
  2. 스킵과 실패를 명확히 구분
    • Assumption이 실패하면 테스트는 “실패”가 아니라 “중단(Aborted)”입니다.
    • CI에서 실패로 보지 않도록 의도적으로 사용하는 기능이라는 점을 인지해야 합니다.
  3. 로컬/CI 환경 차이 고려
    • 환경 변수, 시스템 속성 등에 의존할 때는
      로컬과 CI 환경에서 값이 다를 수 있으므로 문서화와 설정 관리가 필요합니다.
  4. 테스트 독립성은 여전히 중요
    • Assumptions는 “실행 여부”만 제어할 뿐,
      테스트 간 상태 공유 문제를 해결해주지는 않습니다.

 

7. 정리

  • JUnit5 Assumptions는 조건부 테스트 실행을 위한 도구
  • assumeTrue, assumeFalse로 “조건을 만족하지 않으면 테스트 전체를 건너뛰기”
  • assumingThat으로 “테스트 일부만 조건부 실행”
  • 환경, OS, 프로파일 등에 따라 테스트를 선택적으로 실행할 때 매우 유용
  • 애너테이션 기반 조건부 실행과 함께 쓰면 테스트 구조를 더 깔끔하게 유지할 수 있음

 

 

반응형
Comments