בניגוד לרוב הבדיקות של ממשק המשתמש ב-Android, הבדיקות של Macrobenchmark פועלות בתהליך נפרד מהאפליקציה עצמה. הדבר נדרש כדי לאפשר דברים כמו הפסקת עיבוד של אפליקציה והידור מקוד בייט של DEX לקוד מכונה.
אפשר לשפר את מצב האפליקציה באמצעות ספריית UIAutomator או ממשק אחר
מנגנונים שיכולים לשלוט באפליקציית היעד מתוך תהליך הבדיקה.
אי אפשר להשתמש ב-Espresso או ב-ActivityScenario
כדי ליצור
מאקרובנצ'מרק, כי הן מצפה לפעול בתהליך משותף עם האפליקציה.
בדוגמה הבאה תמצאו מזהה של משאב RecyclerView
, וגם
גולל למטה כמה פעמים:
Kotlin
@Test fun scrollList() { benchmarkRule.measureRepeated( // ... setupBlock = { // Before starting to measure, navigate to the UI to be measured val intent = Intent("$packageName.RECYCLER_VIEW_ACTIVITY") startActivityAndWait(intent) } ) { val recycler = device.findObject(By.res(packageName, "recycler")) // Set gesture margin to avoid triggering gesture navigation // with input events from automation. recycler.setGestureMargin(device.displayWidth / 5) // Scroll down several times repeat(3) { recycler.fling(Direction.DOWN) } } }
Java
@Test public void scrollList() { benchmarkRule.measureRepeated( // ... /* setupBlock */ scope -> { // Before measuring, navigate to the UI to be measured. val intent = Intent("$packageName.RECYCLER_VIEW_ACTIVITY") scope.startActivityAndWait(); return Unit.INSTANCE; }, /* measureBlock */ scope -> { UiDevice device = scope.getDevice(); UiObject2 recycler = device.findObject(By.res(scope.getPackageName(), "recycler")); // Set gesture margin to avoid triggering gesture navigation // with input events from automation. recycler.setGestureMargin(device.getDisplayWidth() / 5); // Fling the recycler several times. for (int i = 0; i < 3; i++) { recycler.fling(Direction.DOWN); } return Unit.INSTANCE; } ); }
נקודת ההשוואה לא צריכה לגלול בממשק המשתמש. במקום זאת, היא יכולה להריץ אנימציה, למשל. הוא גם לא צריך להשתמש באוטומציה של ממשק המשתמש ספציפית. היא אוספת מדדי ביצועים כל עוד הפריימים שמערכת התצוגה יצרה, כולל פריימים שהופקו על ידי Jetpack Compose.
לנווט לחלקים פנימיים של האפליקציה
לפעמים רוצים ליצור נקודת השוואה לחלקים באפליקציה שלא קשורים באופן ישיר
מבחוץ. לדוגמה, גישה לפעילויות פנימיות
שמסומנים ב-exported=false
, עוברים אל Fragment
או מחליקים
חלק מממשק המשתמש שלכם. צריך לעבור לנקודות ההשוואה האלה באופן ידני
לחלקים של האפליקציה כמו משתמש.
כדי לנווט באופן ידני, צריך לשנות את הקוד בתוך setupBlock{}
כך שיכיל את
האפקט הרצוי, כמו הקשה על לחצן או החלקה. measureBlock{}
מכיל
רק את המניפולציה של ממשק המשתמש שרוצים שתשמש כנקודת השוואה בפועל:
Kotlin
@Test fun nonExportedActivityScrollList() { benchmarkRule.measureRepeated( // ... setupBlock = setupBenchmark() ) { // ... } } private fun setupBenchmark(): MacrobenchmarkScope.() -> Unit = { // Before starting to measure, navigate to the UI to be measured startActivityAndWait() // click a button to launch the target activity. // While we use button text here to find the button, you could also use // accessibility info or resourceId. val selector = By.text("RecyclerView") if (!device.wait(Until.hasObject(selector), 5_500)) { fail("Could not find resource in time") } val launchRecyclerActivity = device.findObject(selector) launchRecyclerActivity.click() // wait until the activity is shown device.wait( Until.hasObject(By.clazz("$packageName.NonExportedRecyclerActivity")), TimeUnit.SECONDS.toMillis(10) ) }
Java
@Test public void scrollList() { benchmarkRule.measureRepeated( // ... /* setupBlock */ scope -> { // Before measuring, navigate to the default activity. scope.startActivityAndWait(); // Click a button to launch the target activity. // While you use resourceId here to find the button, you can also // use accessibility info or button text content. UiObject2 launchRecyclerActivity = scope.getDevice().findObject( By.res(packageName, "launchRecyclerActivity") ) launchRecyclerActivity.click(); // Wait until activity is shown. scope.getDevice().wait( Until.hasObject(By.clazz("$packageName.NonExportedRecyclerActivity")), 10000L ) return Unit.INSTANCE; }, /* measureBlock */ scope -> { // ... } ); }
מומלץ עבורך
- הערה: טקסט הקישור מוצג כאשר JavaScript מושבת
- כתיבה של נקודת מאקרו בנצ'מרק
- תיעוד המדדים של Macrobenchmark
- מיקרובנצ'מרק