0Pricing
Java Academy · 강의

@CsvSource와 @MethodSource를 사용한 매개변수화 테스트

@ParameterizedTest, @CsvSource, @MethodSource를 사용하여 여러 입력 세트로 동일한 테스트를 실행합니다.

@CsvSource와 @MethodSource를 사용한 매개변수화 테스트은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

매개변수화된 테스트를 사용하는 이유

동일한 테스트 로직을 여러 입력 집합으로 실행하면 테스트 메서드를 복사하여 붙여 넣지 않고도 경계 사례를 발견할 수 있습니다. JUnit 5는 @ParameterizedTest를 사용하여 매개변수화된 테스트를 기본적으로 지원합니다.

@ValueSource: 단일 값을 사용하는 간단한 테스트

@ValueSource는 지정된 유형의 단일 매개변수를 제공합니다. 각 값마다 테스트가 한 번씩 실행됩니다.

@ParameterizedTest
@ValueSource(strings = {"", "  ", "\t"})
void blank_strings_are_rejected(String input) {
    assertThrows(IllegalArgumentException.class, () -> validator.validate(input));
}

@CsvSource: 여러 매개변수를 인라인으로 지정

@CsvSource는 쉼표로 구분된 값의 행을 제공합니다. 각 행은 한 번의 테스트 실행에 해당합니다. 문자열 값에 쉼표를 포함하려면 작은따옴표를 사용합니다.

@ParameterizedTest
@CsvSource({
    "Alice, 30, true",
    "Bob,   17, false",
    "Carol, 0,  false"
})
void test_adult_check(String name, int age, boolean expectedAdult) {
    User user = new User(name, age);
    assertEquals(expectedAdult, user.isAdult());
}

@CsvSource와 delimiterString

여러 문자로 된 구분자를 사용하거나 데이터에 쉼표가 포함된 경우 delimiterString을 사용합니다. 특정 문자열을 null로 매핑하려면 nullValues를 사용합니다.

@ParameterizedTest
@CsvSource(value = {
    "Alice | 30 | ADMIN",
    "Bob   | 25 | USER"
}, delimiterString = "|")
void test_roles(String name, int age, String role) { ... }

@CsvFileSource: 외부 데이터 파일

클래스 경로에 있는 CSV 파일에서 테스트 데이터를 불러옵니다. 테스트 코드를 복잡하게 만들 수 있는 대규모 데이터 집합에 유용합니다.

@ParameterizedTest
@CsvFileSource(resources = "/test-data/users.csv", numLinesToSkip = 1)
void test_from_file(String name, int age, boolean expected) {
    assertEquals(expected, service.isEligible(name, age));
}

@MethodSource: 복잡한 매개변수

@MethodSource는 Stream<Arguments>를 반환하는 정적 팩터리 메서드를 호출합니다. 각 Arguments.of()는 한 번의 테스트 실행에 해당합니다. 복잡한 객체에 사용합니다.

@ParameterizedTest
@MethodSource("provideOrders")
void test_total_calculation(Order order, BigDecimal expected) {
    assertEquals(expected, orderService.calculateTotal(order));
}
static Stream<Arguments> provideOrders() {
    return Stream.of(
        Arguments.of(new Order(List.of(item(10), item(20))), BigDecimal.valueOf(30)),
        Arguments.of(new Order(List.of()),                   BigDecimal.ZERO)
    );
}

@EnumSource: 모든 열거형 값 테스트

@EnumSource는 각 열거형 상수마다 테스트를 한 번씩 실행합니다. 특정 값을 포함하거나 제외하려면 mode와 names를 사용합니다.

@ParameterizedTest
@EnumSource(value = UserStatus.class, mode = EnumSource.Mode.EXCLUDE, names = "DELETED")
void test_active_statuses(UserStatus status) {
    assertTrue(notificationService.shouldNotify(status));
}

@NullAndEmptySource

null 및 빈 문자열 입력을 테스트하기 위한 축약형입니다. @NullSource + @EmptySource를 사용하여 @ValueSource와 결합하거나, 결합된 @NullAndEmptySource를 사용합니다.

@ParameterizedTest
@NullAndEmptySource
void null_and_empty_are_invalid(String input) {
    assertFalse(validator.isValid(input));
}

사용자 정의 표시 이름

@ParameterizedTest에서 name을 사용하여 테스트 표시 이름의 형식을 지정합니다. 자리표시자는 {index}, {0}, {1}, {arguments}입니다.

@ParameterizedTest(name = "age={1} should be adult={2}")
@CsvSource({"Alice, 30, true", "Bob, 17, false"})
void test_adult(String name, int age, boolean expected) { ... }

@ArgumentsSource로 소스 결합

인수 생성을 완전히 사용자 정의하려면 ArgumentsProvider를 구현합니다. 데이터베이스, 파일 또는 API에서 동적으로 데이터를 가져올 수 있습니다.

public class UserArgumentsProvider implements ArgumentsProvider {
    public Stream<? extends Arguments> provideArguments(ExtensionContext ctx) {
        return Stream.of(
            Arguments.of(new User("Alice", 30)),
            Arguments.of(new User("Bob", 17))
        );
    }
}
@ParameterizedTest
@ArgumentsSource(UserArgumentsProvider.class)
void test_user(User user) { ... }

경계값에 대한 매개변수화된 테스트

경계 조건을 체계적으로 테스트합니다. min-1, min, max, max+1을 확인합니다. 매개변수화된 테스트를 사용하면 경계값 적용 범위를 읽기 쉽고 유지 관리하기 쉽게 만들 수 있습니다.

@ParameterizedTest
@CsvSource({"0, false", "1, true", "100, true", "101, false"})
void test_range_boundaries(int value, boolean expected) {
    assertEquals(expected, validator.isInRange(value, 1, 100));
}

빠른 확인

각 테스트 실행에 사용할 인수를 제공하는 @MethodSource 반환 유형은 무엇인가요?

복습

인라인 표 형식 데이터에는 @CsvSource, 복잡한 객체에는 @MethodSource, 모든 열거형 값에는 @EnumSource, null 및 빈 값의 경계 사례에는 @NullAndEmptySource를 사용합니다. name=을 사용한 사용자 정의 이름은 테스트 가독성을 높입니다.

자주 묻는 질문

“@CsvSource와 @MethodSource를 사용한 매개변수화 테스트” 강의는 무료인가요?

네 — “@CsvSource와 @MethodSource를 사용한 매개변수화 테스트” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“@CsvSource와 @MethodSource를 사용한 매개변수화 테스트”에서 뭘 배우나요?

@ParameterizedTest, @CsvSource, @MethodSource를 사용하여 여러 입력 세트로 동일한 테스트를 실행합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Java Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“@CsvSource와 @MethodSource를 사용한 매개변수화 테스트” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. @CsvSource와 @MethodSource를 사용한 매개변수화 테스트
  2. Mockito 고급: 인수 캡처와 스파이
  3. Spring Boot 테스트 슬라이스: @WebMvcTest와 @DataJpaTest
  4. Testcontainers: 실제 데이터베이스 통합 테스트
← Java Academy(으)로 돌아가기