وتُعد ملفات Espresso-Intents امتدادًا لـ Espresso، وتتيح التحقّق من صحة الرموز لمس الأهداف المُرسَلة من قِبل اختبار تطبيقك. وهو مثل Mockito، ولكن لأهداف Android Intent.
إذا كان تطبيقك يفوّض وظائف لتطبيقات أخرى أو للنظام الأساسي، يمكنك استخدام تهدف ملفات Espresso-Intents إلى التركيز على منطق تطبيقك مع افتراض أنّ التطبيقات الأخرى وإلّا ستعمل المنصة بشكل صحيح. باستخدام Espresso-Intents، يمكنك مطابقة والتحقق من نواياك الصادرة أو حتى تقديم ردود بديلة بدلاً من والاستجابات الفعلية ذات النية بالشراء.
تضمين Espresso-Intents في مشروعك
في ملف app/build.gradle
لتطبيقك، أضِف السطر التالي داخله
dependencies
:
Groovy
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')
لا تتوافق ملفات Espresso-Intents إلا مع الإصدار 2.1 أو إصدار أحدث من Espresso والإصدار 0.3 أو الإصدارات الأحدث مكتبات اختبار Android، لذا احرص على تحديث هذه الأسطر أيضًا:
Groovy
androidTestImplementation 'androidx.test:runner:1.6.1' androidTestImplementation 'androidx.test:rules:1.6.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
Kotlin
androidTestImplementation('androidx.test:runner:1.6.1') androidTestImplementation('androidx.test:rules:1.6.1') androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')
كتابة قواعد الاختبار
قبل كتابة اختبار Espresso-Intents، عليك إعداد IntentsTestRule
. هذا هو
للفئة ActivityTestRule
ويسهل استخدامها
واجهات برمجة تطبيقات Espresso-Intents في اختبارات واجهة المستخدم الوظيفية يتم بدء IntentsTestRule
ملفات Espresso-Intents قبل كل اختبار مع إضافة تعليقات توضيحية له @Test
والإصدارات
ملفات Espresso-Intents بعد كل اختبار
مقتطف الرمز التالي هو مثال على IntentsTestRule
:
Kotlin
@get:Rule val intentsTestRule = IntentsTestRule(MyActivity::class.java)
Java
@Rule public IntentsTestRule<MyActivity> intentsTestRule = new IntentsTestRule<>(MyActivity.class);
المطابقة
توفر Espresso-Intents القدرة على اعتراض الأهداف الصادرة استنادًا إلى معايير مطابقة معينة، يتم تحديدها باستخدام مطابقة الهامكريست. هامكريست تتيح لك ما يلي:
- استخدام مطابقة حالية حسب النية بالشراء: الخيار الأسهل، والذي من المفترض أن يكون دائمًا تقريبًا .
- تنفيذ مطابقة الأهداف بنفسك: الخيار الأكثر مرونة. تتوفّر المزيد من التفاصيل متاح في القسم الذي يحمل عنوان "كتابة أسماء مطابقة مخصّصة" داخل نطاق البرنامج التعليمي Hamcrest.
تقدّم Espresso-Intents intended()
وintending()
للتحقق من النية
الدبلجة على التوالي. يأخذ كلاهما كائن Harcrest Matcher<Intent>
كـ
الوسيطة.
يعرض مقتطف الرمز التالي عملية تحقّق من صحة الهدف تستخدم هدفًا حاليًا. المطابقات التي تتطابق مع هدف صادر يبدأ تشغيل متصفّح:
Kotlin
assertThat(intent).hasAction(Intent.ACTION_VIEW) assertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE) assertThat(intent).hasData(Uri.parse("www.google.com")) assertThat(intent).extras().containsKey("key1") assertThat(intent).extras().string("key1").isEqualTo("value1") assertThat(intent).extras().containsKey("key2") assertThat(intent).extras().string("key2").isEqualTo("value2")
Java
assertThat(intent).hasAction(Intent.ACTION_VIEW); assertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE); assertThat(intent).hasData(Uri.parse("www.google.com")); assertThat(intent).extras().containsKey("key1"); assertThat(intent).extras().string("key1").isEqualTo("value1"); assertThat(intent).extras().containsKey("key2"); assertThat(intent).extras().string("key2").isEqualTo("value2");
التحقق من صحة الأهداف
تسجّل ملفات Espresso-Intents جميع الأهداف التي تحاول إطلاق الأنشطة من
اختبار تطبيقك. ويمكننا استخدام الطريقة intended()
التي تتشابه مع
Mockito.verify()
، يمكنك التأكيد على أنّه تم الاطّلاع على هدف معيّن. ومع ذلك،
لا تعمل ملفات Espresso-Intents على إيقاف الردود على الأهداف ما لم تضبطها بشكل صريح
القيام بذلك.
مقتطف الرمز التالي هو مثال على اختبار يتحقق من صحة المعلومات، لكنه لا ينجح. ردودًا على، هدف صادر يطلق عليه "هاتف" خارجي النشاط:
Kotlin
@Test fun validateIntentSentToPackage() { // User action that results in an external "phone" activity being launched. user.clickOnView(system.getView(R.id.callButton)) // Using a canned RecordedIntentMatcher to validate that an intent resolving // to the "phone" activity has been sent. intended(toPackage("com.android.phone")) }
Java
@Test public void validateIntentSentToPackage() { // User action that results in an external "phone" activity being launched. user.clickOnView(system.getView(R.id.callButton)); // Using a canned RecordedIntentMatcher to validate that an intent resolving // to the "phone" activity has been sent. intended(toPackage("com.android.phone")); }
الدبلجة
باستخدام الطريقة intending()
التي تتشابه مع طريقة Mockito.when()
، يمكنك
توفير استجابة بسيطة للأنشطة التي يتم إطلاقها مع
startActivityForResult()
هذا مفيد بشكل خاص للأنشطة الخارجية
لأنه لا يمكنك معالجة واجهة المستخدم لنشاط خارجي
للتحكم في ActivityResult
الذي تم إرجاعه إلى النشاط قيد الاختبار.
تنفذ مقتطفات الرمز التالية مثالاً
activityResult_DisplaysContactsPhoneNumber()
، الذي يتأكد من أنه عند
يبدأ المستخدم "جهة اتصال" النشاط داخل التطبيق قيد الاختبار، وهاتف جهة الاتصال
الرقم:
قم بإنشاء النتيجة التي يتم عرضها عند إطلاق نشاط معين. تشير رسالة الأشكال البيانية مثال: اختبار اعتراض جميع الأهداف المرسلة إلى "جهات الاتصال" ويستخرجها للردود ذات
ActivityResult
صالح، باستخدام رمز النتيجةRESULT_OK
Kotlin
val resultData = Intent() val phoneNumber = "123-345-6789" resultData.putExtra("phone", phoneNumber) val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)
Java
Intent resultData = new Intent(); String phoneNumber = "123-345-6789"; resultData.putExtra("phone", phoneNumber); ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultData);
توجيه Espresso لتقديم كائن النتيجة الموجزة ردًا على جميع استدعاءات "جهات الاتصال" الغرض:
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
Java
intending(toPackage("com.android.contacts")).respondWith(result);
التحقق من أن الإجراء المستخدم لبدء النشاط ينتج عنه نتيجة بديل. في هذه الحالة، يتحقق الاختبار النموذجي من أن رقم الهاتف يتم إرجاع "123-345-6789" يتم عرضه عندما يظهر "نشاط جهات الاتصال" :
Kotlin
onView(withId(R.id.pickButton)).perform(click()) onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)))
Java
onView(withId(R.id.pickButton)).perform(click()); onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)));
إليك اختبار activityResult_DisplaysContactsPhoneNumber()
الكامل:
Kotlin
@Test fun activityResult_DisplaysContactsPhoneNumber() { // Build the result to return when the activity is launched. val resultData = Intent() val phoneNumber = "123-345-6789" resultData.putExtra("phone", phoneNumber) val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData) // Set up result stubbing when an intent sent to "contacts" is seen. intending(toPackage("com.android.contacts")).respondWith(result) // User action that results in "contacts" activity being launched. // Launching activity expects phoneNumber to be returned and displayed. onView(withId(R.id.pickButton)).perform(click()) // Assert that the data we set up above is shown. onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber))) }
Java
@Test public void activityResult_DisplaysContactsPhoneNumber() { // Build the result to return when the activity is launched. Intent resultData = new Intent(); String phoneNumber = "123-345-6789"; resultData.putExtra("phone", phoneNumber); ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultData); // Set up result stubbing when an intent sent to "contacts" is seen. intending(toPackage("com.android.contacts")).respondWith(result); // User action that results in "contacts" activity being launched. // Launching activity expects phoneNumber to be returned and displayed. onView(withId(R.id.pickButton)).perform(click()); // Assert that the data we set up above is shown. onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber))); }
مصادر إضافية
لمزيد من المعلومات حول استخدام ملفات Espresso-Intents في اختبارات Android، يُرجى الرجوع إلى الموارد التالية.
نماذج
- IntentsBasicSample:
الاستخدام الأساسي لـ
intended()
وintending()
: - IntentsAdvancedSample: تحاكي محاكاة مستخدم يجلب صورة نقطية باستخدام الكاميرا.