Junit5으로 Enum 테스트 -@ParameterizedTest, @CsvSource, @MethodSource

Jiwon Jung·2023년 5월 7일
0
post-thumbnail

오늘은 JUnit5으로 Enum을 테스트할 수 있는 방법들을 소개해볼까 합니다.

저는 @ParameterizedTest 애노테이션을 사용해서 Enum 값을 검증하는 테스트 코드를 작성하곤 합니다.

우선 이 애노테이션 없이 테스트 하는 코드를 먼저 보여드리겠습니다.

무지개색 타입의 Enum이 맞는지를 판별하는 static 메소드를 가진 Enum 클래스입니다.
(예시는 좀 그렇지만,,, 이해를 돕기 위해 좀 쉬운 예제를 가져왔습니다!)

테스트 코드에서는 빨강(RED)과 노랑(YELLOW)은 무지개색이지만, 검정(BLACK)은 무지개색이 아닌 것을 검정하려고 합니다.

저는 하나의 테스트 코드에 if문과 같이 분기문 사용하여 한 번에 여러 값을 검증하기 보다 하나의 테스트코느는 하나의 값을 검증하는 것이 좋다고 생각합니다. 안그러면 그 여러 값을 검증하는데에 맥락을 모두 읽어보며 파악해야 하기 때문입니다.

아래처럼 각 enum의 값이 무지개 색인지를 테스트 할 수 있습니다. 그런데 enum의 갯수가 많아질 수 도 있는데 이렇게 그 개수만큼 테스트가 늘어나면 길어지고 불편하지 않을까요??

class RainbowTypeTest {

    @DisplayName("무지개 색상 관련 타입인지를 체크한다.")
    @Test
    void isRainbowColor1() {
        // given
        RainbowType givenType = RainbowType.RED;

        // when
        boolean result = RainbowType.isRainbowColor(givenType);

        // then
        assertThat(result).isTrue();
    }

    @DisplayName("무지개 색상 관련 타입인지를 체크한다.")
    @Test
    void isRainbowColor2() {
        // given
        RainbowType givenType = RainbowType.YELLOW;

        // when
        boolean result = RainbowType.isRainbowColor(givenType);

        // then
        assertThat(result).isTrue();
    }

    @DisplayName("무지개 색상 관련 타입인지를 체크한다.")
    @Test
    void isRainbowColor3() {
        // given
        RainbowType givenType = RainbowType.BLACK;

        // when
        boolean result = RainbowType.isRainbowColor(givenType);

        // then
        assertThat(result).isFalse();
    }

}

이젠 위와 같은 테스트를 좀 더 편리하게 검증하게 해줄 수 있는 @ParameterizedTest를 사용하는 방법입니다. @CsvSource를 함께 사용하여, 각 타입의 expected(예상되는) 값을 컴마로 구문하여 아래처럼 작성할 수 있습니다.

   @DisplayName("무지개 색상 관련 타입인지를 체크한다.")
   @CsvSource({"RED,true","YELLOW,true","BLACK,false"})
   @ParameterizedTest
   void containsStockType4(RainbowType rainbowType, boolean expected) {
        // when
        boolean result = RainbowType.isRainbowColor(rainbowType);

        // then
        assertThat(result).isEqualTo(expected);
   }

@CsvSource 말고도 @MethodSource라는 것도 있습니다.
이건 애노테이션 이름처럼 매소드를 통해 체크하는 방법입니다. 저는 보통 Enum의 갯수가 좀 많다싶으면 아래 방식처럼 테스트를 작성합니다.

테스트할 enum의 타입 리스트를 Stream.of()로 반환하는 given 역할의 메소드를 만들고요.
그 메소드의 이름이 동일하게 @MethodSource("메소드명")에 지정해주면 됩니다.

   private static Stream<Arguments> rainbowTypesForCheckingIsRainbowColor() {
        return Stream.of(
                Arguments.of(RainbowType.RED, true),
                Arguments.of(RainbowType.YELLOW, true),
                Arguments.of(RainbowType.BLACK, false)
        );
    }

    @DisplayName("무지개 색상 관련 타입인지를 체크한다.")
    @MethodSource("rainbowTypesForCheckingIsRainbowColor")
    @ParameterizedTest
    void containsStockType5(RainbowType rainbowType, boolean expected) {
        // when
        boolean result = RainbowType.isRainbowColor(rainbowType);

        // then
        assertThat(result).isEqualTo(expected);
    }

여기까지 Enum 값들을 테스트해볼 수 있는 방법들을 소개해봤구요.
사실 Enum이 아니어도 파라미터 값들을 이런 식으로 테스트 해봐도 됩니다.

좀 더 자세한 사용법이 궁금하시다면 공식 @Parameterized 에 관한 공식 JUnit5 공식문서를 참고하시기 바랍니다.

오늘의 포스팅 여기서 마치겠습니다. 감사합니다.

JUnit5 가이드 문서

https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests

profile
게을러지고 싶어 부지런한 개발자

0개의 댓글