0Pricing
Java Academy · درس

الاختبارات المعلَّمة بالمعاملات باستخدام @CsvSource و@MethodSource

شغّل الاختبار نفسه مع مجموعات إدخال متعددة باستخدام @ParameterizedTest و@CsvSource و@MethodSource

الاختبارات المعلَّمة بالمعاملات باستخدام @CsvSource و@MethodSource درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 لتحويل سلسلة مميِّزة إلى null.

@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) { ... }

الاختبارات ذات المعلمات للقيم الحدية

اختبر شروط الحدود بشكل منهجي: 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 لجميع قيم التعداد، و@NullAndEmptySource للحالات الحدية التي تتضمن null أو قيمة فارغة. وتحسّن الأسماء المخصصة باستخدام name= قابلية قراءة الاختبارات.

الأسئلة الشائعة

هل درس «الاختبارات المعلَّمة بالمعاملات باستخدام @CsvSource و@MethodSource» مجاني؟

نعم — نص درس «الاختبارات المعلَّمة بالمعاملات باستخدام @CsvSource و@MethodSource» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «الاختبارات المعلَّمة بالمعاملات باستخدام @CsvSource و@MethodSource»؟

شغّل الاختبار نفسه مع مجموعات إدخال متعددة باستخدام @ParameterizedTest و@CsvSource و@MethodSource تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «الاختبارات المعلَّمة بالمعاملات باستخدام @CsvSource و@MethodSource»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الاختبارات المعلَّمة بالمعاملات باستخدام @CsvSource و@MethodSource
  2. Mockito المتقدم: ملتقطات المعاملات والكائنات التجسسية
  3. شرائح اختبار Spring Boot: ‏@WebMvcTest و@DataJpaTest
  4. ‏Testcontainers: اختبارات تكامل مع قاعدة بيانات حقيقية
← العودة إلى Java Academy