반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- junit
- json
- 문자열
- HashMap
- 정규식
- 배열
- Eclipse
- vscode
- 자바문법
- IntelliJ
- 테스트자동화
- java테스트
- list
- string
- junit5
- 자바
- CSS
- 인텔리제이
- 이클립스
- Java
- javascript
- input
- Visual Studio Code
- html
- math
- ArrayList
- js
- Array
- 단위테스트
- 자바스크립트
Archives
- Today
- Total
어제 오늘 내일
[JUnit5] DynamicTest로 동적 테스트 생성하기 본문
JUnit5에서는 테스트 메서드가 컴파일 시점에 고정되지 않고, 실행 시점(Runtime)에 테스트를 동적으로 생성할 수 있는 기능을 제공합니다. 이를 Dynamic Test라고 하며, DynamicTest 및 @TestFactory를 통해 구현합니다.
동적 테스트는 특히 반복 패턴 테스트, 입력값 조합 테스트, 데이터 기반 테스트(data-driven test) 등에 강력하게 활용됩니다.
아래에서는 DynamicTest의 개념, 기본 사용법, 실전 예제까지 순서대로 정리합니다.
1. DynamicTest란?
DynamicTest는 테스트 메서드가 고정된 정적 테스트(@Test)와 달리, 실행 중에 테스트 인스턴스를 생성하여 실행하는 테스트 방식입니다.
특징
- @TestFactory 메서드를 통해 동적 테스트를 반환
- 메서드는 void가 아니라 DynamicTest 컬렉션을 반환
- 테스트 이름과 실행 코드(Executable)를 함께 구성
- 정적 테스트와 달리 라이프사이클(@BeforeEach 등)이 동일하게 적용되지 않음
- 실행 시점에 테스트가 몇 개 만들어질지 달라질 수 있음
DynamicTest는 정적 테스트로 표현하기 어려운 반복 테스트나 다양한 입력 조합 테스트에 적합합니다.
2. 가장 기본적인 DynamicTest 사용 예제
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class DynamicTestBasic {
@TestFactory
List<DynamicTest> dynamicTests() {
return List.of(
DynamicTest.dynamicTest("1 + 1 = 2", () -> assertEquals(2, 1 + 1)),
DynamicTest.dynamicTest("2 * 3 = 6", () -> assertEquals(6, 2 * 3))
);
}
}
설명
- @TestFactory를 사용하면 정적 테스트가 아니라 “테스트 생성 메서드”가 됨
- DynamicTest는 "테스트 이름 + 실행 로직"으로 구성
- 반환 타입은 List, Collection, Stream 모두 가능
3. Stream을 사용한 DynamicTest 생성
대량의 테스트를 만들 때 Stream이 매우 유용합니다.
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.*;
class DynamicTestStreamExample {
@TestFactory
Stream<DynamicTest> generateMultiplicationTests() {
return IntStream.range(1, 6).mapToObj(n ->
DynamicTest.dynamicTest(n + " * 2 테스트", () ->
assertEquals(n * 2, n * 2)
)
);
}
}
설명
- 테스트 개수가 입력값에 따라 동적으로 생성
- 입력값을 기반으로 반복 테스트 작성 가능
4. 여러 입력값 조합 테스트(매우 실용적)
테스트 데이터가 여러 개 있을 때 DynamicTest는 완벽한 선택입니다.
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import java.util.List;
import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.*;
class DynamicWithInputTest {
@TestFactory
Stream<DynamicTest> dynamicInputTests() {
List<String> inputs = List.of("hello", "junit", "dynamic");
return inputs.stream()
.map(text ->
DynamicTest.dynamicTest(text + " 길이 테스트", () ->
assertTrue(text.length() > 0)
));
}
}
활용 예
- 회원 데이터 목록 테스트
- CSV 기반 입력 테스트
- API 응답 케이스 테스트
5. DynamicTest와 @BeforeEach, @AfterEach 차이
중요 개념!
DynamicTest는 정적 테스트처럼 @BeforeEach / @AfterEach가 자동 적용되지 않습니다.
즉, 다음은 적용되지 않음:
@BeforeEach
void setup() { ... } // → DynamicTest에는 적용 X
필요하면 동적 테스트 안에서 직접 초기화해야 합니다.
DynamicTest가 테스트 수명주기(Lifecycle)를 완전히 따르지 않는다는 점을 반드시 인지해야 합니다.
6. DynamicContainer로 테스트 그룹 만들기
DynamicTest 외에도 DynamicContainer로 테스트 묶음을 만들 수도 있습니다.
import org.junit.jupiter.api.DynamicContainer;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import java.util.List;
class DynamicContainerExample {
@TestFactory
DynamicContainer groupedTests() {
return DynamicContainer.dynamicContainer("문자열 테스트 묶음",
List.of(
DynamicTest.dynamicTest("빈 문자열 체크", () -> assertEquals("", "")),
DynamicTest.dynamicTest("대문자 변환", () -> assertEquals("ABC", "abc".toUpperCase()))
)
);
}
}
효과
- 테스트 그룹 단위로 트리 구조가 표시됨
- 테스트 묶음 단위 문서화 및 관리에 좋음
7. DynamicTest 사용 시 주의할 점
- BeforeEach/AfterEach가 적용되지 않음
- 모든 초기화는 테스트 내부에서 직접 수행해야 함
- 테스트 개수는 실행 전에 확정되지 않을 수 있음
- 테스트 실행 도구가 테스트 개수를 먼저 계산할 수 없음
- 테스트 이름은 반드시 의미 있게 설정할 것
- 데이터 기반 테스트에서 실패 시 원인을 빠르게 파악할 수 있음
- 데이터 준비 과정에서 예외가 발생하면 테스트 생성 자체가 실패함
- 생성 로직 안정성 확보 필요
- @TestFactory는 반드시 비-void 타입이어야 함
- 테스트 컬렉션 반환 필수
8. 정리
- DynamicTest는 JUnit5의 동적 테스트 기능으로
실행 중 테스트를 생성하여 유연한 테스트 구조를 구현할 수 있음 - @TestFactory 사용 → DynamicTest 반환
- 반복 테스트, 데이터 기반 테스트, 시나리오 생성에 유용
- 정적 테스트와 달리 라이프사이클 훅이 적용되지 않으므로 초기화 방법에 주의해야 함
반응형
'IT > JUnit' 카테고리의 다른 글
| [JUnit5] ExtensionContext로 테스트 실행 컨텍스트 다루기 (0) | 2026.01.17 |
|---|---|
| [JUnit5] BeforeEachCallback·AfterEachCallback 확장 포인트 이해 (0) | 2026.01.17 |
| [JUnit5] TestReporter로 테스트 실행 정보 기록하기 (0) | 2026.01.16 |
| [JUnit5] TestInfo로 테스트 메타데이터 활용하기 (0) | 2026.01.15 |
| [JUnit5] Assumptions로 조건부 테스트 실행하는 방법 (0) | 2026.01.15 |
Comments
