어제 오늘 내일

[JUnit] setUp() & tearDown() - 테스트 준비와 정리 단계 이해하기 본문

IT/JUnit

[JUnit] setUp() & tearDown() - 테스트 준비와 정리 단계 이해하기

hi.anna 2026. 1. 9. 08:26

초보자들이 JUnit 테스트 코드를 작성할 때 가장 먼저 이해해야 하는 개념 중 하나가 테스트 실행 전후에 공통으로 필요한 작업을 어떻게 처리하느냐입니다. JUnit은 이를 위해 @BeforeEach(setUp), @AfterEach(tearDown)라는 매우 직관적인 기능을 제공합니다. 이 글에서는 두 기능의 역할과 사용법을 예제 코드와 함께 정리합니다.

 

1. setUp()과 tearDown()이 필요한 이유

테스트를 여러 개 작성하다 보면, 모든 테스트에서 반복적으로 필요한 준비 코드가 생깁니다. 예를 들면 객체 생성, DB 연결 준비, 임시 파일 생성 등이 있습니다.
또한 테스트가 끝난 후에는 리소스 해제 또는 정리 작업이 필요할 수 있습니다.

이때 매 테스트마다 동일한 준비/정리 코드를 복붙하면

  • 코드 중복 증가
  • 유지보수 어려움
  • 테스트 가독성 저하
    등의 문제점이 발생합니다.

이 문제를 해결하는 것이 setUp()과 tearDown()입니다.

 

2. @BeforeEach(setUp) – 각 테스트 실행 전에 실행되는 준비 코드

@BeforeEach가 붙은 메서드는 각 테스트가 실행되기 전에 자동으로 호출됩니다.
공통 인스턴스를 준비하거나 초기값을 세팅하는 작업을 넣으면 좋습니다.

예제 코드

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

class CalculatorTest {

    private Calculator calculator;

    @BeforeEach
    void setUp() {
        calculator = new Calculator(); // 테스트마다 새로운 Calculator 생성
    }

    @Test
    void testAdd() {
        int result = calculator.add(5, 3);
        assertEquals(8, result);
    }

    @Test
    void testSubtract() {
        int result = calculator.subtract(10, 4);
        assertEquals(6, result);
    }
}

설명

  • setUp()은 테스트가 실행될 때마다 새로 호출됩니다.
  • 객체 상태가 공유되지 않기 때문에 테스트 간 영향이 사라져 독립적인 테스트가 됩니다.

 

3. @AfterEach(tearDown) – 각 테스트 실행 후 정리 작업 수행

테스트가 끝난 후 파일 삭제, 메모리 정리, 연결 종료 같은 정리 작업이 필요할 때 사용합니다.

예제 코드

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

class FileServiceTest {

    private TempFileService fileService;

    @BeforeEach
    void setUp() {
        fileService = new TempFileService();
        fileService.createTempFile();
    }

    @AfterEach
    void tearDown() {
        fileService.deleteTempFile(); // 테스트마다 생성된 파일 정리
    }

    @Test
    void testFileWrite() {
        fileService.write("hello");
        String text = fileService.read();
        assertEquals("hello", text);
    }
}

설명

  • 테스트마다 임시 파일을 생성하고 삭제하므로 부작용 없이 테스트가 반복 가능
  • 테스트 실행 환경을 더 깨끗하게 유지할 수 있음

 

4. setUp() & tearDown() 사용 시 주의할 점

  1. 상태 공유 금지
  • 전역(static) 변수 사용은 테스트 간 영향을 줄 수 있으므로 지양
  • 매 테스트마다 새로운 객체 생성이 가장 안전
  1. 무거운 작업 최소화
  • 파일 IO, 네트워크 호출 같은 무거운 초기화는 BeforeEach보다 BeforeAll에서 한 번만 하는 것이 좋음
  • 하지만 BeforeAll은 static 메서드 제약이 있으므로 상황에 맞게 선택
  1. 테스트 독립성 유지가 최우선
  • 한 테스트의 결과가 다른 테스트에 영향을 주지 않도록 항상 초기화를 잘 설계해야 함

 

5. setUp/tearDown이 주는 이점 요약

  • 테스트 코드 가독성 ↑
  • 중복 코드 ↓
  • 테스트 실행 환경이 항상 동일하게 유지됨
  • 유지보수 편의성 향상

 

반응형
Comments