포스트

Spring Boot Test - JUnit5 Test 설정

1) 테스트 클래스 인스턴스 생명 주기 설정

테스트 생명주기를 class 단위로 할지, method 단위로 할지 설정한다.
기본 값은 method 단위

  • 특정 테스트 클래스에 적용

    • 테스트 클래스에 @TestInstance(value = Lifecycle) 어노테이션 사용

    • Lifecycle
      • PER_CLASS : class 단위로 설정
        1
        2
        
        @TestInstance(TestInstance.Lifecycle.PER_CLASS)
        class UserRepositoryTest {
        
      • PER_METHOD : method 단위로 설정
        1
        2
        
        @TestInstance(TestInstance.Lifecycle.PER_METHOD)
        class UserRepositoryTest {
        


  • 전체 테스트 클래스에 적용

    • /test/resource 경로에 junit-platform.properties 파일 생성 후 작성
    • junit.jupiter.testinstence.lifecycle.default = Lifecycle 형태로 사용

    • Lifecycle
      • PER_CLASS : class 단위로 설정
        1
        
        junit.jupiter.testinstence.lifecycle.default = per_class
        
      • PER_METHOD : method 단위로 설정
        1
        
        junit.jupiter.testinstence.lifecycle.default = per_method
        


2) 테스트 실행 순서 설정

  • @Nested 클래스 순서 설정

    • 특정 테스트 클래스가 가지고 있는 @Nested class에 대해 실행 순서를 지정할 때 사용한다.
    • 테스트 클래스에 @TestClassOrder(value = ClassOrderer 구현체) 어노테이션 사용

    • ClassOrderer 구현체
      • Random.class
        • 설정 기본 값
        • 랜덤 실행
          1
          2
          
          @TestClassOrder(ClassOrderer.Random.class)  
          class ApiControllerTest {  
          
      • OrderAnnotation.class
        • @Order(index) 어노테이션으로 순서 지정
        • springframework 제공이 아닌 org.junit.jupiter.api 제공 Order를 사용해야 한다.
          1
          2
          3
          4
          5
          6
          
          @TestClassOrder(ClassOrderer.OrderAnnotation.class)  
          class ApiControllerTest { 
          	          
          @Order(1) 
          @Nested
          class NestedClassTest{
          
      • ClassName.class
        • class 이름 기준으로 알파벳 순 실행
          1
          2
          
          @TestClassOrder(ClassOrderer.ClassName.class)
          class ApiControllerTest {
          
      • DisplayName.class
        • DisplayName 기준으로 알파벳 순 실행
          1
          2
          
          @TestClassOrder(ClassOrderer.DisplayName.class)
          class ApiControllerTest {
          


  • 클래스 순서 설정

    • 전체 테스트에 적용
    • /test/resource 경로에 junit-platform.properties 파일 생성 후 작성
    • junit.jupiter.testclass.order.default = ClassOrderer구현체 형태로 사용

    • ClassOrderer 구현체
      • Random.class
        • 설정 기본 값
        • 랜덤 실행
          1
          2
          
          junit.jupiter.testclass.order.default= \  
          org.junit.jupiter.api.ClassOrderer$Random
          
      • OrderAnnotation.class
        • class에 @Order(index) 어노테이션으로 순서 지정
          1
          2
          
          junit.jupiter.testclass.order.default= \  
          org.junit.jupiter.api.ClassOrderer$OrderAnnotation
          
      • ClassName.class
        • class 이름 기준으로 알파벳 순 실행
          1
          2
          
          junit.jupiter.testclass.order.default= \  
          org.junit.jupiter.api.ClassOrderer$ClassName
          
      • DisplayName.class
        • DisplayName 기준으로 알파벳 순 실행
          1
          2
          
          junit.jupiter.testclass.order.default= \  
          org.junit.jupiter.api.ClassOrderer$DisplayName
          


  • 특정 테스트 클래스의 메서드 순서 설정

    • 특정 테스트 클래스 인스턴스에 속하는 메서드의 실행 순서를 지정할 때 사용한다.
    • 테스트 클래스에 @TestMethodOrder(value = MethodOrderer 구현체) 어노테이션 사용

    • MethodOrderer 구현체
      • Random.class
        • 설정 기본 값
        • 랜덤 실행
          1
          2
          
          @TestMethodOrder(MethodOrderer.Random.class)
          class ApiControllerTest {
          
      • OrderAnnotation.class
        • class에 @Order(index) 어노테이션으로 순서 지정
          1
          2
          
          @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
          class ApiControllerTest {
          
      • Alphanumeric.class (Deprecated)
        • Junit 5.7 부터 Dprecated 되었다.
        • Alphanumeric 대신 MethodName 또는 DisplayName 사용

      • MethodName.class
        • method 이름 기준으로 알파벳 순 실행
          1
          2
          
          @TestMethodOrder(MethodOrderer.MethodName.class)
          class ApiControllerTest {
          
      • DisplayName.class
        • DisplayName 기준으로 알파벳 순 실행
          1
          2
          
          @TestMethodOrder(MethodOrderer.DisplayName.class)
          class ApiControllerTest {
          


  • 전체 테스트 클래스의 메서드 순서 설정

    • /test/resource 경로에 junit-platform.properties 파일 생성 후 작성
    • junit.jupiter.testmethod.order.default = MethodOrderer구현체 형태로 사용

    • MethodOrderer 구현체
      • Random.class
        • 설정 기본 값
        • 랜덤 실행
          1
          2
          
          junit.jupiter.testmethod.order.default= \  
          org.junit.jupiter.api.MethodOrderer$Random
          
      • OrderAnnotation.class
        • class에 @Order(index) 어노테이션으로 순서 지정
          1
          2
          
          junit.jupiter.testmethod.order.default= \  
          org.junit.jupiter.api.MethodOrderer$OrderAnnotation
          
      • Alphanumeric.class (Deprecated)
        • Junit 5.7 부터 Dprecated 되었다.
        • Alphanumeric 대신 MethodName 또는 DisplayName 사용

      • MethodName.class
        • method 이름 기준으로 알파벳 순 실행
          1
          2
          
          junit.jupiter.testmethod.order.default= \  
          org.junit.jupiter.api.MethodOrderer$MethodName
          
      • DisplayName.class
        • DisplayName 기준으로 알파벳 순 실행
          1
          2
          
          junit.jupiter.testmethod.order.default= \  
          org.junit.jupiter.api.MethodOrderer$DisplayName
          


3) 확장 팩 등록

@Extention 어노테이션을 이용한 선언적 접근 방법과 @RegisterExtention 어노테이션을 사용한 프로그래밍적인 등록 방법이 있다.

@Extention

  • Junit 5에서 사용하는 확장 모델
    (Junit 4에서는 @RunWith(Runner), @TestRule, @MethodRule을 사용)
  • 다음의 경우에 실행되도록 사용
    • 테스트 인스턴스 후처리 (로깅 등)
    • 조건부 테스트 실행 - ExecutionCondition 구현
    • 라이프사이클 콜백 - 해당 콜백 인스턴스 구현
      • 참고 라이프 사이클 순서
        1. BeforeAllCallback
        2. BeforeAll
        3. BeforeEachCallback
        4. BeforeEach
        5. BeforeTestExecutionCallback
        6. Test
        7. AfterTestExecutionCallback
        8. AfterEach
        9. AfterEachCallback
        10. AfterAll
        11. AfterAllCallback
    • 매개변수 해결 - ParameterResolver 구현
    • 예외 처리 - TestExecutionExceptionHandler 구현

@RegisterExtention

  • 이 어노테이션을 통하면 extention을 확장할 수 있다.
  • 확장하는 extention 변수는 static으로 선언해야 한다.
    • ex
      1
      2
      3
      4
      5
      6
      7
      8
      9
      
      class RepositoryTest {
          @RegisterExtension 
          static EmployeeDatabaseSetupExtension DB = new EmployeeDatabaseSetupExtension(
              "jdbc:h2:mem:AnotherDb;DB_CLOSE_DELAY=-1", 
              "org.h2.Driver", 
              "sa", 
              ""
          );
      }
      


4) 확장 팩 자동 감지

  • 설정 기본 값은 false 이므로, 이 기능을 사용하려면 true 값을 주어야 한다.
  • 이 기능을 활성화하면 테스트 실행 중 클래스 경로에 있는 확장을 자동으로 감지하여 실행해주기 때문에 수동으로 @Extends 등을 이용하여 등록할 필요가 없다.

    1
    
    junit.jupiter.extensions.autodetection.enabled = true
    




참고한 사이트

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.