ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JUnit 5. Extension
    BackEnd/JUnit 2022. 2. 3. 18:39
    반응형

      JUnit 4의 확장은 @RunWith(Runner), TestRule, MethodRule이 존재하지만, JUnit 5의 확장은 Extension 단 하나입니다. 등록 방법은 선언적인 등록(@ExtendWith), 프로그래밍 등록(@RegisterExtension)자동 등록 (자바 ServiceLoader 이용)이 존재합니다.

     

      Extension을 사용하기 위해 수행시간이 1초 이상 걸리는 메소드를 찾는 클래스를 생성합니다(라이프사이클 콜백 구현). 1초 이상 걸리는 메소드의 경우 "Please consider refactoring 메소드명 method."가 출력됩니다. 

    package com.java.JUnit5.extensions;
    
    import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
    import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
    import org.junit.jupiter.api.extension.ExtensionContext;
    
    public class FindSlowTestExtension implements BeforeTestExecutionCallback, AfterTestExecutionCallback {
        private long THRESHOLD;
    
        public FindSlowTestExtension() {
            this.THRESHOLD = 1000L;
        }
    
        public FindSlowTestExtension(long THRESHOLD) {
            this.THRESHOLD = THRESHOLD;
        }
    
        @Override
        public void beforeTestExecution(ExtensionContext extensionContext) throws Exception {
            ExtensionContext.Store store = getStore(extensionContext);
            store.put("START_TIME", System.currentTimeMillis());
        }
    
        @Override
        public void afterTestExecution(ExtensionContext extensionContext) throws Exception {
            String testMethodName = extensionContext.getRequiredTestMethod().getName();
            ExtensionContext.Store store = getStore(extensionContext);
            long start_time = store.remove("START_TIME", long.class);
            long duration = System.currentTimeMillis() - start_time;
            if(duration > THRESHOLD) {
                System.out.printf("Please consider refactoring [%s] method.", testMethodName);
            }
        }
    
        private ExtensionContext.Store getStore(ExtensionContext extensionContext) {
            String testClassName = extensionContext.getRequiredTestClass().getName();
            String testMethodName = extensionContext.getRequiredTestMethod().getName();
            ExtensionContext.Store store = extensionContext.getStore(ExtensionContext.Namespace.create(testClassName,testMethodName));
            return store;
        }
    }

     

    @ExtendWith

    package com.java.JUnit5.extensions;
    
    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.extension.ExtendWith;
    
    @ExtendWith(FindSlowTestExtension.class)
    public class ExtensionTests {
    
        @Test
        void extensionTest() throws InterruptedException {
            Thread.sleep(1005);
            System.out.println("Extensions!");
        }
    }
    
    /*[결과]************************************************
    Extensions!
    Please consider refactoring [extensionTest] method.
    Process finished with exit code 0
    *******************************************************/

     

    @RegisterExtension

      선언적인 등록(@ExtendWith)의 경우 테스트마다 THRESHOLD 값을 변경할 수 없습니다. 그런 경우, @RegisterExtension을 사용합니다.

    package com.java.JUnit5.extensions;
    
    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.extension.RegisterExtension;
    
    public class ExtensionTests {
    
        @RegisterExtension
        static FindSlowTestExtension findSlowTestExtension =
                new FindSlowTestExtension(1000L);
    
        @Test
        void extensionTest() throws InterruptedException {
            Thread.sleep(1005);
            System.out.println("Extensions!");
        }
    
    }

    [전체 소스코드]

    반응형

    'BackEnd > JUnit' 카테고리의 다른 글

    JUnit 5. JUnit 설정 파일  (0) 2022.02.03
    JUnit 5. 테스트 순서  (0) 2022.02.03
    JUnit 5. 테스트 인스턴스  (0) 2022.02.03
    JUnit 5. 반복문  (0) 2022.02.03
    JUnit 5. Tag  (0) 2022.01.31

    댓글

Designed by Tistory.