Espresso-Intents הוא תוסף של Espresso, שמאפשר אימות רעד של כוונות שנשלחו על ידי בבדיקה. למשל Mockito, אבל ל-Intents של Android.
אם האפליקציה שלכם מאצילת פונקציונליות לאפליקציות אחרות או לפלטפורמה, אפשר להשתמש כוונת אספרסו להתמקד בלוגיקה של האפליקציה שלכם, תוך הנחה שאפליקציות אחרות או שהפלטפורמה תפעל בצורה תקינה. עם 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 תואמת רק ל-Espresso 2.1 ואילך ולגרסה 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
ומקל על השימוש בו
ממשקי 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()
, שמאמתת כי כאשר
משתמש מפעיל איש קשר הפעילות באפליקציה בבדיקה, הטלפון ליצירת קשר
מוצג מספר:
יצירת התוצאה שתוצג כאשר פעילות מסוימת מופעלת. בדיקה לדוגמה מיירטת את כל אובייקטי ה-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);
מנחים את Espresso לספק את אובייקט תוצאת ה-stub בתגובה לכל הפעלות של אנשי הקשר Intent:
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
Java
intending(toPackage("com.android.contacts")).respondWith(result);
מוודאים שהפעולה ששימשה להפעלת הפעילות מייצרת את תוצאת 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, אפשר לפנות אל במקורות המידע הבאים.
דוגמיות
- IntentsBasicSample:
שימוש בסיסי ב-
intended()
וב-intending()
. - IntentsAdvancedSample: מדמה משתמש שמאחזר מפת סיביות באמצעות המצלמה.