BE/Spring & Spring Boot

[Spring Boot] @TestMethodOrder

baek-dev 2025. 2. 25. 19:11

📌 1. @TestMethodOrder란?

 

@TestMethodOrderJUnit 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)와 함께 사용하면 순서가 보장되지 않을 수 있음.

 

🚀 결론

@TestMethodOrderJUnit 5에서 테스트 실행 순서를 지정하는 기능

@Order(n), MethodName.class, Random.class, DisplayName.class 등을 사용하여 순서 지정 가능

테스트는 원칙적으로 독립적이어야 하지만, 실행 순서가 필요한 경우 @TestMethodOrder를 사용

병렬 실행을 고려해야 하는 경우 실행 순서 의존성을 줄이는 것이 좋음

 

 

 

 

출처 : ChatGPT