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