본문 바로가기

일상+자잘한 일

[우테코/Week3] JUnit 어노테이션 정리

JUnit5 Annotation Tips Static Badge

JUnit을 저번 주에 너무 얼렁뚱땅 사용하게 되어 기능들을 좀 찾아보고 정리하고자 글을 쓰게 되었다.
많은 블로그에 유익한 정보가 많았지만 ~내가 원하는 어노테이션 별 정리가 없는 것 같아 찾아 정리하게 되었다.
사실 내가 직접 찾아보고 공부해야 머리에 남는 것 같아 조금 정리하게 되었다.

목차

  1. Annotation
  2. 참고 자료

Annotation:

@Test

  • 주석이 달린 메소드가 테스트 메소드임을 알림
  • private이나 static이여서는 안되며, 값을 return해서도 안됨

@ParameterizedTest

  • 다양한 인수를 사용하여 테스트를 여러 번 실행
  • 1개 이상의 인수가 있어야 하며 int, short, String 등 심지어 class까지 가능하다.

@MethodSource

  • 따로 지정하지 않으면 test method와 같은 이름의 methodsource를 찾는다.
  • parameterizedTest를 할 때 사용하는데 테스트용 파라미터 재사용이 필요할 때 사용하면 용이하다고 느꼈다
@ParameterizedTest
@MethodSource("stringProvider")
void testWithExplicitLocalMethodSource(String argument) {
    assertNotNull(argument);
}

static Stream<String> stringProvider() {
    return Stream.of("apple", "banana");
}
  • 또한 이렇게 여러 argument를 한꺼번에 주는 것도 가능하다.
@ParameterizedTest
@MethodSource("stringIntAndListProvider")
void testWithMultiArgMethodSource(String str, int num, List<String> list) {
    assertEquals(5, str.length());
    assertTrue(num >=1 && num <=2);
    assertEquals(2, list.size());
}

static Stream<Arguments> stringIntAndListProvider() {
    return Stream.of(
        arguments("apple", 1, Arrays.asList("a", "b")),
        arguments("lemon", 2, Arrays.asList("x", "y"))
    );
}

 

@RepeatedTest

  • 원하는 횟수만큼 테스트를 반복해서 실행
  • 임계값(failure threshold)을 설정하여 임계값 이상 실패시 테스트 종료 가능

@DisplayName

  • test report나 test runner나 IDE상에 나타날 테스트의 이름을 설정하며 이모지, 특수기호 등도 사용가능하다.

@BeforeEach

@BeforeAll

  • 테스트 실행 전에 먼저 실행시키는 것을 정의할 때 사용한다.
  • 아래 코드와 같이 display name이나 test method name을 지정하여 사용 가능하다.
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;

@DisplayName("TestInfo Demo")
class TestInfoDemo {

    TestInfoDemo(TestInfo testInfo) {
        assertEquals("TestInfo Demo", testInfo.getDisplayName());
    }

    @BeforeEach
    void init(TestInfo testInfo) {
        String displayName = testInfo.getDisplayName();
        assertTrue(displayName.equals("TEST 1") || displayName.equals("test2()"));
    }

    @Test
    @DisplayName("TEST 1")
    @Tag("my-tag")
    void test1(TestInfo testInfo) {
        assertEquals("TEST 1", testInfo.getDisplayName());
        assertTrue(testInfo.getTags().contains("my-tag"));
    }

    @Test
    void test2() {
    }

}

References:

https://junit.org/junit5/docs/current/user-guide/

https://junit.org/junit5/docs/current/api/