Parameterized Tests

@Parameterizeds는 여러 값들을 이용하여, 한번에 단일 테스트를 여러 번 실행할 수 있습니다.

종속성 추가

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.8.1</version>
    <scope>test</scope>
</dependency>

Int 와 String 테스트: @ValueSource

public class Numbers {
    public static boolean isOdd(int number) {
        return number % 2 != 0;
    }
}

number 파라미터에 ValueSource 안에 값들을 할당하면서 여러번 테스트한다.

// 설명: 6개 int 홀수 인지 테스트
@ParameterizedTest
@ValueSource(ints = {1, 3, 5, -3, 15, Integer.MAX_VALUE}) 
void isOdd_ShouldReturnTrueForOddNumbers(int number) { 
    assertTrue(Numbers.isOdd(number));
}

숫자 말고도 String도 테스트가 가능하다.

주의

  • 위의 @ValueSource 로 null 은 넘겨줄 수 없다.

  • @NullSource를 대신 이용하면 된다 (다만, int 같은 primitive 타입에는 적용 불가).

  • 비슷하게 @EmptySource 도 사용 가능하다. 이 어노테이션은 추가적으로, Collection 타입들이나 Array 들을 위한 빈 값들도 제공해준다.

  • 위 두가지를 모두 합친, @NullAndEmptySource 도 있다.

@NullAndEmptySource + @ValueSource 같이 쓰기

Enum 테스트: @EnumSource

@EnumSource 속성 이용하기

@ValueSource, @EnumSource 둘 다 오직 한개의 매개변수를 넘길 때만 사용 가능하다.

다수 값을 넘길때를 살펴보자.

여러 args 테스트: @CsvSource

콤마 말고 다른 delimiter 사용

CSV 파일에서 가져오기

Method 테스트: @MethodSource

좀더 복잡한 args 를 다룰 때는,

메소드 이름 지정을 안하면, 테스트명과 동일한 것을 찾는다.

Full Qualified Name(FQN)을 써도 된다.

커스텀 매개변수 클래스 만들기: @ArgumentsSource, ArgumentsProvider

타입 변환

명시적 Conversion

위에서, Month 의 값들을 가져올때, 클래스를 명시해주었다. 하지만, String 으로 줘도 Junit은 자동으로 conversion 을 해준다.

  • String 사용시에도 형 변환 가능한 타입들

  • UUID

  • Locale

  • LocalDate, LocalTime, LocalDateTime, Year, Month, etc.

  • File and Path

  • URL and URI

  • Enum subclasses

비명시적 Conversion: @ConvertWith

ArgumentAccessor

매개변수 배열에서 특정 arg 위치에 접근이 가능하다.

이쁘게 출력하기

참고자료

  • https://www.baeldung.com/parameterized-tests-junit-5

Last updated