개발/자바
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);
}
}
✅ 실행 순서
- @BeforeClass → 모든 테스트 실행 전 한 번 실행
- @Before → 각 테스트 실행 전 실행
- @Test → 테스트 실행
- @After → 각 테스트 실행 후 실행
- @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("🔄 반복 테스트 실행");
}
}
✅ 실행 순서
- @BeforeAll → 모든 테스트 실행 전 한 번 실행
- @BeforeEach → 각 테스트 실행 전 실행
- @Test 또는 @RepeatedTest → 테스트 실행
- @AfterEach → 각 테스트 실행 후 실행
- @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