본문 바로가기

Java

[JUnit5] @ParameterizedTest

1. 문제 정의

테스트 코드를 작성하다 보면 반복되는 코드들이 쌓이는 것을 알 수 있습니다.

Set Collection 의 학습 테스트를 예시로 들어보겠습니다.

@Test
void numbersTest() {
    // given
    Set<Integer> numbers = Set.of(1, 2, 3);

    // when, then
    assertThat(numbers).contains(1);
    assertThat(numbers).contains(2);
    assertThat(numbers).contains(3); 
}

위 테스트 코드의 문제점은 assertThat().contains(); 가 반복된다는 것입니다.

이러한 코드의 중복을 어떻게 줄일 수 있을까요?

2. @ParameterizedTest

위와 같은 문제를 해결하기 위해 @ParameterizedTest를 활용할 수 있습니다.

2 - 1 @ValueSource

@ParameterizedTest
@ValueSource( ints = {1, 2, 3})
void numbersTest(int number) {
        // given
    Set<Integer> numbers = Set.of(1, 2, 3);

    // when, then
    assertThat(numbers).contains(number);
}

이처럼 @ParameterizedTest와 @ValueSoucre를 활용하여 코드의 중복을 줄일 수 있습니다.

하지만 위의 코드에서도 true 인지만 테스트 할 수 있다는 것입니다.

이러한 문제를 해결하기 위해서 @CsvSource를 사용할 수 있습니다.

2 - 2 @CsvSource

@ParameterizedTest
@CsvScource({"1:true", "2,true", "3,true", "4,false", "5,false"}, delimiter = ':')
void numbersTest(int number, String expected) {
    // given
    Set<Integer> numbers = Set.of(1, 2, 3);

    // when, then
    assertThat(numbers.contains(number)).isEqualTo(expected);
}

이처럼 csv 형식을 사용해서 테스트 코드를 개선할 수 있습니다.

3. 마무리

@ParameterizedTest를 사용하면 여러 개의 테스트를 할 수 있습니다.

한 개의 인수가 필요할 시 @ValueSoucre를 사용하고,

한 개의 인수와 그에 대한 결과값을 기대한다면 @CsvSoucre를 사용할 수 있습니다.

'Java' 카테고리의 다른 글

어떻게 JVM은 메모리를 관리할까  (0) 2024.01.13
디미터의 법칙  (0) 2023.11.14
Spring Test - H2 적용하기  (0) 2023.10.31
Java Record  (0) 2023.10.23
== & Equals  (0) 2023.10.15