Uygulamanızı Macrobenchmark'tan kontrol edin

Çoğu Android kullanıcı arayüzü testinin aksine, makro karşılaştırma testleri uygulamanın kendisinden ayrı bir süreçte çalışır. Bu, uygulama sürecini durdurma ve DEX bayt kodundan makine diline derleme gibi işlemlerin etkinleştirilmesi için gereklidir.

UIAutomator kitaplığını veya hedef uygulamayı test sürecinden kontrol edebilen diğer mekanizmaları kullanarak uygulamanızın durumunu yönetebilirsiniz. Compose öğelerini UI Automator'a göstermek için Modifier.testTag kullanın.

Aşağıdaki örnekte testTag içeren bir LazyColumn kullanılmaktadır:

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

Test, testTag kullanarak LazyColumn bulur ve hızlı kaydırma yapar:

@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)
            }
        }
    }
}

Karşılaştırmanızın kullanıcı arayüzünde kaydırma yapması gerekmez. Bunun yerine, örneğin bir animasyon çalıştırabilir. Ayrıca, özellikle UI Automator'ı kullanması da gerekmez. Kareler üretildiği sürece performans metrikleri toplanır.

Bazen, uygulama başladığında hemen görünmeyen belirli bir ekranı (ör. Jetpack Navigation grafiğinizin derinliklerindeki bir ayrıntılar ekranı veya ödeme sayfası) karşılaştırmak isteyebilirsiniz.

Macrobenchmark, işlem dışında çalıştığından ekran değiştirmek için NavController ile doğrudan etkileşimde bulunamazsınız. Bunun yerine, karşılaştırmanız, uygulamanın o bölümüne giden bir kullanıcının davranışını simüle etmelidir.

setupBlock simgesini kullanarak hazırlık adımlarını (ör. bir oryantasyon akışında veya menü düğmesinde tıklama) gerçekleştirin. Bu sayede, measureBlock yalnızca hedef ekranın performans metriklerini yakalar.

@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)
        }
    }
}

Ek kaynaklar

Test hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

Belgeler

İçeriği görüntüleme