반응형

테스트 인스턴스 전략

  • JUnit은 테스트 메소드마다 테스트 인스턴스를 새로 만든다.
    • 이것은 JUnit의 기본 전략이다.
    • 인스턴스를 테스트 메소드마다 만드는 이유
      • 테스트간의 의존성 제거
      • 테스트가 실행되는 순서에 따라 원하지 않는 결과가 발생할 수 있다.
      • 테스트 메소드를 독립적으로 실행하여 예상치 못한 부작용을 방지하기 위함이다.
    • JUnit 5에서는 이 기본 전략을 변경할 수 있다.
      • JUnit 4에서는 기본 전략 변경을 지원하지 않는다.

 

@TestInstance

  • 테스트 클래스당 인스턴스를 하나만 만들어 사용한다.
  • 경우에 따라, 테스트 간에 공유하는 모든 상태를 @BeforeEach 또는 @AfterEach에서 초기화 할 필요가 있다.
  • @BeforeAll@AfterAll을 인스턴스 메소드 또는 인터페이스에 정의한 default 메소드로 정의할 수도 있다.

 

테스트 순서

  • 실행할 테스트 메소드는 내부적으로 특정한 순서에 의해 실행되지만 어떻게 그 순서를 정하는지는 의도적으로 분명히 하지 않는다.
    • 테스트 인스턴스를 테스트마다 새로 만드는 것과 같은 이유
    • 제대로 작성된 단위 테스트라면 서로 다른 테스트와 독립적으로 수행되어도 문제가 없어야한다.

 

  • 그러나 경우에 따라, 특정 순서대로 테스트를 실행하고 싶을 때도 있다.
    • 통합 테스트, 시나리오 테스트, ...
    • 예) 회원 가입 → 회원 로그인 → 개인 페이지 이동 → 개인 페이지에서 닉네임 변경
      • 테스트 간 상태정보 유지(테스트 간 의존성 존재)

 

  • 그 경우에는 테스트 메소드를 원하는 순서에 따라 실행하도록 @TestMethodOrder를 사용할 수 있다.
    • @TestMethodOrder 단독으로 사용해도 순서대로 테스트가 수행된다.
    • @TestInstance @TestMethodOrder 를 같이 사용하면 메소드 인스턴스가 하나이기 때문에 테스트 간 상태정보도 유지하면서 순서대로 테스트가 수행된다.

 

  • @TestMethodOrder 사용방법
    • @TestMethodOrder 의 인자에 MethodOrderer 구현체를 설정한다.
    • MethodOrderer 기본 구현체
      • Alphanumeric
      • OrderAnnoation
        • Order 애노테이션을 통해 순서 지정(낮은 값일수록 높은 우선 순위)
      • Random

 

JUnit 5 - 테스트 인스턴스, 테스트 순서 예제

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class StudyTest {
         
         ...
         ...
         ...
         
    int value = 0;
    
    @Order(10)
    @Tag("fast")
    @Test
    void testInstance() {
        System.out.println(this + ":" + value++); // 0
    }

    @Order(11)
    @Tag("fast")
    @Test
    void testInstance2() {
        System.out.println(this + ":" + value++); // 0
    }

    @Order(12)
    @Tag("fast")
    @Test
    void testInstance3() {
        System.out.println(this + ":" + value++); // 0
    }
}

 

  • @TestInstance(TestInstance.Lifecycle.PER_CLASS) 사용 시, 테스트 인스턴스 해시 값이 같다.(클래스당 하나의 테스트 인스턴스 사용) 그리고 뒤의 숫자 상태정보가 유지되고 있다.
    • @TestInstance(TestInstance.Lifecycle.PER_CLASS) 을 사용하지 않았다면 테스트마다 인스턴스가 생성되고 숫자 상태정보도 유지되지 않는다.
  • @TestMethodOrder 를 사용하여 테스트 순서가 작성 순서대로 수행되고 있다.
  • 결과

[참고자료]

더 자바, 애플리케이션을 테스트하는 다양한 방법, 백기선

JUnit 5 User Guide

반응형

+ Recent posts