JUnit5 테스트 실행 순서 - 메소드(알파벳), @Order, 랜덤

테스트 코드는 순서에 대해서 설명. 메소드(알파벳) 순서, @Order에 의한 순서, 랜덤 실행

테스트 실행 순서

디폴트로는 테스트 메소드의 실행 순서는 의도적으로 확실하지 않은 알고리즘으로 결정되게 되어 있다. (랜덤은 아니지만, 추측은 할 수 없는 순서로 된 것으로 보인다.)

어쨌든, 본래의 단위 테스트는 실행 순서에 의존하지 않는 것이 바람직하다.

그러나, 결합 테스트 또는 기능 테스트의 경우 실행 순서가 중요 할 수 있다. 예를 들면, 초기 필요한 기능을 먼저 동작 시키고, 각각의 기능을 동작시켜야 하는 경우다. 그러한 경우에는 테스트의 실행 순서를 제어하기 위한 구조가 준비되어 있다.

기본 테스트 실행 순서

위에서 설명 했듯이 순서 지정 없이 기본으로 테스트를 실행시켜 보겠다.

package com.devkuma.junit5.order;

import org.junit.jupiter.api.Test;

public class DefaultOrderTest {
    @Test
    void bear() {
        System.out.println("bear");
    }

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

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

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

실행 결과:

ant
cat
dog
bear

메소드 이름(알파벳) 순서로 실행

테스트 클래스에 @TestMethodOrder 어노테이션에 MethodOrderer.MethodName 지정하면 메소드 이름(알파벳) 순서로 실행 시킬 수 있다.

@TestMethodOrdervalue에는 MethodOrderer를 구현한 클래스의 Class객체를 지정한다.
MethodOrder는 메서드의 실행 순서를 제어하는 ​​기능을 제공한다. MethodOrder에는 표준으로 3개의 구현이 준비되어 있다.
MethodName 은 메소드 이름을 java.util.Comparator`로 비교하여 정렬한다.
메소드명이 같은 경우는 인수를 포함해 캐릭터 라인으로 표현한 것을 비교한다.

package com.devkuma.junit5.order;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.MethodName.class)
public class MethodNameOrderTest {
    @Test
    void bear() {
        System.out.println("bear");
    }

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

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

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

실행 결과:

ant
bear
cat
dog

지정된 @Order에 의한 실행 순서

@TestMethodOrderMethodOrderer.OrderAnnotation 을 사용하면, @Order 어노테이션에서 순서를 명시할 수 있다.
@Order 지정되지 않은 메서드는 기본적으로 Integer.MAX_VALUE가 할당된다.

package sample.junit5;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

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

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

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

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

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

실행 결과:

dog
cat
bear
ant

순서 없이 무작위(Random)으로 실행

@TestMethodOrderMethodOrderer.Random을 사용하면, 메서드의 실행 순서가 무작위로 실행 된다.

package com.devkuma.junit5.order;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.Random.class)
public class RandomOrderTest {

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

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

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

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

실행 결과:
첫번째 실행

cat
bear
ant
dog

두번째 실행

dog
bear
ant
cat



최종 수정 : 2022-12-09