أغراض إسبريسو

وتُعد ملفات 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()، الذي يتأكد من أنه عند يبدأ المستخدم "جهة اتصال" النشاط داخل التطبيق قيد الاختبار، وهاتف جهة الاتصال الرقم:

  1. قم بإنشاء النتيجة التي يتم عرضها عند إطلاق نشاط معين. تشير رسالة الأشكال البيانية مثال: اختبار اعتراض جميع الأهداف المرسلة إلى "جهات الاتصال" ويستخرجها للردود ذات 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);
    
  2. توجيه Espresso لتقديم كائن النتيجة الموجزة ردًا على جميع استدعاءات "جهات الاتصال" الغرض:

    Kotlin

    intending(toPackage("com.android.contacts")).respondWith(result)
    

    Java

    intending(toPackage("com.android.contacts")).respondWith(result);
    
  3. التحقق من أن الإجراء المستخدم لبدء النشاط ينتج عنه نتيجة بديل. في هذه الحالة، يتحقق الاختبار النموذجي من أن رقم الهاتف يتم إرجاع "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: تحاكي محاكاة مستخدم يجلب صورة نقطية باستخدام الكاميرا.