مزامنة الاختبارات

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

في العادة، ليس عليك اتّخاذ أي إجراء. ومع ذلك، هناك بعض الحالات الهامشية التي يجب أن تعرفها.

عند مزامنة اختبار، يتقدم تطبيق Compose في الوقت المناسب باستخدام ساعة افتراضية. وهذا يعني أن اختبارات ميزة "الكتابة" لا يتم إجراؤها في الوقت الفعلي، وبالتالي يمكن أن تجتازها. بأسرع وقت ممكن.

ومع ذلك، إذا لم تستخدم الطرق التي تزامن اختباراتك، فلا إعادة التركيب وستظهر واجهة المستخدم متوقفة مؤقتًا.

@Test
fun counterTest() {
    val myCounter = mutableStateOf(0) // State that can cause recompositions.
    var lastSeenValue = 0 // Used to track recompositions.
    composeTestRule.setContent {
        Text(myCounter.value.toString())
        lastSeenValue = myCounter.value
    }
    myCounter.value = 1 // The state changes, but there is no recomposition.

    // Fails because nothing triggered a recomposition.
    assertTrue(lastSeenValue == 1)

    // Passes because the assertion triggers recomposition.
    composeTestRule.onNodeWithText("1").assertExists()
}

يُرجى العِلم أنّ هذا الشرط ينطبق فقط على التسلسلات الهرميّة لميزة "الإنشاء" وليس على باقي أجزاء التطبيق.

إيقاف المزامنة التلقائية

عند استدعاء تأكيد أو إجراء من خلال ComposeTestRule مثل assertExists()، تتم مزامنة الاختبار مع واجهة مستخدم Compose. في بعض الحالات قد ترغب في إيقاف هذه المزامنة والتحكم في الساعة بنفسك. على سبيل المثال، يمكنك التحكّم في الوقت لالتقاط لقطات شاشة دقيقة لصورة متحركة في نقطة لن تزال فيها واجهة المستخدم مشغولة. لإيقاف المزامنة التلقائية، ضبط السمة autoAdvance في mainClock على false:

composeTestRule.mainClock.autoAdvance = false

عادةً ما ستتقدم الوقت بنفسك. يمكنك تقدم خطوة واحدة إطار يتضمّن advanceTimeByFrame() أو بمدة معيّنة advanceTimeBy():

composeTestRule.mainClock.advanceTimeByFrame()
composeTestRule.mainClock.advanceTimeBy(milliseconds)

مراجع غير نشِطة لفترة قصيرة

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

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

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

composeTestRule.registerIdlingResource(idlingResource)
composeTestRule.unregisterIdlingResource(idlingResource)

المزامنة اليدوية

وفي بعض الحالات، يجب مزامنة واجهة مستخدم Compose مع أجزاء أخرى من الاختبار أو التطبيق الذي تختبره.

تنتظر الدالة waitForIdle() أن يكون Compose غير نشِط، ولكن الدالة تعتمد على السمة autoAdvance:

composeTestRule.mainClock.autoAdvance = true // Default
composeTestRule.waitForIdle() // Advances the clock until Compose is idle.

composeTestRule.mainClock.autoAdvance = false
composeTestRule.waitForIdle() // Only waits for idling resources to become idle.

يُرجى العلم أنّه في كلتا الحالتَين، ينتظر waitForIdle() أيضًا عمليات اجتياز رسومات وتنسيقات في انتظار المراجعة.

يمكنك أيضًا تقديم الوقت إلى أن يتم استيفاء شرط معيّن باستخدام رمز advanceTimeUntil().

composeTestRule.mainClock.advanceTimeUntil(timeoutMs) { condition }

يُرجى العلم أنّ الشرط المحدَّد يجب أن يتحقّق من الحالة التي يمكن أن تتأثّر بهذه الساعة (لا تعمل إلا مع حالة "إنشاء").

انتظار الشروط

أي شرط يعتمد على العمل الخارجي، مثل تحميل البيانات أو متطلبات بالقياس أو الرسم (أي القياس أو الرسم خارجيًا في Compose)، يجب استخدام مفهوم أكثر عمومية مثل waitUntil():

composeTestRule.waitUntil(timeoutMs) { condition }

يمكنك أيضًا استخدام أيّ من waitUntil المساعدين:

composeTestRule.waitUntilAtLeastOneExists(matcher, timeoutMs)

composeTestRule.waitUntilDoesNotExist(matcher, timeoutMs)

composeTestRule.waitUntilExactlyOneExists(matcher, timeoutMs)

composeTestRule.waitUntilNodeCount(matcher, count, timeoutMs)

مراجع إضافية

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