📌 1. @TestMethodOrder란?
@TestMethodOrder는 JUnit 5에서 테스트 메서드 실행 순서를 지정하는 어노테이션임.
기본적으로 JUnit은 테스트 메서드를 실행할 순서를 보장하지 않음.
하지만, 특정한 실행 순서가 필요한 경우 @TestMethodOrder를 사용하면 테스트를 원하는 순서대로 실행할 수 있음.
📌 2. @TestMethodOrder 기본 사용법
✅ (1) 테스트 실행 순서를 @Order로 지정
• @TestMethodOrder(OrderAnnotation.class)를 사용하면 각 테스트 메서드에 @Order(n)을 부여하여 실행 순서를 지정할 수 있음.
import org.junit.jupiter.api.*;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class OrderedTest {
@Test
@Order(2)
void testB() {
System.out.println("Test B 실행");
}
@Test
@Order(1)
void testA() {
System.out.println("Test A 실행");
}
@Test
@Order(3)
void testC() {
System.out.println("Test C 실행");
}
}
🔹 실행 결과
Test A 실행
Test B 실행
Test C 실행
• @Order(1) → @Order(2) → @Order(3) 순서대로 실행됨.
✅ (2) 테스트 실행 순서를 메서드 이름 기준으로 정렬
• @TestMethodOrder(MethodOrderer.MethodName.class)를 사용하면 알파벳 순서로 테스트 메서드가 실행됨.
import org.junit.jupiter.api.*;
@TestMethodOrder(MethodOrderer.MethodName.class)
class MethodNameOrderedTest {
@Test
void testC() {
System.out.println("Test C 실행");
}
@Test
void testA() {
System.out.println("Test A 실행");
}
@Test
void testB() {
System.out.println("Test B 실행");
}
}
🔹 실행 결과
Test A 실행
Test B 실행
Test C 실행
• 메서드 이름(A → B → C) 기준으로 정렬됨.
✅ (3) 실행 순서를 랜덤으로 설정
• @TestMethodOrder(MethodOrderer.Random.class)을 사용하면 테스트 실행 순서가 무작위(Random)로 결정됨.
import org.junit.jupiter.api.*;
@TestMethodOrder(MethodOrderer.Random.class)
class RandomOrderedTest {
@Test
void testOne() {
System.out.println("Test One 실행");
}
@Test
void testTwo() {
System.out.println("Test Two 실행");
}
@Test
void testThree() {
System.out.println("Test Three 실행");
}
}
🔹 실행 결과 예시 (매 실행마다 다를 수 있음)
Test Three 실행
Test One 실행
Test Two 실행
• 테스트 실행 순서가 실행할 때마다 랜덤으로 변함.
✅ (4) 기본(디폴트) 순서: @TestMethodOrder(MethodOrderer.DisplayName.class)
• @DisplayName을 활용하면, 테스트 메서드의 표시된 이름(설명) 기준으로 정렬됨.
import org.junit.jupiter.api.*;
@TestMethodOrder(MethodOrderer.DisplayName.class)
class DisplayNameOrderedTest {
@Test
@DisplayName("2. B 테스트")
void testB() {
System.out.println("Test B 실행");
}
@Test
@DisplayName("1. A 테스트")
void testA() {
System.out.println("Test A 실행");
}
@Test
@DisplayName("3. C 테스트")
void testC() {
System.out.println("Test C 실행");
}
}
🔹 실행 결과
Test A 실행
Test B 실행
Test C 실행
• @DisplayName("1. A 테스트") → "2. B 테스트" → "3. C 테스트" 순서대로 실행됨.
📌 3. @TestMethodOrder를 사용해야 하는 경우 vs 사용하지 말아야 하는 경우
✅ (사용해야 하는 경우)
1. 테스트 실행 순서가 중요한 경우
• 예: 데이터를 삽입 → 조회 → 삭제하는 순서로 실행해야 하는 경우
2. 이전 테스트의 결과를 기반으로 다음 테스트를 실행하는 경우
• 예: DB 초기화 → 데이터 삽입 → 데이터 검증
3. 테스트 환경이 의존적인 경우
• 예: 파일 시스템이나 캐시 테스트처럼 이전 상태를 유지해야 하는 경우
❌ (사용하지 말아야 하는 경우)
1. 테스트가 독립적이어야 하는 경우
• 테스트는 일반적으로 순서에 의존하지 않아야 함
• 실행 순서가 바뀌어도 테스트가 항상 통과해야 함
2. 병렬 테스트를 사용할 경우
• JUnit 5에서 병렬 실행(@Execution(ExecutionMode.CONCURRENT))을 사용할 때는 실행 순서를 강제하면 충돌 발생 가능
📌 4. @TestMethodOrder를 사용할 때 주의할 점
• 테스트 실행 순서에 의존하는 테스트는 권장되지 않음.
• 실행 순서가 바뀌면 테스트가 실패할 수 있음.
• 각 테스트는 독립적으로 실행될 수 있도록 설계하는 것이 좋음.
• JUnit 4에서는 @FixMethodOrder를 사용해야 함.
• JUnit 5 이전 버전(JUnit 4)에서는 @FixMethodOrder를 사용해야 실행 순서를 조정할 수 있음.
• 병렬 실행 시 순서가 보장되지 않음.
• @Execution(ExecutionMode.CONCURRENT)와 함께 사용하면 순서가 보장되지 않을 수 있음.
🚀 결론
• @TestMethodOrder는 JUnit 5에서 테스트 실행 순서를 지정하는 기능
• @Order(n), MethodName.class, Random.class, DisplayName.class 등을 사용하여 순서 지정 가능
• 테스트는 원칙적으로 독립적이어야 하지만, 실행 순서가 필요한 경우 @TestMethodOrder를 사용
• 병렬 실행을 고려해야 하는 경우 실행 순서 의존성을 줄이는 것이 좋음
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] 스프링 배치 (Spring Batch) (0) | 2025.03.01 |
---|---|
[Spring Boot] 멀티 모듈 프로젝트 (0) | 2025.02.26 |
[Spring Boot, JPA] 리플렉션 (0) | 2025.02.23 |
[Spring Boot] Service를 Interface + ServiceImpl 구조로 사용하는 이유 (0) | 2025.02.20 |
[Spring Boot] REST Docs + Asciidoctor (0) | 2025.02.15 |