בדיקת הפעילויות באפליקציה

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

  • אפליקציה אחרת, כמו האפליקציה לטלפון של המכשיר, מפריעה לפעילות באפליקציה שלכם.
  • המערכת משמדת את הפעילות שלכם ויוצרת אותה מחדש.
  • המשתמש מכניס את הפעילות שלכם לסביבת חלון חדשה, כמו 'תמונה בתוך תמונה' (PIP) או 'ריבוי חלונות'.

בפרט, חשוב לוודא שהפעילות מתנהגת כראוי תגובה לאירועים המתוארים בפעילות במחזור החיים.

במדריך הזה מוסבר איך להעריך את היכולת של האפליקציה לשמור נתונים תקינות וחוויית משתמש טובה בזמן המעבר בין הפעילויות באפליקציה דרך מצבים שונים במחזור החיים שלהם.

שינוי מצב הפעילות

היבט מרכזי אחד בבדיקת הפעילויות של האפליקציה שלך הוא מיקום פעילויות שונות במדינות מסוימות. כדי להגדיר את ה"נתון" הזה חלק מהבדיקות, מופעים של ActivityScenario, חלק מ ספריית בדיקת AndroidX. בכיתה הזו תוכלו להציב את הפעילות שלך במצבים שמדמות אירועים ברמת המכשיר.

ActivityScenario הוא ממשק API לפלטפורמות שונות שאפשר להשתמש בו בבדיקות יחידות מקומיות ובדיקות השילוב במכשיר. במכשיר אמיתי או וירטואלי, ActivityScenario מספק הגנה על השרשורים ומסנכרן את האירועים בין את שרשור האינסטרומנטציה של הבדיקה וגם את ה-thread שמריץ את הפעילות שלך בבדיקה.

ה-API מתאים במיוחד להערכת האופן שבו פעילות מתנהגת כשהוא מושמד או נוצר. בקטע הזה אנחנו מציגים את תרחישים לדוגמה שמשויכים ל-API הזה.

יצירת פעילות

כדי ליצור את הפעילות לבדיקה, צריך להוסיף את הקוד שמוצג בקטע הקוד הבא:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
       launchActivity<MyActivity>().use {
       }
    }
}

אחרי יצירת הפעילות, ActivityScenario מעביר את הפעילות אל מצב RESUMED. מצב זה מציין שהפעילות שלך פועלת גלויים למשתמשים. במצב הזה, אין לך אפשרות לבצע פעולות רכיבי View באמצעות בדיקות ממשק המשתמש של Espresso.

Google ממליצה להתקשר למספר close בפעילות בזמן הבדיקה שהושלמו. הפעולה הזאת מנקה את המשאבים המשויכים ומשפרת את יציבות של הבדיקות. ActivityScenario מיישם את Closeable, כך שאפשר להחיל את התוסף use, או את try-with-resources בתכנות Java שפה, כך שהפעילות תיסגר באופן אוטומטי.

אפשר גם להשתמש באפליקציית ActivityScenarioRule כדי להתקשר אוטומטית ActivityScenario.launch לפני כל בדיקה ו-ActivityScenario.close בזמן פתיחת הבדיקה. הדוגמה הבאה מראה איך מגדירים כלל ומקבלים של תרחיש ממנו:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>()

    @Test fun testEvent() {
        val scenario = activityScenarioRule.scenario
    }
}

העברת הפעילות למצב חדש

כדי להעביר את הפעילות למצב אחר, כמו CREATED או STARTED, צריך להתקשר moveToState(). פעולה זו מדמה מצב שבו הפעילות שלך הופסק או מושהה, בהתאמה, כי הוא הופסק על ידי אפליקציה אחרת או פעולת המערכת.

שימוש לדוגמה ב-moveToState() מופיע בקטע הקוד הבא:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.moveToState(State.CREATED)
        }
    }
}

זיהוי מצב הפעילות הנוכחי

כדי לקבוע את המצב הנוכחי של פעילות בבדיקה, צריך לקבל את הערך של השדה state בתוך אובייקט ActivityScenario. זה מועיל במיוחד כדי לבדוק את המצב של פעילות בבדיקה, אם הפעילות מפנה פעילות אחרת או שהיא מסיימת את עצמה, כמו שאפשר לראות בקוד הבא snippet:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              startActivity(Intent(activity, MyOtherActivity::class.java))
            }

            val originalActivityState = scenario.state
        }
    }
}

שחזור הפעילות

כשאין מספיק משאבים במכשיר, המערכת עלולה להשמיד פעילות, דרישה מהאפליקציה ליצור מחדש את הפעילות הזו כשהמשתמש חוזר אליה. כדי לדמות את התנאים האלה, צריך לבצע קריאה אל recreate():

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.recreate()
        }
    }
}

המחלקה ActivityScenario שומרת על מצב המופע השמור של הפעילות, וגם כל אובייקט שנוסף באמצעות @NonConfigurationInstance. האובייקטים האלה נטענים למופע החדש של הפעילות בבדיקה.

אחזור תוצאות של פעילות

כדי לקבל את קוד התוצאה או את הנתונים שמשויכים לפעילות שהסתיימה, צריך להוריד את של השדה result באובייקט ActivityScenario, כפי שמוצג את קטע הקוד הבא:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testResult() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.finish_button)).perform(click())

            // Activity under test is now finished.

            val resultCode = scenario.result.resultCode
            val resultData = scenario.result.resultData
        }
    }
}

הפעלת פעולות בפעילות

כל השיטות ב-ActivityScenario חוסמות קריאות, לכן ה-API דורש כדי להריץ אותם בשרשור האינסטרומנטציה.

כדי להפעיל פעולות בפעילות שנבדקה, צריך להשתמש בהתאמות של Espresso לצפיות: לקיים אינטראקציה עם רכיבים בתצוגה

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.refresh)).perform(click())
        }
    }
}

אבל אם צריך להפעיל שיטה בפעילות עצמה, אפשר לעשות זאת באופן בטוח, באמצעות הטמעה של ActivityAction:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              activity.handleSwipeToRefresh()
            }
        }
    }
}