Tidak seperti kebanyakan pengujian UI Android, pengujian Macrobenchmark dijalankan dalam proses terpisah dari aplikasi itu sendiri. Hal ini diperlukan untuk memungkinkan tindakan seperti menghentikan proses aplikasi dan mengompilasi dari bytecode DEX ke kode mesin.
Anda dapat menjalankan status aplikasi menggunakan library UIAutomator atau mekanisme
lain yang dapat mengontrol aplikasi target dari proses pengujian.
Untuk mengekspos elemen Compose ke UI Automator, gunakan Modifier.testTag.
Contoh berikut menggunakan LazyColumn dengan testTag:
@Composable
fun ProductListScreen() {
LazyColumn(
modifier = Modifier
.fillMaxSize()
.testTag("my_lazy_column") ) {
items(100) { index ->
ProductItem(index)
}
}
}
Pengujian menggunakan testTag untuk menemukan LazyColumn dan melemparkannya:
@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)
}
}
}
}
Benchmark Anda tidak perlu men-scroll UI. Sebagai gantinya, benchmark dapat menjalankan animasi, misalnya. Benchmark juga tidak perlu menggunakan UI Automator secara khusus. Benchmark mengumpulkan metrik performa selama frame diproduksi.
Menavigasi ke tujuan composable dalam
Terkadang Anda mungkin ingin mengukur performa layar tertentu yang tidak langsung terlihat saat aplikasi dimulai, seperti layar detail atau halaman checkout yang berada jauh di dalam grafik Navigasi Jetpack.
Karena Macrobenchmark berjalan di luar proses, Anda tidak dapat berinteraksi langsung dengan
NavController untuk menukar layar. Sebagai gantinya, tolok ukur Anda harus menyimulasikan
pengguna yang membuka bagian aplikasi tersebut.
Gunakan setupBlock untuk menangani langkah-langkah persiapan, seperti mengklik alur aktivasi atau tombol menu. Dengan begitu, measureBlock Anda hanya akan merekam metrik performa layar target.
@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)
}
}
}
Referensi lainnya
Untuk mengetahui informasi selengkapnya tentang pengujian, lihat referensi berikut.
Dokumentasi
Melihat konten
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- Menulis Macrobenchmark
- Mengambil metrik Macrobenchmark
- Microbenchmark