파라미터 테스트를 하는 방법 (Junit5 / JUnitParams)

ashesglow·2020년 2월 9일
0

가능한 최신 버전을 사용하는 걸 좋아한다.
국내 자료로 학습을 하면 아직까지는 많은 자료들이 Junit4 기준으로 설명이 되어 있다.

하지만 현재는 Junit5를 사용하고 있는데,
파라미터 테스트의 경우 활용할 일이 많을 것 같아 Junit5를 기준으로 찾은 내용을 정리해 본다.

참고로 Junit4의 경우 사용하는 어노테이션 자체가 다르다.
가장 큰 차이점은 Junit5 부터는 @ParameterizedTest를 사용한다는 것이다.

파라미터 테스트?

JUnitParams을 먼저 추가해 주어야 한다.
https://mvnrepository.com/artifact/pl.pragmatists/JUnitParams
메이븐, 그래들 등 환경에 맞춰서 의존성을 추가해 주자.

그냥 한번만 보면 바로 이해가 될 것 같다.

    // Junit 5 기준
    @ParameterizedTest(name = "{index} => basePrice={0}, maxPrice={1}, isFree={2}")
    @CsvSource({
            "0, 0, true",
            "100, 0, falae",
            "0, 1000, falae"
    })
    public void testFree(int basePrice, int maxPrice, boolean isFree){
        System.out.println(basePrice);
        // Given
        Event event = Event.builder()
                .basePrice(basePrice)
                .maxPrice(maxPrice)
                .build();
        //When
        event.update();

        // Then
        assertThat(event.isFree()).isEqualTo(isFree);
    }

메서드 활용

저렇게 활용하면 전혀 type-safe하지 않기 때문에, 메서드를 활용하는 방법도 존재한다.

    // Junit 5 기준
    @ParameterizedTest(name = "{index} => basePrice={0}, maxPrice={1}, isFree={2}")
    @MethodSource("testFreeParams")
    public void testFree(int basePrice, int maxPrice, boolean isFree){
        System.out.println(basePrice);
        // Given
        Event event = Event.builder()
                .basePrice(basePrice)
                .maxPrice(maxPrice)
                .build();
        //When
        event.update();

        // Then
        assertThat(event.isFree()).isEqualTo(isFree);
    }

    // static 있어야 동작
    private static Object[] testFreeParams() {
        return new Object[]{
                new Object[]{0, 0, true},
                new Object[]{100, 0, false},
                new Object[]{0, 100, false}
        };
    }

// 외국 문서들에서는 스트림을 활용하는 경우가 많았다.
/*
    private static Stream<Arguments> sumProvider() {
        return Stream.of(
                Arguments.of(1, 1, 2),
                Arguments.of(2, 3, 5)
        );
    }
*/

image.png

Enum 활용

추가적으로 좀 더 살펴보자면
Enum 을 활용하는 방법 또한 존재한다. (문서로 보고 궁금해서 직접 구현해 보았다.)

public enum ProductType {

    CLASS(Class.PRODUCT_TYPE_VALUE, Class.PRODUCT_TYPE_ENG_NAME, Class.PRODUCT_TYPE_KOR_NAME),
    KIT(Kit.PRODUCT_TYPE_VALUE, Kit.PRODUCT_TYPE_ENG_NAME, Kit.PRODUCT_TYPE_KOR_NAME);

    private final String typeValue;
    private final String typeEngName;
    private final String typeKorName;
...
    @DisplayName("ProductType Enum 확인")
    @ParameterizedTest(name = "{index} => productType='{0}'")
    @EnumSource(ProductType.class)
    void test(ProductType productType) {
        assertNotNull(productType);
    }

ProductType 로 바로 받아오는 걸 확인할 수 있다.
찍어보니 이늄 수(코드 수)만큼 도는것 확인했다.

csv 파일 활용

또한 .csv 파일로 바로 받아오는 것도 가능하다.

  @ParameterizedTest(name = "{index} => a={0}, b={1}, sum={2}")
  @CsvFileSource(resources = "/test-data.csv")
  void sum(int a, int b, int sum) {
    assertEquals(sum, a + b);
  }

0개의 댓글