Управляйте своим приложением из 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)
        }
    }
}

Дополнительные ресурсы

Для получения дополнительной информации о тестировании см. следующие ресурсы.

Документация

Просмотры контента

{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %}