반응형

@ParameterizedTest를 언제 사용해야 할까?

@ParameterizedTest와 조합으로 @ValueSource, @CsvSource를 많이 사용할 것이다.
나는 개인적으로는 잘 사용하지 않는 기능이다. 이유는 가독성이 떨어진다고 생각했기 때문이다.
아무래도 여러 케이스를 묶어서 테스트를 작성하다보니, 파라미터만으로 어떤 테스트를 의미하는지
이해하기 불편하다고 생각을 했다. 하지만 모든 것은 장단점이 있기 때문에 이번 기회에 피드백을 받고
사용을 해보며, 어떤 점이 좋을지 찾아보았다.

@ParameterizedTest의 장점

여러가지가 있겠지만 내가 느낀 장점은 한 가지였다.
간결하게 작성할 수 있다.

아무래도 중복되는 케이스인데 데이터만 다른데 케이스가 많으면, 관리할 코드가 많아져서
이 또한 편하지는 않다. @ParameterizedTest를 활용하여, 간결하게 사용하면 좋았다.

@ParameterizedTest의 단점

데이터만으로 데이터가 어떤 테스트를 의미하는지 판별이 어렵다.
물론 설명글을 남기면 되지만, 설명 글이 많아지면, 또한 관리 포인트가 된다.
(의미없는 주석이 생길 확률)
그리고 설명 글과 코드가 100% 일치 한다는 보장도 없다고 생각한다.

일반 테스트의 장점

일반 테스트란 @Test를 의미한다.

아무래도 테스트 데이터 별로 테스트 메서드가 분리되어 있기 때문에
좀 더 의미를 명확하게 드러낼 수 있다. 설명 글을 남긴다 하더라도
간결하게 남길 수 있다.

일반 테스트의 단점

중복되는 케이스이지만 데이터만 다른 케이스가 많은 경우 관리할 코드가 많아져서
실수를 유발한다. 어떻게 보면, 장점이자 단점이 되기도 하는 것 같다.

어떤 상황에 @ParameterizedTest를 사용하면 좋을까?

이번에 피드백을 받고, 고민을 해보았다.
아주 간단하게 피드백을 반영하면서 정리가 되었다.

데이터만으로 의도가 명확하게 드러난다면, @ParameterizedTest를 사용하고,
그렇지 않다면, 코드가 많아지더라도, 중복이 발생하더라도 일반 테스트를 작성한다.

예시를 들어 보자.

@ParameterizedTest를 사용할 상황

아래는 지하철 요금을 청소년과 어린이는 할인을 해주는 테스트 케이스이다.

@DisplayName("청소년 할인")
@ParameterizedTest
@ValueSource(ints = {TEENAGER_AGE_BEGIN, TEENAGER_AGE_END})
void teenager(int age) {
    // given
    FareAge fareAge = FareAge.valueOf(age);

    // when
    int discountFare = fareAge.getFareAge(GENERAL_FARE);

    // then
    assertThat(discountFare).isEqualTo(720);
}

@DisplayName("어린이 할인")
@ParameterizedTest
@ValueSource(ints = {CHILD_AGE_BEGIN, CHILD_AGE_END})
void child(int age) {
    // given
    FareAge fareAge = FareAge.valueOf(age);

    // when
    int discountFare = fareAge.getFareAge(GENERAL_FARE);

    // then
    assertThat(discountFare).isEqualTo(450);
}

이런 테스트는 설명 글(@DisplayName)과 데이터(파라미터)만으로 충분히 의미가 명확히 전달 된다고
생각한다.

청소년 할인의 경우
TEENAGER_AGE_BEGIN(청소년 시작 나이) ~ TEENAGER_AGE_END(청소년 마지막 나이)라고
의미가 잘 드러났다고 생각한다. 이런 경우는 굳이 테스트를 청소년 시작 나이, 청소년 마지막 나이 두 가지
케이스로 분리할 필요가 없는 것 같다.

반응형

'기타 IT' 카테고리의 다른 글

테스트 더블 테스트 VS 실제 객체 테스트(classicist vs mockist)  (0) 2022.04.15
SSH란?  (0) 2022.03.22
상태 패턴이란  (0) 2022.01.05
템플릿 메서드 패턴  (0) 2021.12.29
전략(Strategy) 패턴  (0) 2021.12.23
복사했습니다!