Oluşturma uygulamanızı iyi bilinen yaklaşımlar ve kalıplarla test edebilirsiniz.
Testi yalıtılmış olarak yapma
ComposeTestRule
, herhangi bir bileşeni (uygulamanızın tamamı, tek bir ekran veya küçük bir öğe) gösteren bir etkinlik başlatmanıza olanak tanır. Ayrıca, bileşenlerinizin doğru şekilde kapsüllenip bağımsız olarak çalışıp çalışmadığını kontrol etmek de iyi bir uygulamadır. Bu, daha kolay ve daha odaklanmış kullanıcı arayüzü testlerine olanak tanır.
Bu, yalnızca birim kullanıcı arayüzü testleri oluşturmanız gerektiği anlamına gelmez. Kullanıcı arayüzünü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, composeTestRule.setContent
kullanarak test edilen içeriği ayarlamanız ve ayrıca etkinlik kaynaklarına erişmeniz gerekir (ör. görüntülenen metnin bir dize kaynağıyla eşleştiğini doğrulamak için). Ancak etkinlikte zaten çağrılıyorsa createAndroidComposeRule()
ile oluşturulan bir kuralda setContent
'ü çağıramazsınız.
Bunu başarmanı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
dosyasının uygulamanızın AndroidManifest.xml
dosyasına eklenmesi gerektiğini unutmayın. Bu bağımlılık modülünüze ekleyerek bu özelliği etkinleştirin:
debugImplementation("androidx.compose.ui:ui-test-manifest:$compose_version")
Özel anlam özellikleri
Bilgileri testlere sunmak için özel söz dizimi özellikleri oluşturabilirsiniz.
Bunu yapmak için yeni bir SemanticsPropertyKey
tanımlayın ve SemanticsPropertyReceiver
kullanarak kullanıma sunun.
// Creates a semantics property of type Long.
val PickedDateKey = SemanticsPropertyKey<Long>("PickedDate")
var SemanticsPropertyReceiver.pickedDate by PickedDateKey
Şimdi bu özelliği semantics
değiştiricide kullanın:
val datePickerValue by remember { mutableStateOf(0L) }
MyCustomDatePicker(
modifier = Modifier.semantics { pickedDate = datePickerValue }
)
Testlerde, mülkün değerini doğrulamak için SemanticsMatcher.expectValue
kullanın:
composeTestRule
.onNode(SemanticsMatcher.expectValue(PickedDateKey, 1445378400)) // 2015-10-21
.assertExists()
Durum geri yüklemesini doğrulama
Etkinlik veya süreç yeniden oluşturulduğunda Oluştur öğelerinizin durumunun doğru şekilde geri yüklendiğini doğrulayın. Bu tür kontrolleri, StateRestorationTester
sınıfıyla etkinlik yeniden oluşturmaya gerek kalmadan gerçekleştirin.
Bu sınıf, bir bileşenin yeniden oluşturulmasını simüle etmenize olanak tanır. Özellikle rememberSaveable
'un uygulanmasını doğrulamak için 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 cihaz düzeyindeki değerlerden türetilir ve mevcut Configuration
örneğiyle birlikte gösterilir. Testin cihaz düzeyindeki özellikleri yapılandırması gerektiğinden, farklı yapılandırmaları doğrudan bir testte test etmek zordur.
DeviceConfigurationOverride
, test edilen @Composable
içerik için farklı cihaz yapılandırmalarını yerelleştirilmiş bir şekilde simüle etmenize olanak tanıyan yalnızca test amaçlı bir API'dir.
DeviceConfigurationOverride
'ün tamamlayıcı 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 geçersiz kılar.DeviceConfigurationOverride.FontScale()
: Sistem yazı tipi ölçeğini geçersiz kılar.DeviceConfigurationOverride.FontWeightAdjustment()
: Sistem yazı tipi kalınlığı ayarını geçersiz kılar.DeviceConfigurationOverride.ForcedSize()
: Cihaz boyutundan bağımsız olarak belirli bir alan miktarını zorlar.DeviceConfigurationOverride.LayoutDirection()
: Düzenleme yönünü (soldan sağa veya sağdan sola) geçersiz kılar.DeviceConfigurationOverride.Locales()
: Yerel ayar'ı geçersiz kılar.DeviceConfigurationOverride.RoundScreen()
: Ekranın yuvarlak olup olmadığını geçersiz kılar.
Belirli bir geçersiz kılma işlemini uygulamak için test edilen içeriği DeviceConfigurationOverride()
üst düzey işlevine yapılan bir çağrı içine alın ve uygulanacak geçersiz kılma işlemini parametre olarak iletin.
Örneğin, aşağıdaki kod, yoğunluğu yerel olarak değiştirmek için DeviceConfigurationOverride.ForcedSize()
geçersiz kılma işlevini uygular. Böylece, testin çalıştırıldığı cihaz bu pencere boyutunu doğrudan desteklemese bile MyScreen
bileşeninin büyük bir yatay pencerede oluşturulmasını zorunlu kılar:
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ılma işlemini birlikte uygulamak için DeviceConfigurationOverride.then()
simgesini 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: Ana Android test açılış sayfası, testin temelleri ve teknikleri 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çla testler: Araçla testler de çalıştırmak iyi bir uygulamadır. Yani doğrudan cihazda çalıştırılan 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 kullanabileceği çok sayıda cihaz olduğundan farklı ekran boyutlarını test etmeniz gerekir.
- Espresso: Görüntü tabanlı kullanıcı arayüzleri için tasarlanmış olsa da Espresso bilgisi, Oluşturma testinin bazı yönleri için yine de yararlı olabilir.