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

تطوير Android / المتوسط: الحالة والبيانات والميزات الشاملة / الدرس 11

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

ابنِ الثقة باختبارات مركزة واعزل الإخفاقات بأدلة قابلة للتكرار بدلاً من تخمين التوقيت.

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

أهداف الدرس

  • اختر الاختبارات المحلية والتكاملية واختبارات الواجهة بحسب الخطر المفحوص.
  • استخدم اختبارات coroutines حتمية وتحققات واجهة ذات معنى.

اختبر عند أصغر حد مفيد

تعمل دالة تحقق خالصة في اختبار JVM محلي دون Android. تحتاج DAO بيئة تكامل قاعدة مناسبة، ويحتاج سلوك الأذونات ودورة الحياة اختباراً يراعي Android. يفحص اختبار الواجهة السلوك المرئي للمستخدم عبر الدلالات. تجيب الاختبارات عن أسئلة مختلفة؛ فلا يثبت نجاح محول صحة manifest، ولا تثبت لقطة أن المستودع يحفظ السجلات بعد فشل التحديث. اختر عدداً صغيراً من الرحلات الشاملة الممثلة وفحوصاً مركزة كثيرة حيث يمكن عزل قواعد الأعمال بثبات.

تحقق من سلوك بمثال ملموس

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

kotlin اختبارات محلية لمحلل Kotlin الخالص السابق
class ReadingValidationTest {
    @Test fun negativePagesAreRejected() {
        val result = parseItem("book-1", "Kotlin", "-1")
        assertNull(result)
    }

    @Test fun zeroPagesAndTrimmedTitleAreAccepted() {
        val result = parseItem("book-1", "  Kotlin  ", "0")
        assertEquals(ReadingItem("book-1", "Kotlin", 0), result)
    }
}

ضعه تحت src/test مع اعتماد JUnit المضبوط واستيرادات Test والتحقق. ضمّن ReadingItem وparseItem من درس نمذجة Kotlin. تختبر التحققات سياسة التحقق لا سلوك Android.

تحكم في الزمن غير المتزامن

ينبغي لاختبارات coroutines حقن موزعات اختبار تشترك في مجدول وتنفيذ العمل عبر runTest. تقديم الوقت الافتراضي أثبت من النوم وانتظار وصول دالة رد. يحتاج ViewModel الذي يستخدم Main موزع Main للاختبار يُثبت ويُعاد وفق قاعدة الاختبار المدعومة بالمشروع. اختبر الإلغاء وانعكاس ترتيب الانتهاء صراحة. ينبغي للاعتماد الوهمي كشف السيناريو المطلوب لا إعادة تنفيذ الخدمة مصغرة. أبقِ اختبار تكامل حقيقياً لافتراضات بروتوكول أو قاعدة مهمة لا يتحقق منها الوهمي.

اختبر عقد المستخدم عبر الدلالات

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

kotlin اختبار Compose للأحداث داخل بيئة Android
class TitleFieldTest {
    @get:Rule val compose = createComposeRule()

    @Test fun editingReportsProposedTitle() {
        var reported = ""
        compose.setContent {
            TitleField(title = "", onTitleChange = { reported = it })
        }
        compose.onNode(hasSetTextAction()).performTextInput("Kotlin")
        compose.runOnIdle { assertEquals("Kotlin", reported) }
    }
}

استخدم اعتماديات اختبار Compose UI وAndroid المتوافقة تحت src/androidTest مع استيرادات JUnit واختبار Compose. يحتوي المحتوى حقلاً نصياً واحداً. هذا اختبار حدث؛ وينبغي لاختبار محرر يملك حالة أن يتحقق أيضاً من النص المعروض.

اجمع الأدلة قبل تعديل الشيفرة

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

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

لا ينجح اختبار إلا بنوم طويل

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

يفوت اختبار وهمي استعلاماً معطلاً

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

ينقر اختبار الواجهة العنصر الخطأ بعد تغيير الحجم

لماذا يحدث؟
يعتمد على إحداثيات شاشة ثابتة.
كيف تصلحه؟
حدّد العناصر بدلالات ثابتة.
كيف تتجنب تكراره؟
اختبر أحجاماً متعددة وافحص معنى الوصول.

اختبر فهمك

1. ينجح اختبار محول لكن التطبيق يتعطل بعد الترقية فقط. أي اختبار يعالج الحد المفقود؟

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

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

2. يقول تقرير إن الحفظ يعرض عنواناً قديماً أحياناً. حدد أدلة تميز ترتيب الشبكة القديم من مشكلة مراقبة الواجهة.

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

سجل معرّفات عمليات محجوبة الحساسية وإصدارات الحالة عند بدء الطلب وتثبيت المستودع ونشر ViewModel ومراقبة الواجهة. أعد الحالة بترتيب انتهاء معكوس عبر وهمي. إذا صحت الحالة الدائمة ولم ترَ الواجهة إصدارها فافحص التعديل والجمع؛ وإلا افحص الترتيب وسياسة التعارض.

أهم ما تعلمته

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

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