-
JUnit Test Discovery 알아보기Test 2019. 7. 25. 09:15728x90반응형
- 목차
소개.
JUnit Test Framework 에는 Test Runner 라는 코어 컴포넌트가 존재합니다.
Test Runner 가 수행하는 여러 역할들 중에서 Test Discovery 에 대해서 살펴보려고 합니다.
Test Discovery 는 선언된 모든 테스트 케이스들을 탐색하는 과정입니다.
JUnit 으로 세팅하는 java test 는 메소드 형식으로 생성됩니다.
예를 들어, 아래와 같은 형식이죠.@Test void test1() { // ... }
Test Runner 는 테스트를 실행하기 위해서 모든 테스트 메소드를 탐색하게 되는데,
Test Runner 어떻게 Test Discovery 를 수행하는지 알아보겠습니다.Annotation 이란 ?
@Test Annotation 은 Runtime Retention 을 가집니다.
여기서 Annotation 의 Retention 에 대해서 알아볼 필요가 있는데요.
Annotation 은 Compile-Time 과 Runtime 두가지 Retention 이 있는데요.
Compile-Time 은 컴파인되는 시점에 해당 어노테이션이 사용됩니다.
예를 들어 @Override 어노테이션의 경우,
해당 어노테이션이 선언된 메소드는 자식 클래스가 반드시 Override 해야하는 메소드를 뜻합니다.
보통 javac 라고 부르는 java Compiler 는 Java Source Code 를 컴파일하는 과정에서
@Override 어노테이션이 적용된 메소드를 자식 클래스가 Override 하지 않은 상태를 발견하면 Compile 을 중단합니다.
또다른 예로 @Deprecated 가 있는데요.
@Deprecated 된 메소드를 다른 클래스에서 사용한다면,
Java Compiler 는 Warning Message 를 남깁니다.
즉, Compile-Time Annotation 은 컴파일 시점에 해당 Annotation 을 활용하여 적절한 대처를 수행합니다.
그리고 컴파일이 끝난 런타임 시점에선 해당 Annotation 을 확인하거나 얻을 수 없습니다.
반면 Runtime Annotation 은 런타임 시점에 확인할 수 있는 Annotation 입니다.
이는 Reflection 을 사용하여 확인할 수 있는데요.
아래와 같은 방식으로 확인할 수 있습니다.UserRepositoryTest.class.getDeclaredFields()[0].getAnnotations() -> @org.springframework.beans.factory.annotation.Autowired(required=true) UserRepositoryTest.class.getDeclaredMethods()[1].getAnnotations() -> @org.junit.jupiter.api.Test() @org.junit.jupiter.api.Disabled() UserRepositoryTest.class.getDeclaredMethods()[0].isAnnotationPresent(Test.class) -> true
@Test Annotation 또한 Runtime Annotation 으로써
@Test 가 선언된 모든 메소드들은 Test Annotation 을 가집니다.@Test Annotation.
@Test Annotation 은 JUnit 의 Test Runner 가 테스트해야할 메소드들을 장식하는 Annotation 입니다.
Runtime Annotation 으로써 Reflection 을 활용하여 @Test Annotation 이 사용된 모든 테스트 메소드를 조회할 수 있습니다.Test Runner 는 모든 테스트 케이스를 수행하기 이전에
등록된 ClassPath 의 모든 Test Method 를 찾습니다.
이 과정은 Test Discovery 라고 부릅니다.
Test Discovery.
Test Discovery 는 JUnit 의 Test Runner 가 수행해야하는 여러 단계 중 첫번째 단계입니다.
Test 단계들은 아래와 같습니다.
- Test Discovery
- Test Execution
- Reporting
일반적인 java 프로그램은 main 이라는 entrypoint 가 존재합니다.
java 프로그램을 실행한다는 의미 또한 main function 을 실행하는 것이죠.
하지만 JUnit 으로 테스트를 실행한다는 의미는 JUnit Test Framework 의 Test Runner 를 실행한다는 의미입니다.
그리고 Test Runner 는 위에 작성한 각 단계들을 수행합니다.
아래와 같은 형식으로 Test Runner 를 수행하면 본격적인 Test Discovery 가 동작합니다.
java junit-test-runner.jar --class-path XXX.class
위에서 언급한 내용들처럼
넘겨받은 모든 classpath 에 대해서 해당 클래스의 @Test Method 를 스캔합니다.반응형