개발/자바

JUnit 4 vs JUnit 5 어노테이션 비교

피터JK 2025. 2. 14. 14:38
728x90

JUnit 4와 JUnit 5에서 사용하는 어노테이션(Annotations) 및 예제 코드를 정리해 보겠습니다.


📌 JUnit 4 vs JUnit 5 어노테이션 비교

기능 JUnit 4 (org.junit.*)   JUnit 5 (org.junit.jupiter.api.*)
테스트 메서드 지정 @Test @Test
테스트 실행 전 @Before @BeforeEach
테스트 실행 후 @After @AfterEach
모든 테스트 실행 전 @BeforeClass @BeforeAll
모든 테스트 실행 후 @AfterClass @AfterAll
테스트 비활성화 @Ignore @Disabled
예외 발생 예상 @Test(expected = Exception.class) assertThrows(Exception.class, () -> {...}) 사용
타임아웃 @Test(timeout = 1000) assertTimeout(Duration.ofMillis(1000), () -> {...}) 사용
반복 실행 - @RepeatedTest(5)
조건부 실행 - @EnabledIf, @DisabledIf, @EnabledOnOs, @EnabledOnJre 등

📌 JUnit 4 샘플 코드

import org.junit.*;

public class JUnit4Example {

    @BeforeClass
    public static void beforeClass() {
        System.out.println("📌 모든 테스트 실행 전 (한 번 실행)");
    }

    @AfterClass
    public static void afterClass() {
        System.out.println("📌 모든 테스트 실행 후 (한 번 실행)");
    }

    @Before
    public void setUp() {
        System.out.println("🔄 각 테스트 실행 전");
    }

    @After
    public void tearDown() {
        System.out.println("🔄 각 테스트 실행 후");
    }

    @Test
    public void testAddition() {
        Assert.assertEquals(5, 2 + 3);
    }

    @Test(expected = ArithmeticException.class) // 예외 발생 테스트
    public void testDivideByZero() {
        int result = 10 / 0;
    }

    @Ignore("테스트 비활성화 예제") // 실행되지 않음
    @Test
    public void ignoredTest() {
        Assert.assertTrue(false);
    }
}

✅ 실행 순서

  1. @BeforeClass → 모든 테스트 실행 전 한 번 실행
  2. @Before → 각 테스트 실행 전 실행
  3. @Test → 테스트 실행
  4. @After → 각 테스트 실행 후 실행
  5. @AfterClass → 모든 테스트 실행 후 한 번 실행

📌 JUnit 5 샘플 코드

import org.junit.jupiter.api.*;

import static org.junit.jupiter.api.Assertions.*;

@TestInstance(TestInstance.Lifecycle.PER_CLASS) // JUnit 5에서는 생략 가능하지만 있으면 클래스 인스턴스를 공유 가능
public class JUnit5Example {

    @BeforeAll
    static void beforeAll() {
        System.out.println("📌 모든 테스트 실행 전 (한 번 실행)");
    }

    @AfterAll
    static void afterAll() {
        System.out.println("📌 모든 테스트 실행 후 (한 번 실행)");
    }

    @BeforeEach
    void setUp() {
        System.out.println("🔄 각 테스트 실행 전");
    }

    @AfterEach
    void tearDown() {
        System.out.println("🔄 각 테스트 실행 후");
    }

    @Test
    void testAddition() {
        assertEquals(5, 2 + 3);
    }

    @Test
    void testDivideByZero() {
        Exception exception = assertThrows(ArithmeticException.class, () -> {
            int result = 10 / 0;
        });
        assertEquals("/ by zero", exception.getMessage());
    }

    @Disabled("테스트 비활성화 예제") // 실행되지 않음
    @Test
    void ignoredTest() {
        fail("이 테스트는 실행되지 않아야 합니다.");
    }

    @RepeatedTest(3) // 3번 반복 실행
    void repeatedTest() {
        System.out.println("🔄 반복 테스트 실행");
    }
}

✅ 실행 순서

  1. @BeforeAll → 모든 테스트 실행 전 한 번 실행
  2. @BeforeEach → 각 테스트 실행 전 실행
  3. @Test 또는 @RepeatedTest → 테스트 실행
  4. @AfterEach → 각 테스트 실행 후 실행
  5. @AfterAll → 모든 테스트 실행 후 한 번 실행

📌 JUnit 4 vs JUnit 5 주요 차이점

차이점 JUnit 4  JUnit 5
패키지 org.junit.* org.junit.jupiter.api.*
테스트 실행 전/후 @Before, @After @BeforeEach, @AfterEach
클래스 실행 전/후 @BeforeClass, @AfterClass (static 필수) @BeforeAll, @AfterAll (static 권장)
테스트 비활성화 @Ignore @Disabled
예외 테스트 @Test(expected = Exception.class) assertThrows(Exception.class, () -> {...})
반복 테스트 지원 안 함 @RepeatedTest(n)
조건부 실행 지원 안 함 @EnabledOnOs, @EnabledOnJre 등 지원
패러미터 테스트 @RunWith(Parameterized.class) 사용 @ParameterizedTest 내장 지원
assertAll 지원 안 함 지원 (assertAll())

📌 결론

  • 새 프로젝트에서는 JUnit 5를 사용하는 것이 좋음 (더 강력한 기능 제공)
  • 기존 JUnit 4 기반 프로젝트라면 유지보수 상황에 따라 JUnit 5로 점진적으로 마이그레이션 가능
  • **JUnit 5의 @TestInstance(Lifecycle.PER_CLASS)**를 사용하면 인스턴스를 공유하여 @BeforeAll, @AfterAll에서 static이 필요 없음
  • 예외 테스트, 반복 실행, 조건부 실행 등에서 JUnit 5가 더 직관적이고 강력함

JUnit 4와 5의 차이점을 이해하면 효율적으로 단위 테스트를 작성할 수 있습니다! 

728x90