0Pricing
Java Academy · บทเรียน

การทดสอบแบบกำหนดพารามิเตอร์ด้วย @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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การทดสอบแบบกำหนดพารามิเตอร์ด้วย @CsvSource และ @MethodSource
  2. Mockito ขั้นสูง: ตัวจับอาร์กิวเมนต์และสายลับ
  3. ส่วนทดสอบ Spring Boot: @WebMvcTest และ @DataJpaTest
  4. Testcontainers: การทดสอบการผสานรวมกับฐานข้อมูลจริง
← กลับไปที่ Java Academy