Yaygın kalıplar

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:

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.