JUnit은 Java 에서 가장 널리 사용되는 테스트 프레임워크이다.
개발자가 작성하는 테스트 코드가 일정한 규칙과 흐름에 맞게 실행될 수 있도록 도와주는 도구이며,
Spring Boot를 포함한 대부분의 Java 기반 애플리케이션에서 표준처럼 사용된다.
JUnit이 제공하는 핵심 기능
- 테스트 자동 실행 (@Test)
- 테스트 라이프사이클 관리 (@BeforeEach, @AfterAll 등)
- Assertion(검증) 지원 (assertThat, assertEquals)
- 테스트 클래스/메서드 분리 및 관리
- 반복 테스트, 예외 테스트 등 다양한 확장 기능 제공
테스트 코드에서의 “생명주기”
테스트 코드를 작성하다 보면 매번 같은 초기화 로직을 반복해야 하는 경우가 많다. 예를 들어,
- 테스트 전에 더미 데이터 세팅
- 서비스/리포지토리 객체 생성
- 테스트 종료 후 자원 정리
이런 작업을 매번 메서드 안에서 직접 작성하면 중복 코드가 늘고 유지보수가 어려워진다.
JUnit은 이런 문제를 해결하기 위해 테스트 실행 전후 시점에 자동으로 호출되는 어노테이션들을 제공한다.
@BeforeEach
@BeforeEach는 각 테스트 메서드가 실행되기 직전에 호출되는 메서드에 붙이는 어노테이션
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class UserServiceTest {
private UserService userService;
@BeforeEach
void setUp() {
userService = new UserService();
System.out.println("테스트 전 초기화");
}
@Test
void testRegister() {
System.out.println("회원 가입 테스트");
}
@Test
void testLogin() {
System.out.println("로그인 테스트");
}
}
실행 순서
테스트 전 초기화
회원 가입 테스트
테스트 전 초기화
로그인 테스트
@BeforeEach는 각 테스트마다 새롭게 실행된다.
테스트 간 데이터 오염을 방지하고, 항상 일관된 초기 상태를 유지하기 위한 핵심 어노테이션이다.
@AfterEach
@AfterEach는 각 테스트 메서드가 끝난 뒤 실행된다.
테스트 수행 후 자원 해제, DB 연결 닫기, 임시 파일 삭제 같은 클린업 용도로 사용된다.
@AfterEach
void tearDown() {
System.out.println("테스트 후 정리");
}
실행 순서 예시
테스트 전 초기화
회원 가입 테스트
테스트 후 정리
테스트 전 초기화
로그인 테스트
테스트 후 정리
@BeforeAll
@BeforeAll은 테스트 클래스의 모든 테스트가 실행되기 전에 1번만 호출된다.
보통 무거운 초기화 로직이나 공용 리소스 세팅에 사용된다.
@BeforeAll
static void beforeAll() {
System.out.println("모든 테스트 시작 전 1회 실행");
}
- 반드시 static 메서드여야 한다.
- DB 연결, 외부 서버 설정, 대용량 데이터 초기화 등에 적합하다.
@AfterAll
@AfterAll은 테스트 전체가 끝난 뒤 1번만 호출된다.
공유 리소스를 해제하거나 로그를 남길 때 유용하다.
@AfterAll
static void afterAll() {
System.out.println("모든 테스트 종료 후 1회 실행");
}
실행 순서 정리
실행 시점 어노테이션 실행 횟수 설명
| 실행 시점 | 어노테이션 | 실행 횟수 | 설명 |
| 전체 테스트 시작 전 | @BeforeAll | 1회 | 클래스 레벨 초기화 (static) |
| 각 테스트 시작 전 | @BeforeEach | 테스트마다 | 매번 새로운 환경 준비 |
| 테스트 실행 | @Test | 테스트마다 | 실제 테스트 수행 |
| 각 테스트 종료 후 | @AfterEach | 테스트마다 | 자원 정리 및 후처리 |
| 전체 테스트 종료 후 | @AfterAll | 1회 | 리소스 해제, 로그 기록 등 |
실제 사용 패턴
대부분의 테스트 클래스는 아래처럼 구성된다.
@TestInstance(TestInstance.Lifecycle.PER_METHOD)
class OrderServiceTest {
@BeforeAll
static void initAll() {
System.out.println("테스트 전체 시작 전");
}
@BeforeEach
void init() {
System.out.println("각 테스트 전");
}
@Test
void placeOrder() {
System.out.println("주문 기능 테스트");
}
@AfterEach
void tearDown() {
System.out.println("각 테스트 후");
}
@AfterAll
static void tearDownAll() {
System.out.println("테스트 전체 종료 후");
}
}
- 모든 테스트에 공통된 세팅이 필요하다면 → @BeforeEach
- DB, 서버, 대용량 데이터 등 공용 리소스 준비가 필요하다면 → @BeforeAll
- 매 테스트 후 정리가 필요하다면 → @AfterEach
- 전체 테스트 종료 후 리소스 해제 → @AfterAll
반응형
'IT > Spring' 카테고리의 다른 글
| CompletableFuture + Spring @Async (0) | 2026.01.02 |
|---|---|
| @Transactional(readOnly = true) (0) | 2025.11.11 |
| H2 인메모리 DB의 동작 원리 (2) | 2025.08.12 |
| Spring Boot에서 @Valid와 @ExceptionHandler로 유효성 검사 에러 처리 (2) | 2025.08.05 |
| Spring Data JPA 페이지네이션(Pagination) 처리 (1) | 2025.07.30 |