JUnit User Guide
Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo
docs.junit.org
Overview
JUnit이란?
JUnit은 세 개의 하위 프로젝트로 구성된 여러 모듈로 이루어진 테스트 프레임워크이다.
JUNIT 6.0.0 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit Platform
- JVM에서 테스트 프레임워크를 실행하기 위한 기반을 제공한다. 또한 `TestEngine` API를 정의하여 플랫폼 위에서 실행되는 테스트 프레임워크 개발을 지원한다.
- 추가로, 콘솔에서 플랫폼을 실행할 수 있는 Console Launcher와 하나 이상의 테스트 엔진을 사용해 커스텀 테스트 스위트를 실행할 수 있는 JUnit Platform Suite Engine도 제공한다.
- IntelliJ IDEA, Eclipse, NetBeans, Visual Studio Code 같은 주요 IDE와 Gradle, Maven, Ant 같은 빌드 도구에서도 JUnit Platform을 1급으로 지원한다.
JUnit Jupiter
- JUnit 테스트를 작성하고 확장을 구현하기 위한 프로그래밍 모델과 확장 모델을 제공한다.
- Jupiter 하위 프로젝트는 플랫폼 위에서 Jupiter 기반 테스트를 실행하기 위한 TestEngine을 포함한다.
JUnit Vintage
- JUnit 3와 JUnit 4 기반의 테스트를 실행할 수 있는 TestEngine을 제공한다.
- JUnit 4.12 이상이 클래스패스 또는 모듈 패스에 존재해야 한다.
- 다만, Vintage 엔진은 더 이상 사용이 권장되지 않으며, JUnit Jupiter 또는 플랫폼을 직접 지원하는 다른 테스트 프레임워크로의 마이그레이션 과정에서만 임시로 사용해야 한다.
지원되는 버전
JUnit은 런타임에 Java 17 이상이 필요하다. 하지만, 이전 JDK 버전으로 컴파일된 코드에 대한 테스트 실행은 여전히 가능하다.
도움받기
JUnit 관련 질문은 다음에서 할 수 있다.
Annotations
JUnit Jupiter는 테스트 구성 및 프레임워크 확장을 위해 다음 어노테이션들을 지원한다.
별도 언급이 없다면, 모든 핵심 어노테이션은 `junit-jupiter-api` 모듈의 `org.junit.jupiter.api` 패키지에 있다.
@Test
- 메서드가 테스트 메서드임을 나타낸다.
- JUnit 4의 `@Test`와 달리 속성을 선언하지 않는다. 이는 JUnit Jupiter에서 확장이 자체 전용 어노테이션을 기반으로 동작하기 때문이다.
- 이런 메서드는 오버라이드되지 않는 한 상속된다.
@Parameterized Test
- 메서드가 매개변수화 테스트임을 나타낸다. 오버라이드되지 않는 한 상속된다.
@RepeatedTest
- 메서드가 반복 테스트용 테스트 템플릿임을 나타낸다. 오버라이드되지 않는 한 상속된다.
@TestFactory
- 메서드가 동적 테스트를 위한 테스트 팩토리임을 나타낸다. 오버라이드되지 않는 한 상속된다.
@TestTemplate
- 등록된 공급자들이 반환하는 호출 컨텍스트 수에 따라 여러 번 호출되도록 설계된 테스트 케이스의 템플릿임을 나타낸다. 오버라이드되지 않는 한 상속된다.
@TestClassOrder
- 어노테이션에 달린 테스트 클래스 내 `Nested` 테스트 클래스들의 실행 순서를 구성한다.
- 이런 어노테이션은 상속된다.
@TestMethodOrder
- 어노테이션이 달린 테스트 클래스의 테스트 메서드 실행 순서를 구성한다. (JUnit 4의 `@FixMethodOrder`와 유사
- 이런 어노테이션은 상속된다.
@TestInstance
- 어노테이션이 달린 테스트 클래스의 테스트 인스턴스 생명주기를 구성한다.
- 이런 어노테이션은 상속된다.
@DisplayName
- 테스트 클래스나 테스트 메서드의 표시 이름을 지정한다.
- 상속되지 않는다.
@DisplayNameGenerator
- 테스트 클래스의 커스텀 표시 이름 생성기를 지정한다.
- 상속되지 않는다.
@BeforeEach
- 현재 클래스의 각 `@Test`, `@RepeatedTest`, `@ParameterizedTest`, `@TestFactory` 메서드 전에 실행된다. (JUnit 4의 `@Before`과 유사)
- 오버라이드되지 않는 한 상속된다.
@AfterEach
- 현재 클래스의 각 `@Test`, `@RepeatedTest`, `@ParameterizedTest`, `@TestFactory` 메서드 후에 실행된다. (JUnit 4의 `@After`와 유사)
- 오버라이드되지 않는 한 상속된다.
@BeforeAll
- 현재 최상위 또는 `@Nested` 테스트 클래스의 모든 `@Test`, `@RepeatedTest`, `@ParameterizedTest`, `@TestFactory` 메서드 전에 실행된다. (JUnit 4의 `@BeforeClass`와 유사)
- 오버라이드되지 않는 한 상속된다.
- 테스트 인스턴스 생명주기가 "per-class"가 아닌 경우 정적이어야 한다.
@AfterAll
- 현재 최상위 또는 `@Nested` 테스트 클래스의 모든 `@Test`, `@RepeatedTest`, `@ParameterizedTest`, `@TestFactory` 메서드 후에 실행된다. (JUnit 4의 `@AfterClass`와 유사)
- 오버라이드되지 않는 한 상속된다.
- 테스트 인스턴스 생명주기가 "per-class"가 아닌 경우 정적이어야 한다.
@ParameterizedClass
- 어노테이션에 달린 클래스가 매개변수화 클래스임을 나타낸다.
- 상속된다.
@BeforeParameterizedClassInvocation
- 매개변수화 클래스의 각 호출 전에 1회 실행할 메서드임을 나타낸다.
- 오버라이드되지 않는 한 상속된다.
@AfterParameterizedClassInvocation
- 매개변수화 클래스의 각 호출 후에 1회 실행할 메서드임을 나타낸다.
- 오버라이드되지 않는 한 상속된다.
@ClassTemplate
- 등록된 공급자들이 반환하는 호출 컨텍스트 수에 따라 여러 번 실행되도록 설계된 테스트 클래스 템플릿임을 나타낸다.
- 상속된다.
@Nested
- 어노테이션이 달린 클래스가 비정적 중첩 테스트 클래스임을 나타낸다.
- 상속되지 않는다.
@Tag
- 테스트 필터링을 위한 태그를 클래스 또는 메서드 수준에서 선언한다. (TestNG의 그룹, JUnit 4의 Categories 유사)
- 클래스 수준에서는 상속, 메서드 수준에서는 상속되지 않음.
@Disabled
- 테스트 클래스나 테스트 메서드를 비활성화한다. (JUnit 4의 `@Ignore` 유사)
- 상속되지 않는다.
@AutoClose
- 어노테이션이 달린 필드가 테스트 실행 후 자동으로 close될 리소스임을 나타낸다. 필드는 상속된다.
@Timeout
- 특정 기간을 초과하면 테스트, 테스트 팩토리, 테스트 템플릿, 생명 주기 메서드를 실패로 처리한다.
- 상속된다.
@TempDir
- 테스트 클래스 생성자, 생명주기 메서드, 테스트 메서드에서 필드 주입 또는 파라미터 주입을 통해 임시 디렉터리를 제공한다.
- `org.junit.jupiter.api.io` 패키지에 있다.
- 필드는 상속된다.
@ExtendWith
- 확장(Extension)을 선언적으로 등록한다.
- 상속된다.
@RegisterExtension
- 필드를 통해 확장을 프로그래밍 방식으로 등록한다.
- 필드는 상속된다.
일부 어노테이션은 실험적일 수 있다. 자세한 내용은 Experimental APIs의 표를 확인하면 된다.
메타 어노테이션과 합성 어노테이션
JUnit Jupiter의 어노테이션은 메타 어노테이션으로 사용할 수 있다. 즉, 자신의 합성 어노테이션을 정의해 메타 어노테이션의 의미를 자동으로 상속시킬 수 있다.
예를 들어, 코드 전반에 `@Tag("fast")`를 복사/붙여넣기 하는 대신 다음과 같이 `@Fast`라는 합성 어노테이션을 만들 수 있다. 이후 `@Fast`는 `@Tag("fast")` 의 대체로 사용할 수 있다.
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.junit.jupiter.api.Tag;
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
public @interface Fast {
}
아래 `@Test` 메서드는 `@Fast` 사용 예시이다.
@Fast
@Test
void myFastTest() {
// ...
}
한 걸음 더 나아가 `@Tag("fast")`와 `@Test`를 동시에 대체하는 커스텀 `@FastTest` 어노테이션을 만들 수도 있다.
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Tag("fast")
@Test
public @interface FastTest {
}
JUnit은 다음과 같이 "fast"가 달린 `@Test` 메서드로 자동 인식한다.
@FastTest
void myFastTest() {
// ...
}
용어 정리
JUnit 4에서 마이그레이션
테스트 실행하기
확장 모델
고급 주제
API 진화
기여자
릴리즈 노트
부록
'Spring' 카테고리의 다른 글
| [JUnit] @Parameterized Test (0) | 2025.10.19 |
|---|---|
| TDD (Test-Driven-Development) (0) | 2025.10.16 |
| [Spring] FCM으로 푸시 알림 보내기 (0) | 2025.05.06 |
| [Spring] 애플 로그인 구현 (0) | 2025.04.23 |
| [Spring] @Controller vs RestController (0) | 2024.07.11 |