공부/Junit

[JUnit5] 테스트 메서드 그룹화/실행 순서 (@Nested, @TestMethodOrder)

leejinwoo1126 2023. 8. 26. 15:36
반응형

 


목차


    @Nested 사용하여 테스트 그룹화

    - simple 하게 내부 클래스 선언

    - @Nested Annotation 추가하면 됨

    - 그룹화할 테스트 메서드를 이동 

     

    사용 예시

    @ActiveProfiles("test")
    @AutoConfigureMockMvc
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
    class RestControllerTest {
    	// .. 테스트 작성
        
        @Nested
        @DisplayName("계좌 입금 테스트")
        @TestMethodOrder(MethodOrderer.MethodName.class)
        class AccountDeposit {
        	// .. 테스트 작성
        }
    
    }

     

     

    Controller, Service 테스트시 관련 클래스를 그룹화하여 가독성 향상할 수 있었다

     

     

    테스트 메서드명 기준으로 정렬하여 실행

    - 테스트 메서드 이름 순으로 오름차순 정렬

    - @TestMethodOrder(MethodOrderer.MethodName.class) 추가 

     

    사용예시

    @Nested
    @DisplayName("테스트 메서드명 기준으로 정렬한다")
    @TestMethodOrder(MethodOrderer.MethodName.class)
    class OrderByMethodName {
    
        @DisplayName("testC")
        @Test
        void testC() {
            // ..
        }
    
        @DisplayName("testB")
        @Test
        void testB() {
            // ..
        }
    
        @DisplayName("testA")
        @Test
        void testA() {
            // ..
        }
    }

     

     

    @Order Annotation 

    - 기본 오름차순 정렬

    - value는 int값만 받는다 

    - @Order() value를 설정하지 않을 경우 Integer.MAX_VALUE 할당 되어 우선 순위가 최하가 된다

    - @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 추가

     

    사용 예시

    @Nested
    @DisplayName("@Order 메서드로 실행 순서를 결정한다")
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    class OrderTestMethod {
    
        @DisplayName("testC")
        @Test
        @Order(2)
        void testC() {
            // ..
        }
    
        @DisplayName("testB")
        @Test
        @Order(3)
        void testB() {
            // ..
        }
    
        @DisplayName("testA")
        @Test
        @Order(1)
        void testA() {
            // ..
        }
    }

    A -> C -> B 순으로 오름차순 정렬 수행되었다

     

     

    @DisplayName 기준으로 정렬하여 실행

    - @TestMethodOrder(MethodOrderer.DisplayName.class) 추가

    - API 확인시 Comparator.comparging() 을 사용하여 @DisplayName에 표기된 String 값을 기준으로 정렬

    사용예시

    @Nested
    @DisplayName("DisplayName 기준으로 정렬한다")
    @TestMethodOrder(MethodOrderer.DisplayName.class)
    class OrderByDisplayName {
    
        @DisplayName("testC")
        @Test
        void testC() {
            // ..
        }
    
        @DisplayName("testB")
        @Test
        void testB() {
            // ..
        }
    
        @DisplayName("testA")
        @Test
        void testA() {
            // ..
        }
    }

     

     

    랜덤으로 테스트 메서드 실행하기

    - @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 추가

    - 매 테스트마다 실행 순서가 랜덤

     

    사용예시

    @Nested
    @DisplayName("순서가 랜덤으로 테스트 메서드 실행된다")
    @TestMethodOrder(MethodOrderer.Random.class)
    class OrderByRandomName {
    
        @DisplayName("testC")
        @Test
        void testC() {
            // ..
        }
    
        @DisplayName("testB")
        @Test
        void testB() {
            // ..
        }
    
        @DisplayName("testA")
        @Test
        void testA() {
            // ..
        }
    }

     

    1회차 실행

     

    2회차 실행

     

    테스트 실행시 순서가 달라지는 것을 확인 가능하다

    참고

    https://www.baeldung.com/junit-5-test-order 

    https://www.devkuma.com/docs/junit5/order-execution/

    반응형