اسپرسو-نیت

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

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

Espresso-Intent را در پروژه خود بگنجانید

در فایل 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 2.1+ و نسخه 0.3+ کتابخانه‌های تست اندروید سازگار است، بنابراین مطمئن شوید که آن خطوط را نیز به‌روزرسانی کنید:

شیار

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-Intent، یک IntentsTestRule را تنظیم کنید. این یک توسعه از کلاس ActivityTestRule است و استفاده از APIهای Espresso-Intents را در تست‌های UI کاربردی آسان می‌کند. یک IntentsTestRule قبل از هر تست مشروح شده با @Test ، Espresso-Intent ها را مقداردهی می کند و پس از هر آزمایش، Espresso-Intent منتشر می کند.

قطعه کد زیر نمونه ای از IntentsTestRule است:

کاتلین

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

جاوا

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

مطابقت دادن

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

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

Espresso-Intent به ترتیب روش‌های intended() و intending() را برای اعتبارسنجی intent و stubbing ارائه می‌کند. هر دو یک شی 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() است، می توانید ادعا کنید که یک intent دیده شده است. با این حال، Espresso-Intent پاسخ‌ها را به intent ها نشان نمی‌دهد، مگر اینکه به صراحت آن را برای انجام این کار پیکربندی کنید.

قطعه کد زیر نمونه آزمایشی است که یک هدف خروجی را که یک فعالیت "تلفن" خارجی را راه اندازی می کند، تأیید می کند، اما پاسخ ها را قطع نمی کند:

کاتلین

@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. نتیجه را بسازید تا زمانی که یک فعالیت خاص راه اندازی می شود، بازگردد. آزمایش مثالی تمام Intent های ارسال شده به "مخاطبین" را قطع می کند و با استفاده از کد نتیجه RESULT_OK پاسخ های آنها را با ActivityResult معتبر حذف می کند.

    کاتلین

    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. به اسپرسو دستور دهید که شیء نتیجه خرد را در پاسخ به همه فراخوانی‌های هدف «مخاطبین» ارائه کند:

    کاتلین

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

    جاوا

    intending(toPackage("com.android.contacts")).respondWith(result);
    
  3. بررسی کنید که عملکردی که برای راه‌اندازی فعالیت استفاده می‌شود، نتیجه خرد مورد انتظار را ایجاد می‌کند. در این مورد، آزمایش نمونه بررسی می کند که شماره تلفن "123-345-6789" برگردانده شده و با راه اندازی "فعالیت مخاطبین" نمایش داده شود:

    کاتلین

    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-Intent در تست های اندروید، به منابع زیر مراجعه کنید.

نمونه ها

  • IntentsBasicSample : استفاده اساسی از intended() و intending() .
  • IntentsAdvancedSample : شبیه سازی کاربر در حال واکشی یک بیت مپ با استفاده از دوربین.