Compose uygulamanızı, iyi bilinen yaklaşımlar ve kalıplarla test edebilirsiniz.
İzole ortamda test etme
ComposeTestRule
, tam uygulamanız, tek bir ekran veya küçük bir öğe gibi birleştirilebilir öğeler gösteren bir etkinlik başlatmanıza olanak tanır. Ayrıca, composable işlevlerinizin doğru şekilde kapsüllenmiş olduğunu ve bağımsız olarak çalıştığını kontrol etmek de iyi bir uygulamadır. Bu sayede, kullanıcı arayüzü testleri daha kolay ve odaklanarak yapılabilir.
Bu, yalnızca birim kullanıcı arayüzü testleri oluşturmanız gerektiği anlamına gelmez. Kullanıcı arayüzünüzün daha büyük bölümlerini kapsayan kullanıcı arayüzü testleri de çok önemlidir.
Kendi içeriğinizi ayarladıktan sonra etkinliğe ve kaynaklara erişme
Çoğu zaman, test edilen içeriği composeTestRule.setContent
kullanarak ayarlamanız ve etkinlik kaynaklarına erişmeniz gerekir. Örneğin, gösterilen metnin bir dize kaynağıyla eşleştiğini onaylamak için. Ancak, etkinlik zaten setContent
işlevini çağırıyorsa createAndroidComposeRule()
ile oluşturulan bir kuralda setContent
işlevini çağıramazsınız.
Bunu yapmanın yaygın bir yolu, ComponentActivity
gibi boş bir etkinlik kullanarak AndroidComposeTestRule
oluşturmaktır.
class MyComposeTest {
@get:Rule
val composeTestRule = createAndroidComposeRule<ComponentActivity>()
@Test
fun myTest() {
// Start the app
composeTestRule.setContent {
MyAppTheme {
MainScreen(uiState = exampleUiState, /*...*/)
}
}
val continueLabel = composeTestRule.activity.getString(R.string.next)
composeTestRule.onNodeWithText(continueLabel).performClick()
}
}
ComponentActivity
öğesinin uygulamanızın AndroidManifest.xml
dosyasına eklenmesi gerektiğini unutmayın. Bu bağımlılığı modülünüze ekleyerek etkinleştirin:
debugImplementation("androidx.compose.ui:ui-test-manifest:$compose_version")
Özel semantik özellikler
Bilgileri testlere sunmak için özel anlambilim özellikleri oluşturabilirsiniz.
Bunu yapmak için yeni bir SemanticsPropertyKey
tanımlayın ve SemanticsPropertyReceiver
kullanarak kullanılabilir hale getirin.
// Creates a semantics property of type Long.
val PickedDateKey = SemanticsPropertyKey<Long>("PickedDate")
var SemanticsPropertyReceiver.pickedDate by PickedDateKey
Şimdi bu özelliği semantics
değiştiricisinde kullanın:
val datePickerValue by remember { mutableStateOf(0L) }
MyCustomDatePicker(
modifier = Modifier.semantics { pickedDate = datePickerValue }
)
Testlerde, özelliğin değerini onaylamak için SemanticsMatcher.expectValue
simgesini kullanın:
composeTestRule
.onNode(SemanticsMatcher.expectValue(PickedDateKey, 1445378400)) // 2015-10-21
.assertExists()
Durum geri yüklemeyi doğrulama
Etkinlik veya işlem yeniden oluşturulduğunda Compose öğelerinizin durumunun doğru şekilde geri yüklendiğini doğrulayın. StateRestorationTester
sınıfıyla etkinlik yeniden oluşturmaya güvenmeden bu tür kontrolleri gerçekleştirin.
Bu sınıf, composable'ın yeniden oluşturulmasını simüle etmenize olanak tanır. Bu araç, özellikle rememberSaveable
uygulamasını doğrularken yararlıdır.
class MyStateRestorationTests {
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun onRecreation_stateIsRestored() {
val restorationTester = StateRestorationTester(composeTestRule)
restorationTester.setContent { MainScreen() }
// TODO: Run actions that modify the state
// Trigger a recreation
restorationTester.emulateSavedInstanceStateRestore()
// TODO: Verify that state has been correctly restored.
}
}
Farklı cihaz yapılandırmalarını test etme
Android uygulamalarının pencere boyutları, yerel ayarlar, yazı tipi boyutları, koyu ve açık temalar gibi birçok değişen koşula uyum sağlaması gerekir. Bu koşulların çoğu, kullanıcı tarafından kontrol edilen ve mevcut Configuration
örneğiyle gösterilen cihaz düzeyindeki değerlerden türetilir. Testin cihaz düzeyindeki özellikleri yapılandırması gerektiğinden, farklı yapılandırmaları doğrudan bir testte denemek zordur.
DeviceConfigurationOverride
, test edilen @Composable
içeriği için farklı cihaz yapılandırmalarını yerelleştirilmiş şekilde simüle etmenize olanak tanıyan yalnızca test amaçlı bir API'dir.
DeviceConfigurationOverride
öğesinin yardımcı nesnesi, cihaz düzeyindeki yapılandırma özelliklerini geçersiz kılan aşağıdaki uzantı işlevlerine sahiptir:
DeviceConfigurationOverride.DarkMode()
: Sistemi koyu tema veya açık tema olarak değiştirir.DeviceConfigurationOverride.FontScale()
: Sistem yazı tipi ölçeğini geçersiz kılar.DeviceConfigurationOverride.FontWeightAdjustment()
: Sistem yazı tipi ağırlığı ayarını geçersiz kılar.DeviceConfigurationOverride.ForcedSize()
: Cihaz boyutundan bağımsız olarak belirli bir alan miktarını zorunlu kılar.DeviceConfigurationOverride.LayoutDirection()
: layout direction (soldan sağa veya sağdan sola) özelliğini geçersiz kılar.DeviceConfigurationOverride.Locales()
: Yerel ayarı geçersiz kılar.DeviceConfigurationOverride.RoundScreen()
: Ekran yuvarlaksa geçersiz kılar.
Belirli bir geçersiz kılmayı uygulamak için test edilen içeriği DeviceConfigurationOverride()
üst düzey işlevine yapılan bir çağrıya sarın ve uygulanacak geçersiz kılmayı parametre olarak iletin.
Örneğin, aşağıdaki kod, yoğunluğu yerel olarak değiştirmek için DeviceConfigurationOverride.ForcedSize()
geçersiz kılmasını uygular ve testin üzerinde çalıştırıldığı cihaz bu pencere boyutunu doğrudan desteklemese bile MyScreen
composable'ın büyük bir yatay pencerede oluşturulmasını zorlar:
composeTestRule.setContent { DeviceConfigurationOverride( DeviceConfigurationOverride.ForcedSize(DpSize(1280.dp, 800.dp)) ) { MyScreen() // Will be rendered in the space for 1280dp by 800dp without clipping. } }
Birden fazla geçersiz kılmayı birlikte uygulamak için DeviceConfigurationOverride.then()
kullanın:
composeTestRule.setContent { DeviceConfigurationOverride( DeviceConfigurationOverride.FontScale(1.5f) then DeviceConfigurationOverride.FontWeightAdjustment(200) ) { Text(text = "text with increased scale and weight") } }
Ek Kaynaklar
- Android'de uygulamaları test etme: Android'deki ana test giriş sayfası, testlerle ilgili temel bilgiler ve teknikler hakkında daha geniş bir bakış açısı sunar.
- Testin temelleri: Android uygulamasını test etmenin temel kavramları hakkında daha fazla bilgi edinin.
- Yerel testler: Bazı testleri kendi iş istasyonunuzda yerel olarak çalıştırabilirsiniz.
- Araçlı testler: Araçlı testler de çalıştırmak iyi bir uygulamadır. Yani doğrudan cihazda çalışan testler.
- Sürekli entegrasyon: Sürekli entegrasyon, testlerinizi dağıtım ardışık düzeninize entegre etmenize olanak tanır.
- Farklı ekran boyutlarını test edin: Kullanıcıların erişebileceği çok sayıda cihaz olduğundan farklı ekran boyutlarını test etmeniz gerekir.
- Espresso: Görüntüleme tabanlı kullanıcı arayüzleri için tasarlanmış olsa da Espresso bilgisi, Compose testinin bazı yönlerinde faydalı olabilir.