본문으로 건너뛰기

"Java" 태그로 연결된 5개 게시물개의 게시물이 있습니다.

모든 태그 보기

· 약 4분

테스트를 작성하다보면 매개변수에 따라 반복이 되는 테스트들이 생긴다.
이 때 @ParameterizedTest를 사용하면 단일 테스트를 매개변수를 사용하여 여러 번 반복할 수 있다.

Argument Sources

@ParameterizedTest를 사용하려면 최소 하나 이상의 Source 애노테이션이 필요하다.
JUnit이 제공하는 다양한 Source가 있기 때문에, 테스트에 맞춰 다양하게 사용할 수 있다.

Value Source

값을 이용하여 제공하는 형태로, 다음과 같은 타입의 값을 매개변수로 제공할 수 있다.

  • short, int, long, float, double
  • byte, char, boolean, String, Class
@ParameterizedTest
@ValueSource(ints = {1, 100, Integer.MAX_VALUE})
void valueTest(final int value) {
Assertions.assertThat(value).isPositive();
}

Null & Empty Source

null 값, 빈 값을 제공한다.
Empty Source의 경우 다음과 같은 타입에 한해 매개변수로 제공할 수 있다.

  • String
  • java.util.List, java.util.Set, java.util.Map
  • primitive arrays — ex) int[]
  • object arrays — ex) String[]
@ParameterizedTest
@NullAndEmptySource
void nullAndEmptyTest(final String value) {
Assertions.assertThat(value).isNullOrEmpty();
}

Enum Source

EnumSource를 이용하여 Enum 또한 매개변수로 제공할 수 있다.

enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

@ParameterizedTest
@EnumSource(Day.class)
void enumTest(final Day day) {
assertThat(day).isInstanceOf(Day.class);
}

다음과 같이 mode 값을 이용하여 특징 Enum을 제외하거나, 포함시킬 수 있다. (default: Mode.Include)

@ParameterizedTest
@EnumSource(value = Day.class, names = {"SATURDAY", "SUNDAY"}, mode = Mode.EXCLUDE)
void enumTest(final Day day) {
// MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
assertThat(day).isInstanceOf(Day.class);
}

CSV Source

csv 형식의 값을 이용하여 매개변수를 제공한다.
구분자의 기본값은 쉼표(,)로 구분자를 변경하고 싶을 땐 delimeter 값을 따로 전달하여 사용할 수 있다. 개인적으로 2개 정도의 값을 매개변수로 전달하는 경우 CsvSource를 사용한다.

@ParameterizedTest
@CsvSource({"1,1", "2,4", "3,9", "4,16"})
void csvTest(final int number, final int result) {
assertThat(number * number).isEqualTo(result);
}

Method Source

복잡한 타입의 값을 전달할 때 사용한다.
메서드명을 입력하여 매개변수를 제공하는 메서드를 지정할 수 있다.
메서드명을 따로 입력하지 않으면 테스트명과 동일한 static 메서드가 지정된다.

@ParameterizedTest
@MethodSource
void methodTest(final List<Integer> numbers, final int count) {
assertThat(numbers).hasSize(count);
}

private static Stream<Arguments> methodTest() {
return Stream.of(
Arguments.of(List.of(1), 1),
Arguments.of(List.of(1, 2), 2),
Arguments.of(List.of(1, 2, 3), 3)
);
}

ETC.

위에서 언급한 방법 이외에도 다양한 방법으로 매개변수를 제공할 수 있다.

  • CSV 파일을 이용한 CsvFileSource
  • ArgumentsProvider 구현한 클래스를 이용하는 ArgumentsSource

참고 자료