Yaygın kalıplar

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:

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.