JUnit Reference
JUnit 5 테스트 프레임워크 레퍼런스
JUnit Reference 소개
JUnit 5 레퍼런스는 Java 테스팅 프레임워크 JUnit Jupiter의 모든 기능을 아우르는 완전한 검색 가능 가이드입니다. 8개 카테고리 전체를 커버합니다: 어노테이션(@Test, @DisplayName, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll, @Disabled, @Tag, @Timeout), 어설션(assertEquals, assertTrue, assertNull, assertThrows, assertAll, assertArrayEquals, assertIterableEquals), 파라미터화(@ParameterizedTest + @ValueSource·@CsvSource·@EnumSource·@MethodSource·@CsvFileSource), 생명주기(@TestInstance, @TestMethodOrder, @RepeatedTest, TestInfo 주입), 확장(@ExtendWith, BeforeEachCallback, ParameterResolver, @RegisterExtension), 조건부 실행(@EnabledOnOs, @EnabledOnJre, @EnabledIfEnvironmentVariable, @EnabledIf), 네스트(@Nested 중첩 클래스), 설정(Gradle·Maven 의존성, junit-platform.properties, 병렬 실행). 모든 항목에 실행 가능한 Java 코드 예제가 포함되어 있습니다.
이 레퍼런스는 Spring Boot, Quarkus, Micronaut 등 Java 애플리케이션의 단위 테스트를 작성하는 백엔드 개발자, QA 엔지니어, TDD·BDD를 도입하는 개발팀을 위해 만들어졌습니다. JUnit 4에서 마이그레이션하거나 처음 단위 테스트를 작성하는 경우, 또는 CI/CD 파이프라인을 구성하는 경우 모두 이 가이드에서 필요한 구문을 바로 찾을 수 있습니다.
레퍼런스는 8개 카테고리로 명확하게 구분되어 있어 필요한 어설션 메서드, 파라미터화 테스트 데이터 소스 설정 방법, 확장 API 사용법 등을 바로 찾을 수 있습니다. 각 항목은 구문과 독립적으로 이해 가능한 코드 예제를 함께 제공하므로 개념을 이해하고 즉시 적용할 수 있습니다.
주요 기능
- 완전한 JUnit 5 어노테이션 레퍼런스: @Test, @DisplayName, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll, @Disabled, @Tag, @Timeout
- 어설션 메서드와 예제: assertEquals, assertTrue, assertThrows(메시지 캡처 포함), assertAll 그룹 어설션, 배열·이터러블 비교
- 파라미터화 테스트 소스: @ValueSource, @CsvSource(인라인·파일), @EnumSource, Stream<Arguments> 반환 @MethodSource
- 생명주기 제어: 상태 공유를 위한 @TestInstance(PER_CLASS), @Order와 @TestMethodOrder, RepetitionInfo를 활용한 @RepeatedTest
- 확장 API: @ExtendWith, BeforeEachCallback, ParameterResolver, 프로그래밍 방식 @RegisterExtension
- OS(@EnabledOnOs), JRE 버전(@EnabledOnJre), 환경 변수, 사용자 정의 조건 메서드 기반 조건부 테스트 실행
- @Nested 내부 클래스로 관련 테스트 시나리오 구성 및 중첩 @BeforeEach 생명주기 관리
- Gradle·Maven 의존성 설정, junit-platform.properties 기본값, 병렬 실행 설정
자주 묻는 질문
@BeforeEach와 @BeforeAll의 차이는 무엇인가요?
@BeforeEach는 클래스의 모든 개별 테스트 메서드 전에 실행되어 새로운 객체 인스턴스를 준비하는 데 적합합니다. @BeforeAll은 클래스의 모든 테스트 전에 한 번만 실행되며 static으로 선언해야 합니다(@TestInstance(PER_CLASS) 사용 시 제외). 데이터베이스 연결처럼 비용이 큰 설정에 @BeforeAll을 사용하세요.
JUnit 5에서 메서드가 예외를 던지는지 테스트하는 방법은?
assertThrows(예외타입.class, () -> { /* 코드 */ })를 사용하세요. 반환값이 던져진 예외 객체이므로 메시지나 원인도 검증할 수 있습니다: `Exception ex = assertThrows(IllegalArgumentException.class, () -> calc.divide(1, 0)); assertEquals("0으로 나눌 수 없습니다", ex.getMessage());`
JUnit 5에서 여러 입력값으로 같은 테스트를 실행하는 방법은?
@ParameterizedTest와 값 소스 어노테이션을 조합하세요. 단일 값에는 @ValueSource를, 테스트당 여러 파라미터에는 @CsvSource(인라인 CSV) 또는 @CsvFileSource(CSV 파일)를, 복잡한 객체에는 Stream<Arguments>를 반환하는 정적 메서드와 @MethodSource를 사용하세요.
assertAll()이란 무엇이고 언제 사용해야 하나요?
assertAll()은 여러 어설션을 그룹화하여 일부가 실패해도 모두 실행한 뒤 실패 결과를 한꺼번에 보고합니다. 첫 번째 실패에서 멈추는 대신 무엇이 잘못됐는지 전체 그림을 볼 수 있습니다. 객체의 여러 속성을 하나의 테스트에서 검증할 때 사용하세요.
Gradle 프로젝트에서 JUnit 5를 설정하는 방법은?
dependencies 블록에 `testImplementation "org.junit.jupiter:junit-jupiter:5.10.0"`을 추가하고, test 태스크에 `useJUnitPlatform()`을 추가하세요. useJUnitPlatform() 없이는 Gradle이 JUnit 5 테스트를 발견하지 못합니다. Maven은 junit-jupiter 의존성(test 스코프)과 maven-surefire-plugin 설정이 필요합니다.
JUnit 5에서 관련 테스트를 구조화하는 방법은?
@Nested를 사용해 관련 테스트 시나리오를 그룹화하는 내부 클래스를 만드세요. 중첩 클래스는 자체 @BeforeEach와 @AfterEach를 가질 수 있으며 외부 클래스 생명주기와 함께 실행됩니다. WhenEmpty, WhenNotEmpty처럼 다른 상태를 표현하고 읽기 쉬운 계층적 테스트 보고서를 만드는 데 유용합니다.
특정 OS나 Java 버전에서만 테스트를 실행하는 방법은?
조건부 실행 어노테이션을 사용하세요: @EnabledOnOs(OS.LINUX)는 테스트를 Linux로 제한하고, @EnabledOnOs({OS.WINDOWS, OS.MAC})은 여러 플랫폼에서 활성화합니다. @EnabledOnJre(JRE.JAVA_17)은 Java 17에서만 실행됩니다. 환경 기반 조건에는 @EnabledIfEnvironmentVariable(named = "ENV", matches = "staging")을 사용하세요.
JUnit 5에서 병렬 테스트 실행을 활성화하는 방법은?
src/test/resources/junit-platform.properties를 만들고 추가하세요: `junit.jupiter.execution.parallel.enabled = true`, `junit.jupiter.execution.parallel.mode.default = concurrent`, `junit.jupiter.execution.parallel.config.fixed.parallelism = 4`. 병렬 실행은 테스트가 스레드 안전하고 가변 정적 상태를 공유하지 않아야 합니다.