IT/Spring

JUnit의 테스트 생명주기 어노테이션

iamhyeon 2025. 11. 30. 14:22

 

 

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

 

반응형