@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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- @CsvSource와 @MethodSource를 사용한 매개변수화 테스트
- Mockito 고급: 인수 캡처와 스파이
- Spring Boot 테스트 슬라이스: @WebMvcTest와 @DataJpaTest
- Testcontainers: 실제 데이터베이스 통합 테스트