Oluşturma uygulamanızı iyi bilinen yaklaşımlar ve kalıplarla test edebilirsiniz.
Tek başına test etme
ComposeTestRule
, herhangi bir bileşeni (uygulamanızın tamamı, tek bir ekran veya küçük bir öğe) görüntüleyen 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, test edilen içeriği composeTestRule.setContent
kullanarak ayarlamanız ve ayrıca etkinlik kaynaklarına erişmeniz (ör. görüntülenen bir metnin bir dize kaynağıyla eşleştiğini doğrulamak) gerekir. 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
ile 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ş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 işlem yeniden oluşturulduğunda, Compose öğ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
kullanımını doğrulamak yararlı olacaktı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()
: Sistemin koyu tema veya açık tema ayarını 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üzen 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ılmayı uygulamak için test edilen içeriği, parametre olarak uygulanacak geçersiz kılmayı ileterek DeviceConfigurationOverride()
üst düzey işlevine yapılan bir çağrıyla sarmalayın.
Ö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 cihaz üzerinde ç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 kullanabileceği çok sayıda cihaz olduğundan farklı ekran boyutlarını test etmeniz gerekir.
- Espresso: View tabanlı kullanıcı arayüzlerine yönelik olsa da Espresso bilgisi, Compose testinin bazı yönlerinde yararlı olabilir.