Testlerinizi senkronize edin

Oluşturma testleri, varsayılan olarak kullanıcı arayüzünüzle senkronize edilir. ComposeTestRule ile bir onaylama veya işlem çağırdığınızda, test önceden senkronize edilir ve kullanıcı arayüzü ağacı boşta olana kadar bekler.

Normalde herhangi bir işlem yapmanız gerekmez. Ancak bilmeniz gereken bazı sıra dışı durumlar vardır.

Bir test senkronize edildiğinde, Compose uygulamanız sanal bir saat kullanarak zaman bakımından gelişmiş olur. Bu, Compose testlerinin gerçek zamanlı olarak çalışmadığı ve bu nedenle mümkün olduğunca hızlı geçebileceği anlamına gelir.

Ancak testlerinizi senkronize eden yöntemleri kullanmazsanız yeniden oluşturma işlemi gerçekleşmez 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 şartın yalnızca Compose hiyerarşileri için geçerli olduğunu ve uygulamanın geri kalanı için geçerli olmadığını unutmayın.

Otomatik senkronizasyonu devre dışı bırakın

ComposeTestRule aracılığıyla (ör. assertExists()) bir onaylama veya işlem çağırdığınızda testiniz Compose kullanıcı arayüzüyle senkronize edilir. Bazı durumlarda bu senkronizasyonu durdurup saati kendiniz kontrol etmek isteyebilirsiniz. Örneğin, kullanıcı arayüzünün hâlâ meşgul olduğu bir noktada animasyonun doğru ekran görüntülerini almak için gereken süreyi kontrol edebilirsiniz. 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. advanceTimeByFrame() ile tam olarak bir kare veya advanceTimeBy() ile belirli bir süre ilerletebilirsiniz:

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

Boşta kaynaklar

Compose, testleri ve kullanıcı arayüzünü senkronize edebilir. Böylece, her işlem ve onay boşta kaldığında, saat gerektiği gibi beklenir veya ilerler. Bununla birlikte, sonuçları kullanıcı arayüzü durumunu etkileyen bazı eşzamansız işlemler, testin farkında değilken arka planda çalıştırılabilir.

Test edilen uygulamanın meşgul mü yoksa boşta mı olduğuna karar verirken dikkate alınmaları için bu boştaki kaynakları testinizde oluşturup kaydedin. Ek boşta kalma kaynakları kaydetmeniz gerekmedikçe (örneğin, Espresso veyaCompose ile senkronize edilmeyen bir arka plan işi çalıştırıyorsanız) işlem yapmanız gerekmez.

Bu API, test edilen konunun boşta mı yoksa meşgul mü olduğunu belirtmek için Espresso'nun Idling Resources (Boşta Kalma Kaynakları) aracına çok benzer. IdlingResource uygulamasını kaydetmek için Oluştur test kuralını kullanın.

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

Manuel senkronizasyon

Bazı durumlarda, Compose kullanıcı arayüzünü testinizin veya test ettiğiniz uygulamanın diğer bölümleriyle 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() işlevinin beklemedeki çizim ve düzen geçişlerini de beklediğini unutmayın.

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

composeTestRule.mainClock.advanceTimeUntil(timeoutMs) { condition }

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

Koşulları bekleyin

Veri yükleme veya Android'in ölçümü ya da çizimi (yani Compose dışında ölçüm veya çizim) gibi harici çalışmaya bağlı tüm koşullar waitUntil() gibi daha genel bir kavram kullanmalıdır:

composeTestRule.waitUntil(timeoutMs) { condition }

waitUntil yardımcılarından birini de kullanabilirsiniz:

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ı, testle ilgili temel bilgiler ve teknikler hakkında daha kapsamlı bir görünüm sağlar.
  • Testin temelleri: Android uygulamasını test etmenin temel kavramları hakkında daha fazla bilgi edinin.
  • Yerel testler: Bazı testleri yerel olarak kendi iş istasyonunuzda çalıştırabilirsiniz.
  • Araçlı testler: Araçlı testleri 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 kullanımına sunulan bazı cihazlar söz konusu olduğunda, 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.