محتويات الدورة

Java / المتوسط / الدرس 11

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

اختبر السلوك المرئي بحالات مفيدة وتأكيد الفشل وضبط الوقت بدلاً من فحوص تكرر التنفيذ أو تخمن الأزمنة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تصميم الحالات من فئات التكافؤ والحدود.
  • كتابة مشغل اختبار مستقل يفشل بموثوقية.
  • ضبط الوقت والاعتماديات الخارجية.

اختر التأكيدات من السلوك الموعود

يقارن الاختبار السلوك المرصود بتوقع مشتق من المتطلب. ينبغي أن يفشل عند كسر وعد مهم لا أن يكرر حساب التنفيذ. تفيد لدالة الحصر قيمة تحت الحد وداخله وفوقه. سمّ الحالة ليشرح الفشل العقد المكسور لا رقمين منفصلين فقط.

يعزل اختبار الوحدة سلوكاً صغيراً ويتحقق التكامل من حدود كالترميز والتغليف، ويمر الشامل بمسار أوسع. اختر أضيق مستوى يكشف الخطر واحتفظ بمسارات تكامل مهمة. لا تعوض كثرة الاختبارات غياب الحد المعني ولا يثبت النجاح ما لم تحدده المتطلبات.

اجعل المشغل يفشل دون الاعتماد على -ea

تعطل عبارة assert افتراضياً فلا تصلح وحدها للتحقق من إدخال خارجي. يستطيع مشغل تعليمي إطلاق AssertionError صراحة فيعمل مستقلاً عن إعداد المشغل. يفحص المثال ثلاث حالات حصر ولا يطبع النجاح إلا بعد كلها. يوقف التأكيد الفاشل المسار الطبيعي بنتيجة عملية غير صفرية.

تضيف أطر الاختبار تقارير وتهيئة وحالات ممعلمة ودمجاً، لكن الجوهر مقارنة المتوقع بالمرصود. لا تبتلع AssertionError أو تلتقط Throwable حول المجموعة وتطبع النجاح. اجعل التهيئة حتمية وتأكد أن كل اختبار يفشل للعيب المقصود.

java ثلاث حالات مشتقة من السلوك
public class Main {
static int clamp(int x,int low,int high) {
 if(low>high) throw new IllegalArgumentException("range");
 return Math.max(low,Math.min(x,high));
}
static void check(boolean ok,String label) { if(!ok) throw new AssertionError(label); }
 public static void main(String[] args) throws Exception {
check(clamp(-2,0,10)==0,"below");
check(clamp(5,0,10)==5,"inside");
check(clamp(12,0,10)==10,"above");
System.out.println("3 cases passed");
 }
}
الناتج المتوقع
3 cases passed

تبقى التأكيدات الصريحة فعالة دون -ea وتستهدف مناطق مختلفة من العقد.

أكد الفشل المقصود بدقة

يجب أن يفشل اختبار الفشل المتوقع عند غياب الاستثناء وأن يميزه من عطل غير مرتبط. ضع العملية الدقيقة داخل حد التوقع لا التهيئة كلها، وإلا نجح الاختبار بسبب مورد مكسور دون فحص الموضوع. افحص خصائص مهمة دون ربط بأرقام أسطر عرضية.

احقن فشلاً بعد اكتساب المورد وافحص إغلاقه. وللتعديل افحص الحالة المرئية بعد الرفض لمنع البقايا الجزئية. تجنب فحص أسماء الحقول الخاصة وتكرار فروع التنفيذ آلياً؛ استهدف الثوابت والعقود والحدود المعرضة للتراجع مع إعادة هيكلة مشروعة.

اضبط الوقت عبر اعتماد

يمكن اختبار دالة تستقبل Clock عند لحظة دقيقة دون نوم أو تغيير الساعة العامة. يثبت المثال UTC ويفحص موعداً وصل للتو، ويعد التساوي انتهاء. تشرح حالات قبل الحد وعنده وبعده قاعدة المساواة.

تجنب Thread.sleep للمزامنة أو انتظار وقت العمل في الوحدة؛ تجعل الجدولة والحمل الاختبار هشاً وبطيئاً. احقن العشوائية أو مولداً ببذرة عند الحاجة، مع أن البذرة حالة واحدة لا دليلاً شاملاً. أبعد الشبكة وملفات الإنتاج من الاختبار المعزول.

java اختبار موعد بساعة ثابتة
public class Main {
static boolean expired(java.time.Instant deadline,java.time.Clock clock) {
 return !java.time.Instant.now(clock).isBefore(deadline);
}
 public static void main(String[] args) throws Exception {
var now=java.time.Instant.parse("2026-01-01T00:00:00Z");
var clock=java.time.Clock.fixed(now,java.time.ZoneOffset.UTC);
System.out.println(expired(now,clock));
 }
}
الناتج المتوقع
true

تعد المقارنة التساوي انتهاء وتجعل الساعة النتيجة مستقلة عن تاريخ التنفيذ.

فسّر التغطية وأدلة التنفيذ بصدق

تدل التغطية على مواقع منفذة لا صحة التأكيد أو اكتمال المتطلبات. قد ينفذ اختبار فرعاً ويتجاهل الناتج فيزيد التغطية دون حماية. راجع هل يسبب تعديل خاطئ فشلاً. استخدم خصائص عامة عند الفائدة كحفظ أعداد العناصر وترتيب ناتج الفرز.

سجل هدف المترجم والتشغيل والأمر والنتيجة الفعلية. تتحقق الدورة من البرامج الكاملة في مجلدات مؤقتة وتقارن الخرج؛ وتبقى المقاطع المكسورة غير قابلة للتشغيل. اجعل الاختبار دليلاً مقروءاً لمن يصون بعدك، ووسعه لخطر جديد لا لزيادة عدد متكرر.

الأخطاء الشائعة وإصلاحها

A test passes with assertions disabled

لماذا يحدث؟
اعتمد المشغل assert دون -ea.
كيف تصلحه؟
استخدم إطاراً أو فحوص فشل صريحة ووثق التشغيل.
كيف تتجنب تكراره؟
أكد أن نتيجة خاطئة عمداً تفشل الاختبار.

A time test fails only on some machines

لماذا يحدث؟
اعتمد ساعة فعلية أو نوماً لا اعتماداً مضبوطاً.
كيف تصلحه؟
احقن Clock أو مزامنة مناسبة.
كيف تتجنب تكراره؟
اختبر حدود الوقت بحتمية.

Expected-exception test passed for the wrong reason

لماذا يحدث؟
شمل التوقع تهيئة أو نوع خطأ واسعاً.
كيف تصلحه؟
ضيّق العملية والنوع المتوقع.
كيف تتجنب تكراره؟
راجع بحالة مورد مكسور.

اختبر فهمك

1. قاعدة الانتهاء now >= deadline. ما الحالات الثلاث؟

اعرض الحل المشروح

قبل الحد مباشرة خطأ، وعنده وبعده صحيح. استخدم Clock.fixed بدقة موثقة ولا تنم لعبور الموعد.

2. ترفض دالة مبلغاً سالباً دون تغيير الرصيد. ماذا تفحص؟

اعرض الحل المشروح

أكد الرفض المقصود ثم ثبات الرصيد. الاستثناء وحده يفوت تعديلاً جزئياً، والرصيد وحده يفوت رفضاً صامتاً أو سياسة خطأ غير صحيحة.

أهم ما تعلمته

  • تحمي التأكيدات المتطلبات لا البنية الخاصة.
  • تحتاج حدود الوقت والفشل حالات حتمية.
  • للتغطية والنجاح معنى محدود واضح.

المراجع الرسمية