การทดสอบแบบกำหนดพารามิเตอร์ด้วย @CsvSource และ @MethodSource
เรียกใช้การทดสอบเดียวกันกับชุดข้อมูลนำเข้าหลายชุดด้วย @ParameterizedTest, @CsvSource และ @MethodSource
การทดสอบแบบกำหนดพารามิเตอร์ด้วย @CsvSource และ @MethodSource เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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 สำหรับตัวคั่นที่มีหลายอักขระ หรือเมื่อข้อมูลของคุณมีเครื่องหมายจุลภาค ใช้ nullValues เพื่อแปลงสตริงตัวแทนให้เป็นค่าว่าง
@ParameterizedTest
@CsvSource(value = {
"Alice | 30 | ADMIN",
"Bob | 25 | USER"
}, delimiterString = "|")
void test_roles(String name, int age, String role) { ... }@CsvFileSource: ไฟล์ข้อมูลภายนอก
โหลดข้อมูลการทดสอบจากไฟล์ CSV ใน classpath เหมาะสำหรับชุดข้อมูลขนาดใหญ่ที่อาจทำให้โค้ดการทดสอบรก
@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 และสตริงว่าง คุณสามารถใช้ร่วมกับ @ValueSource โดยใช้ @NullSource + @EmptySource หรือใช้ @NullAndEmptySource ที่รวมทั้งสองอย่างไว้แล้ว
@ParameterizedTest
@NullAndEmptySource
void null_and_empty_are_invalid(String input) {
assertFalse(validator.isValid(input));
}ชื่อที่แสดงแบบกำหนดเอง
ใช้ name ใน @ParameterizedTest เพื่อจัดรูปแบบชื่อที่แสดงของการทดสอบ ตัวแทนที่ใช้ได้มี: {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) { ... }การทดสอบแบบมีพารามิเตอร์สำหรับค่าขอบเขต
ทดสอบเงื่อนไขขอบเขตอย่างเป็นระบบ: ค่าต่ำสุด-1, ค่าต่ำสุด, ค่าสูงสุด และค่าสูงสุด+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 สำหรับค่าของชนิดแจงนับทั้งหมด และใช้ @NullAndEmptySource สำหรับกรณีขอบเขตที่เป็นค่าว่างหรือสตริงว่าง การกำหนดชื่อด้วย name= ช่วยให้อ่านการทดสอบได้ง่ายขึ้น
คำถามที่พบบ่อย
บทเรียน “การทดสอบแบบกำหนดพารามิเตอร์ด้วย @CsvSource และ @MethodSource” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การทดสอบแบบกำหนดพารามิเตอร์ด้วย @CsvSource และ @MethodSource” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การทดสอบแบบกำหนดพารามิเตอร์ด้วย @CsvSource และ @MethodSource”
เรียกใช้การทดสอบเดียวกันกับชุดข้อมูลนำเข้าหลายชุดด้วย @ParameterizedTest, @CsvSource และ @MethodSource คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การทดสอบแบบกำหนดพารามิเตอร์ด้วย @CsvSource และ @MethodSource” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การทดสอบแบบกำหนดพารามิเตอร์ด้วย @CsvSource และ @MethodSource
- Mockito ขั้นสูง: ตัวจับอาร์กิวเมนต์และสายลับ
- ส่วนทดสอบ Spring Boot: @WebMvcTest และ @DataJpaTest
- Testcontainers: การทดสอบการผสานรวมกับฐานข้อมูลจริง