테스트/0+ JUnit

[JUnit5] 인스턴스 테스트와 테스트 순서대로 실행하는 방법

힘들면힘을내는쿼카 2023. 5. 17. 20:42
728x90
반응형

[JUnit5] 인스턴스 테스트와 테스트 순서대로 실행하는 방법

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jaein999&logNo=221318948334

인스턴스 테스트

🎲 독립 시행

JUnit의 기본전략은 테스트 메소드 마다 테스트 인스턴스를 새로 생성합니다.

코드로 보면 바로 이해가 되실것 입니다.

public class InstanceTest {
    int value = 1;

    @Test
    @DisplayName("value를 1증가 했기 때문에 2가 된다.")
    void test1() {
        System.out.println(this); // 메소드 해시
        value++; // 1증가
        Assertions.assertEquals(2, value);
    }

    @Test
    @DisplayName("value를 1증가 했기 때문에 3 된다.")
    void test2() {
        System.out.println(this); // 메소드 해시
        value++; // 1증가
        Assertions.assertEquals(3, value);
    }
}

 

value를 1씩 2번 증가 시켰는데, 2번째 테스트에서는 value의 값이 2 입니다.
이처럼 JUnit의 기본 전략은 테스트 메소드 마다 테스트 인스턴스를 새로 생성합니다.
해시값을 보면 다른 것을 확인할 수 있습니다.^^

 

왜 그럴까요? 🤔
테스트 메소드를 독립적으로 실행하여 예상치 못한 부작용을 방지하기 위함 입니다.
🎲 독립시행으로 테스트를 수행한다는 것이죠!
테스트 실행 순서는 보장되어 있지 않습니다.

 

따라서 메소드 마다value의 값은 항상 1로 시작합니다.

@TestInstance(LifeCycle.PER_CLASS)

이 전략을 JUnit5에서는 변경할 수 있습니다.

// 인스턴스 생성 전략 클래스 단위로 변경
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class InstanceTest {
    int value = 1;

    @Test
    @DisplayName("value를 1증가 했기 때문에 2가 된다.")
    void test1() {
        System.out.println(this); // 메소드 해시
        value++; // 1증가
        Assertions.assertEquals(2, value);
    }

    @Test
    @DisplayName("value를 1증가 했기 때문에 3 된다.")
    void test2() {
        System.out.println(this); // 메소드 해시
        value++; // 1증가
        Assertions.assertEquals(3, value);
    }
}

 

 

그런데 우리는 경우에 따라 테스트를 순서대로 실행하고 싶을 때도 있습니다.
이런 상황에서는 어떻게 해야할까요? 🤔

테스트 순서대로 실행하기

테스트 순서는 JUnit 내부적으로 정해진 순서가 있습니다.
하지만 그 순서에 우리가 100% 의존할 수는 없습니다.
우리의 입맛에 맞게 테스트 순서를 변경하려면 어떻게해야 할까요?

@TestMethodOrder

@TestMethodOrder을 사용하면 우리가 테스트 순서를 정하여 실행할 수 있습니다.
기본적으로 아래 3가지 구현체가 있습니다.

  • Alphanumeric
  • OrderAnnoation
  • Random
// 테스트 순서 정하기
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class OrderTest {
    // Order의 숫자가 낮을 수록 먼저 실행
    @Test
    @DisplayName("4번으로 실행")
    @Order(4)
    void test4() {
        System.out.println(4);
    }

    @Test
    @DisplayName("1번으로 실행")
    @Order(1)
    void test1() {
        System.out.println(1);
    }

    @Test
    @DisplayName("2번으로 실행")
    @Order(2)
    void test2() {
        System.out.println(2);
    }

    @Test
    @DisplayName("3번으로 실행")
    @Order(3)
    void test3a() {
        System.out.println(3);
    }
}

 

 

참고

728x90
반응형