[JUnit] How - @BeforeEach, @AfterEach, @BeforeAll, @AfterAll

하쮸·2025년 8월 19일

Error, Why, What, How

목록 보기
26/64

1. @BeforeEach

  • JUnit5에서 제공하는 에노테이션임.
  • 각 테스트 메서드(@Test 에노테이션이 붙은 메서드)가 실행되기 직전마다 호출할 메서드에 붙임.
@SpringBootTest
class ApplicationTests {

    @BeforeEach
    void setUp() {
        System.out.println("BeforeEach 실행");
    }

    @Test
    void test1() {
        System.out.println("테스트1 실행");
    }

    @Test
    void test2() {
        System.out.println("테스트2 실행");
    }
}
- 실행 결과 -

BeforeEach 실행
테스트1 실행
BeforeEach 실행
테스트2 실행
  • 즉, @Test에노테이션이 붙은 테스트 메서드가 실행되기 전에 해야할 작업들을 먼저 처리하는 용도로 사용하면 됨.

  • @BeforeEach는 각 테스트간의 독립성을 위해 각 테스트 메서드가 실행될 때마다 초기화 되어야 하는작업 등을 설정하기 위해 사용함.


2. @AfterEach

  • 각 테스트 메서드가 실행된 이후 그 다음 작업을 수행하는 역할을 함.
    • 코드를 작성하다보면 리소스를 반환해야 하는 경우(Ex. close() 메서드)가 생기는데 이럴때 사용하면 유용함.
@SpringBootTest
class ApplicationTests {

    @AfterEach
    void teardown() {
        System.out.println("AfterEach 실행");
    }

    @Test
    void test1() {
        System.out.println("테스트1 실행");
    }

    @Test
    void test2() {
        System.out.println("테스트2 실행");
    }
}
- 실행 결과 - 

테스트1 실행
AfterEach 실행
테스트2 실행
AfterEach 실행

3. @BeforeAll

  • @BeforeAll을 사용하면 테스트가 실행되기 전 단 한번만 실행돼서 모든 테스트에 필요한 데이터를 제공할 때 또는 테스트에서 사용할 불변값을 세팅할 때 사용함.
    • 정적(static)메서드로 선언.
@SpringBootTest
class ApplicationTests {

    @BeforeAll
    static void BeforeAllTest() {
        System.out.println("BeforeAll 실행");
    }

    @Test
    void test1() {
        System.out.println("테스트1 실행");
    }

    @Test
    void test2() {
        System.out.println("테스트2 실행");
    }
}
- 실행결과 - 

BeforeAll 실행
테스트1 실행
테스트2 실행

4. @AfterAll

  • @AfterAll은 모든 테스트의 실행이 끝난 이후 단 한번만 실행됨.
    • 정적(static)메서드로 선언.
@SpringBootTest
class ApplicationTests {

    @AfterAll
    static void BeforeAllTest() {
        System.out.println("AfterAll 실행");
    }

    @Test
    void test1() {
        System.out.println("테스트1 실행");
    }

    @Test
    void test2() {
        System.out.println("테스트2 실행");
    }
}
- 실행결과 -

테스트1 실행
테스트2 실행
AfterAll 실행

5. @BeforeAll, @AfterAll을 static으로 선언하는 이유.

  • 테스트 인스턴스에 종속되지 않음.
    • 테스트 클래스 내의 각 테스트 메서드들이 실행될 때마다 JUnit은 새로운 테스트 인스턴스(객체)를 생성함.
@SpringBootTest
class ApplicationTests {

    @BeforeEach
    void setUp() {
        System.out.println(this);
    }

    @Test
    void test1() {
        System.out.println("테스트1 실행");
    }

    @Test
    void test2() {
        System.out.println("테스트2 실행");
    }
}
- 실행결과 -

com.project.ApplicationTests@3bd1c7f0
테스트1 실행
com.project.ApplicationTests@6b6d8671
테스트2 실행
  • @BeforeAll@AfterAll은 모든 개별 테스트 인스턴스들이 생성되기 전이나 모두 소멸된 후에 단 한 번만 실행되어야 하는 메서드임.
    그래서 특정 테스트 인스턴스에 종속되지 않는 정적(static) 메서드로 선언되어야함.

  • 클래스 로딩 시점.
    • static 메서드는 클래스가 메모리에 로딩되는 시점에 이미 존재함.
    • JUnit이 테스트 클래스를 로딩할 때 @BeforeAll 메서드가 static 메서드라는 것을 인지하고 개별 테스트 인스턴스를 생성하기 전에 이 메서드를 호출할 수 있음.
      마찬가지로 모든 테스트가 끝난 후에 인스턴스가 없는 상태에서 @AfterAll 메서드를 호출할 수 있음.

6. 참고.

profile
Every cloud has a silver lining.

0개의 댓글