| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 정규식
- 문자열
- junit5
- html
- json
- 단위테스트
- 자바스크립트
- math
- 배열
- junit
- 자바문법
- IntelliJ
- 인텔리제이
- list
- input
- CSS
- ArrayList
- 자바
- Array
- java테스트
- string
- Visual Studio Code
- js
- Eclipse
- HashMap
- Java
- javascript
- vscode
- 이클립스
- 테스트자동화
- Today
- Total
어제 오늘 내일
[JUnit5] Assumptions로 조건부 테스트 실행하는 방법 본문
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 사용 시 주의할 점
- 남용 금지
- Assumptions를 너무 많이 사용하면
“어디서 왜 테스트가 스킵됐는지” 추적이 어려워질 수 있습니다. - 정말 환경 의존적인 테스트에만 사용하는 것이 좋습니다.
- Assumptions를 너무 많이 사용하면
- 스킵과 실패를 명확히 구분
- Assumption이 실패하면 테스트는 “실패”가 아니라 “중단(Aborted)”입니다.
- CI에서 실패로 보지 않도록 의도적으로 사용하는 기능이라는 점을 인지해야 합니다.
- 로컬/CI 환경 차이 고려
- 환경 변수, 시스템 속성 등에 의존할 때는
로컬과 CI 환경에서 값이 다를 수 있으므로 문서화와 설정 관리가 필요합니다.
- 환경 변수, 시스템 속성 등에 의존할 때는
- 테스트 독립성은 여전히 중요
- Assumptions는 “실행 여부”만 제어할 뿐,
테스트 간 상태 공유 문제를 해결해주지는 않습니다.
- Assumptions는 “실행 여부”만 제어할 뿐,
7. 정리
- JUnit5 Assumptions는 조건부 테스트 실행을 위한 도구
- assumeTrue, assumeFalse로 “조건을 만족하지 않으면 테스트 전체를 건너뛰기”
- assumingThat으로 “테스트 일부만 조건부 실행”
- 환경, OS, 프로파일 등에 따라 테스트를 선택적으로 실행할 때 매우 유용
- 애너테이션 기반 조건부 실행과 함께 쓰면 테스트 구조를 더 깔끔하게 유지할 수 있음
'IT > JUnit' 카테고리의 다른 글
| [JUnit5] TestReporter로 테스트 실행 정보 기록하기 (0) | 2026.01.16 |
|---|---|
| [JUnit5] TestInfo로 테스트 메타데이터 활용하기 (0) | 2026.01.15 |
| [JUnit] setName() – 테스트 이름 변경하기 (0) | 2026.01.14 |
| [JUnit] getName() – 테스트 이름 가져오기 (0) | 2026.01.14 |
| [JUnit] TestRunner 동작 – 내부 구조 이해하기 (0) | 2026.01.13 |
