어제 오늘 내일

[JUnit] @BeforeAll – 테스트 시작 전 한 번만 수행되는 작업 본문

IT/JUnit

[JUnit] @BeforeAll – 테스트 시작 전 한 번만 수행되는 작업

hi.anna 2026. 1. 10. 01:26

여러 테스트를 실행할 때, 공통으로 필요한 준비 작업이 있다면 매 테스트마다 반복할 필요가 없습니다. 예를 들어 무거운 리소스 초기화, DB 연결 설정, 환경 설정 로드처럼 비용이 큰 작업이라면 한 번만 실행하는 것이 훨씬 효율적입니다. JUnit에서는 이를 위해 @BeforeAll 기능을 제공합니다.

이 글에서는 @BeforeAll의 역할과 특징, 그리고 실전 예제 중심으로 쉽게 설명합니다.

 

1. @BeforeAll이란?

@BeforeAll이 붙은 메서드는 테스트 클래스가 실행되기 전 딱 한 번만 실행되는 준비 코드입니다.
테스트 전체에서 공통으로 사용할 리소스나 설정을 초기화할 때 매우 유용합니다.

실행 타이밍

  • 테스트 클래스 로딩 → @BeforeAll 실행(1회) → 각 테스트 메서드 실행

 

2. @BeforeAll 사용 조건

JUnit5에서는 다음 조건을 만족해야 실행됩니다.

  1. 메서드는 static이어야 함
    → 테스트 인스턴스가 생성되기 전에 실행되기 때문
  2. 반환 타입은 void
  3. 인자가 없는 형태로 선언하는 것이 일반적

단, 테스트 클래스에 @TestInstance(TestInstance.Lifecycle.PER_CLASS)를 붙이면 static이 아니어도 실행 가능합니다.

기본 형태

@BeforeAll
static void initAll() {
    // 테스트 전체에서 공통으로 사용할 자원 초기화
}

3. 예제: 무거운 초기 작업을 @BeforeAll에서 처리하기

아래 예제는 테스트 전체에서 사용할 데이터베이스 연결 설정을 한 번만 준비하는 경우입니다.

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

class DatabaseTest {

    private static DatabaseConnection connection;

    @BeforeAll
    static void setUpBeforeClass() {
        connection = new DatabaseConnection();
        connection.connect();  // 무거운 연결 설정
    }

    @Test
    void testSelect() {
        String result = connection.select("SELECT name FROM user WHERE id = 1");
        assertEquals("Tom", result);
    }

    @Test
    void testInsert() {
        boolean success = connection.insert("INSERT INTO user(name) VALUES('Bob')");
        assertTrue(success);
    }
}

코드 설명

  • DatabaseConnection은 테스트 전 한 번만 생성
  • 모든 테스트는 동일한 연결을 사용
  • 실행 속도 향상 + 자원 낭비 감소

 

4. @BeforeAll 사용 시 주의할 점

  1. 전역 상태 공유 주의
    • 테스트 간 영향을 줄 수 있으므로 가능한 불변 데이터나 읽기 전용 리소스에 사용
    • mutable 데이터를 공유하면 테스트 순서에 따라 결과가 달라질 수 있음
  2. 테스트 독립성 유지
    • @BeforeAll에서 생성한 자원을 테스트들이 수정하지 않도록 주의
    • 필요하면 각 테스트가 사용할 객체는 별도로 생성
  3. 무거운 작업만 넣기
    • 가벼운 초기화는 @BeforeEach로 넘기는 것이 테스트 독립성에 유리
  4. 마지막 정리는 @AfterAll 사용
    • @BeforeAll에서 생성한 리소스는 @AfterAll에서 깔끔하게 정리해야 메모리 누수 방지

 

@AfterAll 예시

@AfterAll
static void tearDownAll() {
    connection.close();
}

 

5. 요약

  • @BeforeAll은 테스트 클래스 전체에서 1번만 실행되는 초기 코드
  • 무거운 리소스 초기화에 적합
  • static 메서드여야 하며, 클래스 생명주기 설정으로 비-static도 가능
  • 데이터 공유로 인해 테스트 간 영향을 주지 않도록 주의

 

반응형
Comments