Testlerinizi senkronize edin

Oluşturma testleri, varsayılan olarak kullanıcı arayüzünüzle senkronize edilir. Bir ComposeTestRule ile bir işlem gerçekleştirirseniz test senkronize edilir kullanıcı arayüzü ağacı boşta olana kadar bekler.

Normalde herhangi bir işlem yapmanız gerekmez. Bununla birlikte, bilmeniz gereken bazı özel durumlar vardır.

Bir test senkronize edildiğinde, Compose uygulamanız sanal saattir. Bu durum, Compose testlerinin gerçek zamanlı olarak çalışmadığı ve söz konusu testlerin sınavı geçebileceği anlamına gelir. hızlı teslim etmek üzerine.

Ancak testlerinizi senkronize eden yöntemleri kullanmazsanız yeniden oluşturma işlemi gerçekleşmez ve kullanıcı arayüzü duraklatılmış gibi görünür.

@Test
fun counterTest() {
    val myCounter = mutableStateOf(0) // State that can cause recompositions.
    var lastSeenValue = 0 // Used to track recompositions.
    composeTestRule.setContent {
        Text(myCounter.value.toString())
        lastSeenValue = myCounter.value
    }
    myCounter.value = 1 // The state changes, but there is no recomposition.

    // Fails because nothing triggered a recomposition.
    assertTrue(lastSeenValue == 1)

    // Passes because the assertion triggers recomposition.
    composeTestRule.onNodeWithText("1").assertExists()
}

Bu gereksinimin yalnızca Compose hiyerarşileri için geçerli olduğunu, kullanın.

Otomatik senkronizasyonu devre dışı bırakma

ComposeTestRule aracılığıyla şunun gibi bir onay veya işlem çağırdığınızda: assertExists(), testiniz Compose kullanıcı arayüzüyle senkronize edildi. Bazı durumlarda bu senkronizasyonu durdurmak ve saati kendiniz kontrol etmek isteyebilirsiniz. Örneğin, Örneğin, animasyonun doğru ekran görüntülerini almak için zamanı kontrol edebilirsiniz. bir nokta koyabiliriz. Otomatik senkronizasyonu devre dışı bırakmak için mainClock içindeki autoAdvance özelliğini false olarak ayarlayın:

composeTestRule.mainClock.autoAdvance = false

Genellikle zamanı kendiniz ileri alırsınız. Tam olarak bir tane ilerleyebilirsiniz belirli bir süreye göre veya advanceTimeByFrame() ile advanceTimeBy():

composeTestRule.mainClock.advanceTimeByFrame()
composeTestRule.mainClock.advanceTimeBy(milliseconds)

Boşta kaynaklar

Compose, testleri ve kullanıcı arayüzünü senkronize edebilir. Böylece, her eylem ve onay boşta kaldığında, gerektiği şekilde bekleyerek veya ilerleterek yapılır. Ancak sonuçları kullanıcı arayüzü durumunu etkileyen bazı asenkron işlemler, testin farkında olmadan arka planda çalışabilir.

Test edilen uygulamanın meşgul veya boşta olup olmadığına karar verilirken bu boş kaynakları testinize ekleyip kaydedin. Hayır veya deneme sürümü için ek boşta kalma kaynakları kaydetmeniz gerekmiyorsa Örneğin, Espresso veya Espresso ile senkronize edilmeyen bir arka plan işi Oluştur'u tıklayın.

Bu API, test edilen öznenin boşta mı yoksa meşgul mü olduğunu belirtmek için Espresso'nun Boştaki Kaynaklar özelliğine çok benzer. IdlingResource'un uygulanmasını kaydetmek için Oluştur test kuralını kullanın.

composeTestRule.registerIdlingResource(idlingResource)
composeTestRule.unregisterIdlingResource(idlingResource)

Manuel senkronizasyon

Bazı durumlarda, Oluştur kullanıcı arayüzünü testinizin diğer bölümleriyle veya test ettiğiniz uygulamayla senkronize etmeniz gerekir.

waitForIdle() işlevi, Compose'un boşta kalmasını bekler ancak işlev autoAdvance özelliğine bağlıdır:

composeTestRule.mainClock.autoAdvance = true // Default
composeTestRule.waitForIdle() // Advances the clock until Compose is idle.

composeTestRule.mainClock.autoAdvance = false
composeTestRule.waitForIdle() // Only waits for idling resources to become idle.

Her iki durumda da waitForIdle()'ün bekleyen çizim ve düzen geçişlerini de beklediğini unutmayın.

Ayrıca, belirli bir koşul karşılanana kadar saati ilerletebilirsiniz. advanceTimeUntil().

composeTestRule.mainClock.advanceTimeUntil(timeoutMs) { condition }

Belirtilen koşulun, etkilenebilecek durumu kontrol etmesi gerektiğini unutmayın bu saate göre ayarlar (yalnızca Oluştur durumunda çalışır).

Koşulları bekleme

Veri yükleme veya Android'in veya çizim (yani Compose'un dışında ölçüm veya çizim) için waitUntil() gibi daha genel kavramları içerir:

composeTestRule.waitUntil(timeoutMs) { condition }

Ayrıca, waitUntil yardımcılar:

composeTestRule.waitUntilAtLeastOneExists(matcher, timeoutMs)

composeTestRule.waitUntilDoesNotExist(matcher, timeoutMs)

composeTestRule.waitUntilExactlyOneExists(matcher, timeoutMs)

composeTestRule.waitUntilNodeCount(matcher, count, timeoutMs)

Ek Kaynaklar

  • Android'de uygulamaları test etme: Ana Android testi açılış sayfası, testin temellerini ve tekniklerini daha kapsamlı bir şekilde gösterir.
  • Testin temelleri: Android uygulamasını test etmenin temel kavramları hakkında daha fazla bilgi edinin.
  • Yerel testler: Bazı testler yapabilirsiniz yerel olarak ve kendi iş istasyonunuzda.
  • 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ınıza entegre etmenizi sağlar ardışık düzendir.
  • 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ülemeye dayalı olarak tasarlanmıştır. Kullanıcı arayüzleri, Espresso bilgisi Compose'un bazı yönleri için yine de yararlı olabilir teşvik etmek anlamına gelir.