כוונה לאספרסו

Espresso-Intents הוא תוסף של Espresso, שמאפשר אימות רעד של כוונות שנשלחו על ידי בבדיקה. למשל Mockito, אבל ל-Intents של Android.

אם האפליקציה שלכם מאצילת פונקציונליות לאפליקציות אחרות או לפלטפורמה, אפשר להשתמש כוונת אספרסו להתמקד בלוגיקה של האפליקציה שלכם, תוך הנחה שאפליקציות אחרות או שהפלטפורמה תפעל בצורה תקינה. עם Espresso-Intents, תוכלו להתאים ולאמת את הכוונות היוצאות שלכם או אפילו לספק תשובות "קצרות" במקום של כוונות אמיתיות.

הכללת כוונות אספרסו בפרויקט

בקובץ app/build.gradle של האפליקציה, צריך להוסיף את השורה הבאה בתוכו dependencies:

מגניב

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

Kotlin

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

המערכת של Espresso-Intents תואמת רק ל-Espresso 2.1 ואילך ולגרסה 0.3 ואילך של ספריות בדיקה של Android, לכן חשוב לעדכן גם את השורות האלה:

מגניב

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 ומקל על השימוש בו ממשקי API של 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 Matchers. הקרסט מאפשרת לכם:

  • שימוש בכלי קיים להתאמה של כוונות: האפשרות הקלה ביותר, שאמורה כמעט תמיד להיות עדיפה.
  • הטמעה של התאמת Intent משלכם: האפשרות הגמישה ביותר. פרטים נוספים זמינים זמינה בקטע "כתיבת התאמות מותאמות אישית" במסגרת המדריך לשימוש ב-Hamcrest.

חברת Espresso-Intents מציעה את intended() ו-intending() לאימות Intent, stubbing, בהתאמה. שניהם לוקחים אובייקט Matcher<Intent> של Hamcrest בתור ארגומנט.

קטע הקוד הבא מציג אימות של Intent שמשתמש ב-Intent קיימת התאמות שתואמות ל-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(), אתה יכול להצהיר שכבר זוהתה כוונה מסוימת. אבל, לפעמים אובייקטים מסוג 'אספרסו Intent' לא מצליבים את התגובות לכוונות אלא אם מגדירים אותם בצורה מפורשת. כדי לעשות את זה.

קטע הקוד הבא הוא דוגמה לבדיקה שמאמתת את הנתונים, אבל לא מחליפה אותם תגובות אליהם, כוונה יוצאת שמפעילה 'טלפון' חיצוני פעילות:

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(), ניתן תגובת stub של פעילויות שמופעלות באמצעות startActivityForResult(). האפשרות הזו שימושית במיוחד לפעילויות חיצוניות כי אי אפשר לשנות את ממשק המשתמש של פעילות חיצונית וגם לשלוט ב-ActivityResult שמוחזרים לפעילות הנבדקת.

קטעי הקוד הבאים מטמיעים דוגמה בדיקת activityResult_DisplaysContactsPhoneNumber(), שמאמתת כי כאשר משתמש מפעיל איש קשר הפעילות באפליקציה בבדיקה, הטלפון ליצירת קשר מוצג מספר:

  1. יצירת התוצאה שתוצג כאשר פעילות מסוימת מופעלת. בדיקה לדוגמה מיירטת את כל אובייקטי ה-Intent שנשלחים אל "אנשי הקשר" ומוציא את תשובות עם 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 לספק את אובייקט תוצאת ה-stub בתגובה לכל הפעלות של אנשי הקשר Intent:

    Kotlin

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

    Java

    intending(toPackage("com.android.contacts")).respondWith(result);
    
  3. מוודאים שהפעולה ששימשה להפעלת הפעילות מייצרת את תוצאת stub. במקרה כזה, הבדיקה לדוגמה מוודאת שמספר הטלפון המספר "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-Intent בבדיקות Android, אפשר לפנות אל במקורות המידע הבאים.

דוגמיות