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. Ancak, bazı uç örnekler bilmeniz gereken önemli noktalardı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şir ve kullanıcı arayüzü duraklatılmış olarak 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ırakın

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 durdurup 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

Bu durumda genellikle süreyi kendiniz ilerletirsiniz. 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 bazı Sonuçları kullanıcı arayüzü durumunu etkileyen eşzamansız işlemler arka planda çalışmaya devam edebilir.

Bu boşta kalma kaynaklarını testinize oluşturup kaydedin. dikkate alınır. 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, Espresso'nun Idling Resources (Idling Kaynakları) API'sine çok benzer, test edilen kişi boşta veya meşgulse. Kaydetmek için Oluştur test kuralını kullanma IdlingResource uygulanması.

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

Manuel senkronizasyon

Bazı durumlarda, Oluştur kullanıcı arayüzünü testiniz veya test ettiğiniz uygulama olabilir.

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() işlevinin beklemedeki çizim ve düzen işlemlerini de beklediğini unutmayın. pasaport ekleyin.

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ı bekleyin

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.
  • Testle ilgili temel bilgiler: Daha fazla bilgi bir Android uygulamasını test etmenin arkasındaki temel kavramlar hakkında.
  • Yerel testler: Bazı testler yapabilirsiniz yerel olarak, kendi iş istasyonunuzda.
  • Araçlı testler: İyidir araçlı testleri de yapma alıştırması yapacaksınız. Yani doğrudan yürütülen testler cihaz üzerinde.
  • 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: birçok cihaz varsa bunları farklı ekranlarla test etmeniz gerekir seçin.
  • 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.