ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 테스트 순서
    테스트/Junit5 2021. 2. 6. 19:10

    ※테스트를 실행할 때 코드에 존재하는 테스트 메소드마다 내부 로직에 의해 순서대로 실행이 된다.

    하지만 우리는 이 순서에 의존하면 안된다 -> 순서가 바뀔수도 있기 때문에.

     

    그렇다면 왜 순서를 명확하게 하지 않는가. -> 단위테스트일 경우 각각의 테스트마다 독릭접이기 때문(의존성이 없애기 위해).

    하지만 우리는 종종 시나리오 테스트일 경우 순서대로 실행하고 상태정보를 저장하는 테스트가 필요하다 

    EX)쇼핑몰에서 로직 테스트 회원가입 -> 로그인 -> 상품 -> 주문 -> 결제... 

     

    그렇다면 어떻게 순서대로 테스트를 실행할 수 있을까.

    방법1.

    • @TestInstance(Lifecycle.PER_CLASS)와 함께 TestMethodOrder사용
    • TethodOrder구현체 설정
      • Alphanumeric
      • OrderAnnoation
      • Random

    구현체 설정은 이름만 봐도 알것이다. 따라서 본 글에선 Order애노테이션을 활용해 실습을 실시한다.


    예제코드1. OrderAnnotation 구현체 활용

    • OrderAnnotation구현체를 활용할 경우 테스트 메서드에 순서를 지정해준다
    • 순서를 지정해주는 방법은 @Order 애노테이션을 활용한다.
      • 낮은 값이 우선순위가 높다.
    package com.example.junittest;
    
    import org.junit.jupiter.api.*;
    
    @DisplayName("스터디 클레스")
    @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    class StudyTest {
        int value = 1;
    
        @Test
        @DisplayName("메서드 1️")
        @Order(2)
        void create_new_study_test() {
            System.out.println(value);
            value++;
            System.out.println(this);
        }
    
        @Test
        @DisplayName("메서드 2")
        @Order(1)
            //원격환경에서
        void create_again_study_test() {
            System.out.println(value);
            value++;
            System.out.println(this);
        }
    
        @BeforeAll
        void beforeall() {
            System.out.println("BEFORE ALL");
        }
    
        @AfterAll
        void afterall() {
            System.out.println("AFTER ALL");
        }
    }

     

    ※하지만 TestInstance도 생략이 가능하다.

    -> 상태를 공유할 경우에 주로 순서를 지정해주고 테스트를 실시 하는데 굳이 생략하고 메소드 순서를 지정할 일이 없다. 하지만 생략하고 실습해보자.


    package com.example.junittest;
    
    import org.junit.jupiter.api.*;
    
    @DisplayName("스터디 클레스")
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    class StudyTest {
        int value = 1;
    
        @Test
        @DisplayName("메서드 1️")
        @Order(2)
        void create_new_study_test() {
            System.out.println(value);
            value++;
            System.out.println(this);
        }
    
        @Test
        @DisplayName("메서드 2")
        @Order(1)
            //원격환경에서
        void create_again_study_test() {
            System.out.println(value);
            value++;
            System.out.println(this);
        }
    
        @BeforeAll
        static void beforeall() {
            System.out.println("BEFORE ALL");
        }
    
        @AfterAll
        static void afterall() {
            System.out.println("AFTER ALL");
        }
    }

    설정한 순서는 제대로 동작한다, 하지만 테스트 메소드마다 클레스 인스턴스를 생성하고, value값이 공유되지 않는것을 확인 할 수 있다.

    '테스트 > Junit5' 카테고리의 다른 글

    JUnit5 확장 모델  (0) 2021.02.08
    properties파일로 JUnit5 설정하기  (0) 2021.02.08
    테스트 인스턴스  (0) 2021.02.06
    테스트 반복하기2 @ParameterizedTest이용한 추가 방법  (0) 2021.02.02
    테스트 반복하기  (0) 2021.02.02
Designed by Tistory.