Espresso-Intents

Espresso-Intents افزونه‌ای برای Espresso است که امکان اعتبارسنجی و جایگزینی هدف‌های ارسال‌شده توسط برنامه تحت آزمایش را فراهم می‌کند. این چارچوب شبیه Mockito است، اما برای Android Intents طراحی شده است.

اگر برنامه‌تان عملکرد را به برنامه‌های دیگر یا پلاتفرم واگذار می‌کند، می‌توانید از Espresso-Intents استفاده کنید تا بر منطق برنامه خودتان تمرکز کنید و درعین‌حال فرض کنید که برنامه‌های دیگر یا پلاتفرم به‌درستی عمل خواهند کرد. با Espresso-Intents، می‌توانید هدف‌های برون‌رفت خود را مطابقت دهید و اعتبارسنجی کنید یا حتی به‌جای پاسخ‌های هدف واقعی، پاسخ‌های ساختگی ارائه دهید.

Espresso-Intents را در پروژه‌تان بگنجانید

در فایل app/build.gradle برنامه‌تان، خط زیر را در dependencies اضافه کنید:

شیک

androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'

کاتلین

androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')

Espresso-Intents فقط با Espresso نسخه ۲.۱ و بالاتر و نسخه ۰.۳ و بالاتر از کتابخانه‌های آزمایشی Android سازگار است، بنابراین مطمئن شوید که آن خطوط را نیز به‌روز کنید:

شیک

androidTestImplementation 'androidx.test:runner:1.6.1'
androidTestImplementation 'androidx.test:rules:1.6.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'

کاتلین

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 است:

کاتلین

@get:Rule
val intentsTestRule = IntentsTestRule(MyActivity::class.java)

جاوا

@Rule
public IntentsTestRule<MyActivity> intentsTestRule =
    new IntentsTestRule<>(MyActivity.class);

مطابق

Espresso-Intents امکان رهگیری کردن هدف‌های برون‌رفت را براساس معیارهای تطابق خاصی که بااستفاده از Hamcrest Matchers تعریف شده‌اند فراهم می‌کند. Hamcrest به شما امکان می‌دهد:

  • استفاده از تطبیق‌دهنده قصد موجود: ساده‌ترین گزینه که تقریباً همیشه باید ترجیح داده شود.
  • پیاده‌سازی تطبیق‌دهنده قصد خودتان: منعطف‌ترین گزینه. جزئیات بیشتر در بخش «نوشتن تطبیق‌دهنده‌های سفارشی» در آموزش Hamcrest دردسترس است.

Espresso-Intents روش‌های intended() و intending() را به‌ترتیب برای اعتبارسنجی و خرد کردن قصد ارائه می‌دهد. هر دو یک شیء Hamcrest Matcher<Intent> را به‌عنوان آرگومان می‌گیرند.

تکه‌کد زیر اعتبارسنجی قصدی را نشان می‌دهد که از تطبیق‌دهنده‌های قصد موجود استفاده می‌کند که با قصد خروجی‌ای که مرورگر را راه‌اندازی می‌کند مطابقت دارد:

کاتلین

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")

جاوا

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 پاسخ‌ها به قصدها را حذف نمی‌کند، مگر اینکه شما به‌صراحت پیکربندی کنید تا این کار را انجام دهد.

تکه‌کد زیر نمونه آزمایشی است که یک قصد برون‌رفت را که فعالیت «تلفن» خارجی را راه‌اندازی می‌کند، اعتبارسنجی می‌کند اما پاسخ‌های آن را شبیه‌سازی نمی‌کند:

کاتلین

@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"))
}

جاوا

@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 جایگزین می‌کند

    کاتلین

    val resultData = Intent()
    val phoneNumber = "123-345-6789"
    resultData.putExtra("phone", phoneNumber)
    val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)

    جاوا

    Intent resultData = new Intent();
    String phoneNumber = "123-345-6789";
    resultData.putExtra("phone", phoneNumber);
    ActivityResult result =
        new ActivityResult(Activity.RESULT_OK, resultData);
  2. به Espresso دستور دهید تا شیء نتیجه ساختگی را در پاسخ به همه فراخوانی‌های هدف «مخاطبین» ارائه دهد:

    کاتلین

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

    جاوا

    intending(toPackage("com.android.contacts")).respondWith(result);
  3. تأیید کنید که کنش استفاده‌شده برای راه‌اندازی فعالیت، نتیجه نمونه موردانتظار را تولید می‌کند. در این مورد، آزمایش نمونه بررسی می‌کند که شماره تلفن «۱۲۳-۳۴۵-۶۷۸۹» برگردانده شود و هنگام راه‌اندازی «فعالیت مخاطبین» نمایش داده شود:

    کاتلین

    onView(withId(R.id.pickButton)).perform(click())
    onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)))

    جاوا

    onView(withId(R.id.pickButton)).perform(click());
    onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)));

این آزمایش کامل activityResult_DisplaysContactsPhoneNumber() است:

کاتلین

@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)))
}

جاوا

@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: کاربری را شبیه‌سازی می‌کند که بااستفاده از دوربین، نقشه بیتی را واکشی می‌کند.