В отличие от большинства тестов пользовательского интерфейса 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 %}Рекомендуем вам
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Создание макробенчмарка
- Сбор метрик Macrobenchmark
- Микробенчмарк