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

Flutter / حدود التطبيق غير المتزامنة / الدرس 12

أدلة اختبارات الوحدات والعناصر والتكامل

اختر اختبارات تكشف عقود الملكية والتوقيت واحصر ادعاءاتها ضمن الحدود التي اختبرتها.

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

أهداف الدرس

  • طابق الاختبار مع موضع الشك
  • استخدم مدخلا وقيمة متوقعة صريحين
  • تحكم بالإطارات حول التفاعل

طابق الاختبار مع موضع الشك

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

استخدم مدخلا وقيمة متوقعة صريحين

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

dart مقتطف توضيحي من Dart أو Flutter؛ يتطلب بيئة SDK المبيّنة.
import 'package:test/test.dart';
int? parseSeats(String text) {
  final value = int.tryParse(text.trim());
  return value != null && value >= 0 ? value : null;
}
void main() {
  test('seat count preserves valid values and rejects negatives', () {
    expect(parseSeats(' 4 '), 4);
    expect(parseSeats('-1'), isNull);
  });
}
الناتج المتوقع
Expected: the declared test passes for both assertions.

تظهر قاعدة النطاق في النتائج المتوقعة. لا يتحقق الاختبار من نموذج أو لوحة مفاتيح أو قاعدة خادم.

تحكم بالإطارات حول التفاعل

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

أكّد العقد المرئي

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

dart مقتطف توضيحي من Dart أو Flutter؛ يتطلب بيئة SDK المبيّنة.
testWidgets('details are disclosed after activation', (tester) async {
  await tester.pumpWidget(const MaterialApp(home: Scaffold(body: DetailsPanel())));
  expect(find.text('Show'), findsOneWidget);
  expect(find.text('Local details'), findsNothing);
  await tester.tap(find.text('Show'));
  await tester.pump();
  expect(find.text('Hide'), findsOneWidget);
  expect(find.text('Local details'), findsOneWidget);
});
الناتج المتوقع
Expected: hidden details become visible after one activation and frame.

يتطلب flutter_test واستيرادات Material وتنفيذ DetailsPanel. لم يُنفذ اختبار عنصر في بيئة التأليف.

استخدم البدائل عند الحدود لا في كل موضع

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

اجعل الفشل قابلا للإعادة والتقارير دقيقة

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

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

يقرأ تأكيد العنصر الشجرة القديمة بعد النقر

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

لا تنتهي pumpAndSettle

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

يُبلغ عن اختبار إضافة مزيفة كاختبار جهاز

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

اختبر فهمك

1. ما أصغر اختبار مفيد لاكتمال بحث أقدم أخيرا؟

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

يثبت اختبار نموذج بردود مزيفة مؤجلة هوية الطلب دون عرض. أكمل الرد الأحدث أولا والأقدم أخيرا ثم أكّد بقاء البيانات الأحدث في النموذج. أضف اختبار عنصر لطريقة عرض الحالة أو إعلانها فقط.

2. هل تُقبل الصورة المرجعية المتغيرة دائما بعد تحديث اعتماد؟

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

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

أهم ما تعلمته

  • طابق الاختبار مع موضع الشك
  • اجعل الفشل قابلا للإعادة والتقارير دقيقة

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