Testlerinizi senkronize edin

Oluşturma testleri varsayılan olarak kullanıcı arayüzünüzle senkronize edilir. ComposeTestRule ile bir iddiayı veya işlemi çağırdığınızda test önceden senkronize edilir ve kullanıcı arayüzü ağacı boşa çıkana kadar beklenir.

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

Bir test senkronize edildiğinde, sanal bir saat kullanılarak Oluştur uygulamanız zaman içinde ileri alınır. Bu, Oluşturma 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 derleme 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 koşulun yalnızca uygulamanın geri kalanı için değil, yalnızca Hiyerarşi Oluşturma için geçerli olduğunu unutmayın.

Otomatik senkronizasyonu devre dışı bırakma

ComposeTestRule aracılığıyla bir iddia veya işlem çağırdığınızda (ör. assertExists()), testiniz Oluştur 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

Genellikle zamanı kendiniz ileri alırsınız. advanceTimeByFrame() ile tam olarak bir kare veya advanceTimeBy() ile belirli bir süre ilerletebilirsiniz:

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

Boşta kaynaklar

Oluşturma, her işlem ve iddianın boş durumda yapılması için testleri ve kullanıcı arayüzünü senkronize edebilir, gerektiğinde saati bekleyebilir veya ileri alabilir. 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. 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 ö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, Compose kullanıcı arayüzünü testinizin veya test ettiğiniz uygulamanın diğer bölümleriyle senkronize etmeniz gerekir.

waitForIdle() işlevi, Oluştur'un boşta olması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, advanceTimeUntil() ile belirli bir koşul karşılanana kadar saati ileri alabilirsiniz.

composeTestRule.mainClock.advanceTimeUntil(timeoutMs) { condition }

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

Koşulları bekleme

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

composeTestRule.waitUntil(timeoutMs) { condition }

Ayrıca aşağıdaki waitUntil yardımcılarından herhangi 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 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çlı testler: Araçlı testleri 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: View tabanlı kullanıcı arayüzlerine yönelik olsa da Espresso bilgisi, Compose testinin bazı yönlerinde yararlı olabilir.