-
JUnit 5. ExtensionBackEnd/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