Mengontrol aplikasi dari Macrobenchmark

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.

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