단위 테스트는 일반적으로 실행 순서에 의존해서는 안 되지만 특정 상황에서 실행 순서를 적용해야 하는 경우가 있습니다. 예를 들어 테스트 순서가 중요한 통합 테스트나 기능 테스트를 작성해야 할 경우입니다.
먼저 간단한 테스트 코드를 작성하고 실행해 보겠습니다. 순서를 학습하기 위한 예제라 테스트 메서드 내용은 생략하겠습니다.
public class OrderTest {
@Test
void 가_테스트() {
}
@Test
void 나_테스트() {
}
@Test
void 다_테스트() {
}
@Test
void 라_테스트() {
}
@Test
void 마_테스트() {
}
}
테스트 클래스에 작성된 순서로 나오지 않는다는 것과 가나다 순서도 아닌 것을 확인할 수 있습니다.
실제 Junit 공식 문서를 확인해 본 결과 기본적으로 순서에 대해 설정하지 않은 경우 “결정론적이지만 의도적으로 명시되지 않은 기본 알고리즘을 사용하여 순서가 지정된다.”라고 적힌 것을 확인할 수 있습니다. 즉 기본 순서는 있지만 문서화 되어 있지 않아 명확하게 순서를 정하고 싶다면 수동으로 지정해야 합니다.
수동으로 테스트 메서드의 실행 순서를 정하는 방법으로는 Junit에서 제공하는 @TestMethodOrder 어노테이션을 사용해 테스트 메서드 정렬방법을 정의할 수 있습니다.
먼저 정렬에 사용되는 어노테이션의 값에 대해 간단하게 설명을 해드리고 코드로 예제를 하나씩 실행해 결과를 비교해 보겠습니다.
@TestMethodOrder(MethodOrderer.DisplayName.class)
-> @DisplayName(””) 값에 적힌 문자열 순서
@TestMethodOrder(MethodOrderer.MethodName.class)
-> 메서드 이름의 문자열 순서
@TestMethodOrder(MethodOrderer.Random.class)
-> 랜덤 순서
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
-> 실행 순서 직접 입력
예제 코드
1. @TestMethodOrder(MethodOrderer.DisplayName.class) - displayName 값 순서
// displayName 순서
@TestMethodOrder(MethodOrderer.DisplayName.class)
public class OrderTest {
@DisplayName("A 테스트")
@Test
void 가_테스트() {
}
@DisplayName("B 테스트")
@Test
void 나_테스트() {
}
@DisplayName("C 테스트")
@Test
void 다_테스트() {
}
@DisplayName("D 테스트")
@Test
void 라_테스트() {
}
@DisplayName("E 테스트")
@Test
void 마_테스트() {
}
}
@DisplayName 값의 정렬 결과 알파벳 순으로 정렬된 것을 확인할 수 있습니다.
2. @TestMethodOrder(MethodOrderer.MethodName.class) - 메서드 이름 순서
// 메서드 이름 순서
@TestMethodOrder(MethodOrderer.MethodName.class)
public class OrderTest {
//... 생략
}
@DisplayName 을 다시 지워주고 메서드 이름순 정렬 옵션을 적용해보면
한글 가나다 순도 잘 되는것을 확인할 수 있습니다.
3. @TestMethodOrder(MethodOrderer.Random.class) - 랜덤 순서
// 랜덤 정렬
@TestMethodOrder(MethodOrderer.Random.class)
public class OrderTest {
//.. 생략
}
랜덤 옵션은 실행할 때마다 결과가 다르게 나온다는 것을 확인할 수 있습니다.
4. @TestMethodOrder(MethodOrderer.OrderAnnotation.class) - 실행 순서 직접 지정
// 순서 직접 지정
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class OrderTest {
@Order(-8)
@Test
void 가_테스트() {
}
@Order(1)
@Test
void 나_테스트() {
}
@Order(2)
@Test
void 다_테스트() {
}
@Order(100)
@Test
void 라_테스트() {
}
@Test
void 마_테스트() {
}
}
실행 순서 직접 입력 방식은 앞선 3개의 방식과 다르게 @Order({실행순서})를 추가로 작성해 줘야 한다는 점입니다.
@Order의 값을 입력하면 가장 낮은 숫자가 먼저 실행됩니다. 위의 예제를 보시면 음수(-8)도 허용된다는 것을 확인할 수 있고 “라_테스트”에 큰 숫자를 지정하더라도 아무것도 지정하지 않은 “마_테스트”보다 먼저 실행된다는 것을 참고하시면 좋을 것 같아서 예제에 추가했습니다.