שליטה באפליקציה מ-Macrobenchmark

בניגוד לרוב בדיקות ממשק המשתמש ב-Android, בדיקות Macrobenchmark פועלות בתהליך נפרד מהאפליקציה עצמה. הפעולה הזו נדרשת כדי לאפשר דברים כמו עצירה של תהליך האפליקציה והידור מקוד בייט של DEX לשפת מכונה.

אפשר להגדיר את מצב האפליקציה באמצעות ספריית UIAutomator או מנגנונים אחרים שיכולים לשלוט באפליקציית היעד מתוך תהליך הבדיקה. כדי לחשוף רכיבי Compose ל-UI Automator, משתמשים ב-Modifier.testTag.

בדוגמה הבאה נעשה שימוש ב-LazyColumn עם testTag:

@Composable
fun ProductListScreen() {
    LazyColumn(
        modifier = Modifier
            .fillMaxSize()
            .testTag("my_lazy_column")    ) {
        items(100) { index ->
            ProductItem(index)
        }
    }
}

בבדיקה נעשה שימוש ב-testTag כדי למצוא את LazyColumn ולהעיף אותו:

@Test
fun scrollList() {
    benchmarkRule.measureRepeated(
        packageName = "com.example.myapp",
        metrics = listOf(FrameTimingMetric()),
        iterations = 5,
        setupBlock = {
            uiAutomator {
                pressHome()
                startApp("com.example.myapp")
            }
        }
    ) {
        uiAutomator {
            // Find the Composable using its testTag mapped as a viewIdResourceName
            val lazyColumn = onElement { viewIdResourceName == "my_lazy_column" }

            // Fling the Compose list down
            repeat(3) {
                lazyColumn.fling(Direction.DOWN)
            }
        }
    }
}

ההשוואה לשוק לא צריכה לגלול את ממשק המשתמש. במקום זאת, אפשר להפעיל אנימציה, למשל. בנוסף, לא צריך להשתמש ספציפית ב-UI Automator. הוא אוסף מדדי ביצועים כל עוד נוצרים פריימים.

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

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

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

@Test
fun deepScreenScrollList() {
    benchmarkRule.measureRepeated(
        packageName = "com.example.myapp",
        metrics = listOf(FrameTimingMetric()),
        iterations = 5,
        setupBlock = {
            uiAutomator {
                // 1. Start the app on the home screen
                startApp("com.example.myapp")

                // 2. Navigate to the internal screen by clicking a Compose component
                // (e.g., a card that opens the target list view)
                val settingsButton = onElement { viewIdResourceName == "go_to_list_button" }
                settingsButton.click()

                // 3. Wait until the target screen settles and is fully rendered
                waitForStableInActiveWindow()
            }
        }
    ) {
        uiAutomator {
            // The actual benchmark measurement starts here on the target screen
            val lazyColumn = onElement { viewIdResourceName == "my_lazy_column" }
            lazyColumn.fling(Direction.DOWN)
        }
    }
}

מקורות מידע נוספים

מידע נוסף על בדיקות זמין במקורות המידע הבאים.

מאמרי עזרה

צפיות בתוכן