어제 오늘 내일

[JUnit] @TestMethodOrder – 테스트 실행 순서 제어하기 본문

IT/JUnit

[JUnit] @TestMethodOrder – 테스트 실행 순서 제어하기

hi.anna 2026. 1. 11. 01:27

JUnit은 기본적으로 테스트 실행 순서를 보장하지 않습니다.
테스트는 서로 독립적이어야 하므로 순서에 의존하는 테스트는 지양하는 것이 원칙입니다.
하지만 실제 현업 환경에서는 순서가 필요한 경우가 존재합니다.
예를 들어,

  • 회원 등록 → 회원 조회 → 회원 삭제
  • 초기 설정 테스트 → 기능 테스트
    같은 흐름을 그대로 테스트해야 할 때입니다.

이럴 때 사용하는 기능이 바로 @TestMethodOrder입니다.

 

1. @TestMethodOrder란?

@TestMethodOrder는 테스트 메서드의 실행 순서를 지정하는 애너테이션입니다.
JUnit5에서는 순서 전략을 지정하는 방식으로 작동합니다.

대표적인 두 가지 전략

  1. MethodOrderer.OrderAnnotation — 개발자가 직접 숫자로 순서 지정
  2. MethodOrderer.MethodName — 메서드 이름 기준 사전순 실행

일반적으로 OrderAnnotation 방식의 사용 빈도가 가장 높습니다.

 

2. 숫자 기반 순서 지정: @Order 사용하기

가장 많이 쓰이는 방식으로, 메서드마다 @Order(n)을 붙여 순서를 직접 정의합니다.

예제 코드

import org.junit.jupiter.api.*;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class UserServiceTest {

    @Order(1)
    @Test
    void testCreateUser() {
        System.out.println("1. 사용자 생성");
    }

    @Order(2)
    @Test
    void testReadUser() {
        System.out.println("2. 사용자 조회");
    }

    @Order(3)
    @Test
    void testDeleteUser() {
        System.out.println("3. 사용자 삭제");
    }
}

설명

  • @TestMethodOrder(MethodOrderer.OrderAnnotation.class)로 실행 전략 지정
  • @Order(1), @Order(2)처럼 숫자가 작은 테스트부터 실행
  • 데이터 흐름을 가지고 있는 테스트 시나리오 구성에 유리

 

3. 메서드 이름 기반 순서 지정: MethodName 전략

순서를 직접 지정하지 않고 메서드 이름의 사전순으로 정렬하여 실행합니다.

예제 코드

@TestMethodOrder(MethodOrderer.MethodName.class)
class OrderedByNameTest {

    @Test
    void testB() {
        System.out.println("두 번째 실행");
    }

    @Test
    void testA() {
        System.out.println("첫 번째 실행");
    }
}

설명

  • 이름 기준으로 정렬하므로 testA → testB 순으로 실행
  • 간단하지만 유지보수 시 이름 변경에 따라 순서가 깨질 수 있으므로 주의

 

4. @TestMethodOrder 사용 시 주의할 점

  1. 테스트 독립성이 깨질 수 있음
    • 순서에 의존하는 테스트는 한 테스트 실패 시 연속적으로 영향이 발생
    • 가능한 한 각 테스트는 독립적으로 동작하도록 설계해야 함
  2. 데이터 공유 위험
    • 순서가 있다는 것은 곧 테스트 간 상태를 공유할 가능성이 있다는 의미
    • 상태가 공유되면 테스트 안정성이 떨어지므로 최소화하는 것이 좋음
  3. 순서 테스트는 "시나리오 테스트" 목적일 때만 사용 추천
    • 단위 테스트(Unit Test)보다는 시나리오 흐름을 검증하는 테스트에서 적절
  4. 여러 사람이 작업할 때 유지보수 어려움
    • 순서를 바꾸려고 하면 여러 테스트의 Order 번호를 다시 정리해야 함
    • 전략적으로 필요한 경우에만 사용해야 함

 

5. @TestMethodOrder가 적절한 사용 사례

  • CRUD 흐름을 실제 시나리오로 검증하는 인수 테스트 형태
  • 외부 시스템과 연동되어 "상태 변화"가 중요한 테스트
  • 테스트 데이터가 단계적으로 누적되어야 하는 경우

하지만 이 또한 "최후의 수단"이어야 하며,
가능하면 테스트를 독립적으로 유지하는 것이 가장 좋습니다.

 

 

반응형
Comments