개발/Test

Test / JUnit5 / 테스트를 위한 애노테이션

highright96 2021. 6. 15.

JUnit5 / 테스트를 위한 애노테이션

JUnit5에서 제공하는 여러 어노테이션들을 알아보려고 한다.

1. JUnit5 모듈 구성

JUnit5는 크게 세 개의 요소로 구성되어 있다.

  • JUnit Platform : 테스팅 프레임워크를 구동하기 위한 런처와 테스트 엔진을 위한 API를 제공한다.
  • JUnit Jupiter : JUnit5을 위한 테스트 API와 실행 엔진을 제공한다.
  • JUnit Vintage : JUnit3, 4로 작성된 테스트를 JUnit5에서 플랫폼에서 실행하기 위한 모듈을 제공한다.

2. build.gradle에 추가하기

Spring boot에서 JUnit5를 사용하려면 다음과 같은 코드를 build.gradle에 추가하면 된다.

  • 내 프로젝트 테스트에 JUnit Platform을 허용한다.
    test {
        useJUnitPlatform()
    }
  • JUnit Jupiter 의존을 추가한다.
    dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.1'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
    }​
  • JUnit3, 4를 실행하고 싶으면 JUnit Vintage 의존도 추가한다.
    dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.1'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
        testCompileOnly 'junit:junit:4.13'
        testRuntimeOnly 'org.junit.vintage:junit-vintage-engine'
    }
  • 위의 과정을 모두 생략하고 다음과 같이 한 줄로 테스트에 필요한 기본적인 의존들을 추가할 수 있다.
    dependencies {
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }

3. 테스트를 위한 애노테이션

@Test 

테스트를 실행할 메서드에 @Test 애노테이션을 붙인다.

이때 @Test 애노테이션을 붙인 메서드는 private이면 안 되며, default는 가능하다.

@Test
void 테스트() {
   //내용
}

@DisplayName

자바는 메서드 이름에 공백이나 특수 문자를 사용할 수 없기 때문에 메서드 이름만으로 테스트의 내용을 설명하기 부족할 수 있다. 따라서 JUnit5는 테스트에 이름을 표시할 수 있는 @DisplayName 애노테이션을 제공한다.

@DisplayName("테스트 입니다.")
@Test
void test() {
   //내용
}

@Disabled

특정 테스트를 실행하지 않고 싶을 때는 @Disabled 애노테이션을 사용한다. JUnit은 @Disabled 애노테이션이 붙은 클래스나 매서드를 테스트 실행 대상에서 제외된다. 완성하지 않거나 지우기 애매한 테스트에 이 애노테이션을 사용하면 된다.

@BeforeEach @AfterEach

간단한 예제를 먼저 살펴보자.

public class Lifecycle {
    public Lifecycle() {
        System.out.println("Lifecycle 생성");
    }

    @BeforeEach
    void setUp(){
        System.out.println("BeforeEach");
    }

    @Test
    void test1(){
        System.out.println("Test1");
    }

    @Test
    void test2(){
        System.out.println("Test2");
    }

    @AfterEach
    void tearDown(){
        System.out.println("AfterEach");
    }
}
//결과화면
Lifecycle 생성
BeforeEach
Test1
AfterEach
Lifecycle 생성
BeforeEach
Test2
AfterEach

위의 결과를 보면 @Test 매서드를 실행할 때마다 객체를 새로 생성하고 테스트 메서드를 실행하기 전과 후에 @BeforEach와 @AfterEach 애노테이션을 붙인 메서드가 실행되는 것을 알 수 있다.

@BeforeEach 애노테이션은 테스트를 실행하는데 필요한 준비 작업을 할 때 사용된다. 반대로 @AfterEach 애노테이션은 테스트를 실행한 후 정리할 것이 있을 때 사용된다.

@BeforeAll @AfterAll

간단한 예제를 먼저 살펴보자.

public class Lifecycle {
    public Lifecycle() {
        System.out.println("Lifecycle 생성");
    }

    @BeforeAll
    static void beforeAll(){
        System.out.println("BeforeAll");
    }

    @Test
    void test1(){
        System.out.println("Test1");
    }

    @Test
    void test2(){
        System.out.println("Test2");
    }

    @AfterAll
    static void afterAll(){
        System.out.println("AfterAll");
    }
}
//결과화면
BeforeAll
Lifecycle 생성
Test1
Lifecycle 생성
Test2
AfterAll

위의 결과를 보면 @BeforeAll 애노테이션은 모든 테스트 메서드가 실행되기 전 한 번만 실행된다. 반대로 @AfterAll 애노테이션은 모든 테스트 메서드가 끝난 후에 한 번만 실행된다. 두 애노테이션은 객체가 생성되기 전, 삭제된 후에 호출되기 때문에 정적(static) 메서드에만 사용할 수 있다.

4. 참고

'개발 > Test' 카테고리의 다른 글

Test / Spring Security / 단위 테스트에 Security 추가하기  (0) 2021.06.15

댓글