JUnit5 테스트 실행 순서 - 메소드(알파벳), @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
지정하면 메소드 이름(알파벳) 순서로 실행 시킬 수 있다.
@TestMethodOrder
의 value
에는 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
에 의한 실행 순서
@TestMethodOrder
에 MethodOrderer.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)으로 실행
@TestMethodOrder
에 MethodOrderer.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