اختبار أنشطة تطبيقاتك

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

  • هناك تطبيق آخر، مثل تطبيق الهاتف على الجهاز، يقاطع نشاط تطبيقك.
  • يتلف النظام نشاطك ويعيد إنشاؤه.
  • يضع المستخدم نشاطك في بيئة نافذة جديدة، مثل نافذة ضمن النافذة (PIP) أو نوافذ متعددة

وعلى وجه التحديد، من المهم التأكّد من أنّ نشاطك يتصرف بشكل صحيح في الرد على الأحداث الموضحة في نشاط دورة حياة المنتج.

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

ضبط حالة النشاط

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

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

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

إنشاء نشاط

لإنشاء النشاط قيد الاختبار، أضِف الرمز المعروض في المقتطف التالي:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
       launchActivity<MyActivity>().use {
       }
    }
}

بعد إنشاء النشاط، ينقل "ActivityScenario" النشاط إلى ولاية RESUMED. تشير هذه ��لحالة إلى أن نشاطك قيد التشغيل مرئية للمستخدمين. في هذه الحالة، يمكنك التفاعل مع بيانات نشاطك View باستخدام اختبارات واجهة مستخدم Espresso.

تنصح Google بالاتصال بـ "close" بشأن النشاط أثناء إجراء الاختبار. تكتمل. يقوم هذا بتنظيف الموارد المرتبطة وتحسين واستقرار اختباراتك. تنفِّذ ActivityScenario الدالة Closeable، لذا يمكنك تطبيق الإضافة use أو try-with-resources في برمجة Java بحيث يتم إغلاق النشاط تلقائيًا.

بدلاً من ذلك، يمكنك استخدام ActivityScenarioRule للاتصال تلقائيًا. ActivityScenario.launch قبل كل اختبار وActivityScenario.close عند الانتهاء التجريبي. يوضح المثال التالي كيفية تحديد قاعدة والحصول على مثال لسيناريو منه:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>()

    @Test fun testEvent() {
        val scenario = activityScenarioRule.scenario
    }
}

نقل النشاط إلى حالة جديدة

لتوجيه النشاط إلى حالة مختلفة، مثل CREATED أو STARTED، اتصل moveToState() يحاكي هذا الإجراء حالة يمارس فيها نشاطك متوقف أو متوقف مؤقتًا، على التوالي، لأن الإعلان يوقفه تطبيق آخر أو إجراء النظام.

يظهر مثال على استخدام moveToState() في مقتطف الرمز التالي:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.moveToState(State.CREATED)
        }
    }
}

تحديد حالة النشاط الحالية

لتحديد الحالة الراهنة لنشاط قيد الاختبار، احصل على قيمة الحقل state في كائن ActivityScenario. إنها مفيدة بشكل خاص للتحقق من حالة نشاط قيد الاختبار إذا كان النشاط يعيد التوجيه إلى نشاط آخر أو ينتهي نفسه، كما هو موضح في التعليمة البرمجية التالية snippet:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              startActivity(Intent(activity, MyOtherActivity::class.java))
            }

            val originalActivityState = scenario.state
        }
    }
}

إعادة إنشاء النشاط

فعندما توشك موارد الجهاز على النفاد، قد يؤدي النظام إلى تدمير أحد الأنشطة مطالبة تطبيقك بإعادة إنشاء هذا النشاط عندما يعود المستخدم إلى التطبيق لمحاكاة هذه الحالات، عليك طلب الرقم recreate():

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.recreate()
        }
    }
}

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

استرداد نتائج النشاط

للحصول على رمز النتيجة أو البيانات المرتبطة بنشاط نهائي، في الحقل result داخل كائن ActivityScenario، على النحو الموضّح في مقتطف الرمز التالي:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testResult() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.finish_button)).perform(click())

            // Activity under test is now finished.

            val resultCode = scenario.result.resultCode
            val resultData = scenario.result.resultData
        }
    }
}

تشغيل الإجراءات في النشاط

تحظر جميع الطرق ضمن ActivityScenario الطلبات، لذا تتطلّب واجهة برمجة التطبيقات. لتشغيلها في سلسلة الأدوات.

لتنفيذ إجراءات في نشاطك قيد الاختبار، استخدِم المطابقات المتعلّقة بطريقة عرض Espresso من أجل التفاعل مع العناصر في طريقة العرض الخاصة بك:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.refresh)).perform(click())
        }
    }
}

ومع ذلك، إذا كنت بحاجة إلى استدعاء طريقة في النشاط نفسه، فيمكنك القيام بذلك بأمان من خلال تنفيذ ActivityAction:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              activity.handleSwipeToRefresh()
            }
        }
    }
}