JUnit 순서

JUnit에서 별도로 순서를 지정안하는 @TestMethodOrder를 사용하지 않으면 어떤식으로 동작하는지 설명하는 글입니다.

요구사항

  • Spring Boot
  • JUnit 5

메소드명 뒤에 숫자가 붙은 경우

동일한 메소드명 길이로 뒤에 숫자가 붙은 경우 숫자 순서대로 진행됩니다.

코드

import org.junit.jupiter.api.*;

public class AnnotationTest {

    @Test
    void test1() {
        System.out.println("first");
    }

    @Test
    void test2() {
        System.out.println("second");
    }

    @Test
    void test3() {
        System.out.println("third");
    }

    @Disabled
    void test4() {
        System.out.println("fourth");
    }
}

결과

first
second
third
fourth

메소드명 뒤에 알파벳이 붙은 경우

동일한 메소드명 길이로 뒤에 알파벳이 붙은 경우 알파벳 순서대로 진행됩니다. 아래 예제를 보면 작성한 순서 상관없이 testA -> testB -> testC -> testD순으로 진행되는걸 볼 수 있습니다.

코드

import org.junit.jupiter.api.*;

public class AnnotationTest {

    @Test
    void testA() {
        System.out.println("first");
    }

    @Test
    void testB() {
        System.out.println("second");
    }

    @Test
    void testD() {
        System.out.println("third");
    }

    @Test
    void testC() {
        System.out.println("fourth");
    }
}

결과

first
second
fourth
third

메소드명 길이에 따른 순서

이제까지 메소드명이 동일한 길이에서 테스트를 했었는데 이번에는 길이가 다른 메소드명에서 테스트를 진행해보겠습니다. a -> c -> ac -> ba 길이가 짧은순으로 그 다음 알파벳 순으로 되는걸 확인하실 수 있습니다.

코드

import org.junit.jupiter.api.*;

public class AnnotationTest {

    @Test
    void a() {
        System.out.println("first");
    }

    @Test
    void ba() {
        System.out.println("second");
    }

    @Test
    void c() {
        System.out.println("third");
    }

    @Test
    void ac() {
        System.out.println("fourth");
    }
}

결과

first
third
fourth
second

알파벳과 숫자 우선순위

이번에는 알파벳과 숫자 우선순위를 테스트 해보겠습니다. a1 -> a2 -> b1 -> b2 -> aa -> ab 길이가 짧은순으로 그 다음 알파벳 순으로 되는걸 확인하실 수 있습니다.

import org.junit.jupiter.api.*;

public class AnnotationTest {

    @Test
    void a1() {
        System.out.println("first");
    }

    @Test
    void a2() {
        System.out.println("second");
    }

    @Test
    void aa() {
        System.out.println("third");
    }

    @Test
    void ab() {
        System.out.println("fourth");
    }

    @Test
    void b1() {
        System.out.println("fifth");
    }

    @Test
    void b2() {
        System.out.println("sixth");
    }
}

@Order 사용 예제

  • 메소드명 길이
  • 숫자
  • 알파벳

아마도 추측하기로는 java 컴파일한 바이트코드(bytecode)상으로 우선순위가 높은 순으로 진행되는게 아닌가 추측합니다. 이렇게 예측하기 어렵기 때문에 순서가 필요한 테스트는 가능하면 @Order를 사용하시기 바랍니다.

  • @TestMethodOrder(MethodOrderer.MethodName.class): 메소드 영숫자순으로 정렬 (a1 -> a2 -> aa -> ab -> b1 -> b2)
  • @TestMethodOrder(MethodOrderer.OrderAnnotation.class): 특정한 순서로 정렬 (a1 -> a2 -> aa -> ab -> b1 -> b2)

코드

import org.junit.jupiter.api.*;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class AnnotationTest {

    @Test
    @Order(1)
    void a1() {
        System.out.println("first");
    }

    @Test
    @Order(2)
    void a2() {
        System.out.println("second");
    }

    @Test
    @Order(3)
    void aa() {
        System.out.println("third");
    }

    @Test
    @Order(4)
    void ab() {
        System.out.println("fourth");
    }

    @Test
    @Order(5)
    void b1() {
        System.out.println("fifth");
    }

    @Test
    @Order(6)
    void b2() {
        System.out.println("sixth");
    }

}

참조