ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JUnit Test Discovery 알아보기
    Test 2019. 7. 25. 09:15
    728x90
    반응형

    - 목차

     

    소개.

    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 를 스캔합니다. 

     

     

    반응형
Designed by Tistory.