자바 - 파라미터 테스트 작성법

희운·2025년 12월 2일

JUnit5 @ParameterizedTest 에서 자주 쓰는
@MethodSource, @ValueSource, @CsvSource 의 차이

1) @ValueSource — 단일 타입(값 하나씩) 테스트

가장 간단한 파라미터 제공 방식.

  • 문자열, 숫자, boolean 등 하나의 값만 제공 가능
  • 여러 파라미터가 필요한 테스트에는 사용 불가

예)

@ParameterizedTest
@ValueSource(strings = {"a", "b", "c"})
void test(String input) {
    assertThat(input).isNotBlank();
}

✔ 장점: 매우 간단
✘ 단점: 여러 인자를 테스트할 수 없음


2) @CsvSource — 여러 인자를 한 줄에서 받는 테스트

CSV(쉼표로 구분된 값)를 사용해
테스트 메서드 파라미터 여러 개 전달 가능.

예)

@ParameterizedTest
@CsvSource({
    "1, 2, 3",
    "4, 6, 10",
})
void plus_test(int a, int b, int expected) {
    assertThat(a + b).isEqualTo(expected);
}

✔ 장점: 여러 인자를 손쉽게 넣을 수 있음
✔ 문자열도 가능
✘ 단점: 복잡한 데이터, 콤마 포함 문자열은 다루기 조금 귀찮음


3) @MethodSource — 가장 강력하고 유연한 방식

메서드로부터 복잡한 객체, 리스트, 여러 인자 등 어떤 형태든 전달 가능.

@ParameterizedTest
@MethodSource("numberProvider")
void test(List<Integer> numbers, int expected) {
    assertThat(numbers.stream().mapToInt(i -> i).sum())
            .isEqualTo(expected);
}

static Stream<Arguments> numberProvider() {
    return Stream.of(
        Arguments.of(List.of(1,2,3), 6),
        Arguments.of(List.of(4,4,2), 10)
    );
}

✔ 장점:

  • 복잡한 타입 전달 가능
  • 객체, 리스트, Map, DTO 등 전부 가능
  • 자유도가 가장 높음

✘ 단점:

  • 메서드를 따로 작성해야 해서 가장 길다

언제 무엇을 쓰면 될까?

✔ 값 하나만 바꿔서 테스트 → @ValueSource

예) 문자열이 유효한지 검사
예) 길이 체크, 숫자만 체크


✔ 파라미터 여러 개 있는 함수 테스트 → @CsvSource

예)

  • a + b = expected
  • 입력/출력 구조 명확할 때

✔ 리스트, 객체, 컬렉션, 복잡한 입력이 필요 → @MethodSource

예)

  • List
  • Map
  • DTO
  • 커스텀 클래스 조합

너가 만든 NumberParser 테스트는 “리스트 반환 + 다양한 문자열 입력”이라서
@MethodSource가 최적이야.


@ValueSource 는 단일 값,
@CsvSource 는 여러 파라미터,
@MethodSource 는 가장 자유도가 높아 복잡한 입력을 테스트할 때 사용한다.

profile
기록하는 공간

0개의 댓글