Ç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.
Derin composable hedeflere gitme
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
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir.
- Makro karşılaştırma testi yazma
- Makro karşılaştırma testi metriklerini yakalama
- Mikro karşılaştırma testi