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 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 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 durdurmak ve saati kendiniz kontrol etmek isteyebilirsiniz. Örneğin, kullanıcı arayüzünün hâlâ meşgul olacağı bir noktada bir animasyonun doğru ekran görüntülerini almak için zamanı 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 ilerleyebilirsiniz:

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 kaynağı kaydetmeniz gerekmediği sürece (ör. Espresso veya Compose ile senkronize edilmeyen bir arka plan işi çalıştırırsanı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, Oluştur kullanıcı arayüzünü testinizin diğer bölümleriyle veya test ettiğiniz uygulamayla senkronize etmeniz gerekir.

waitForIdle() işlevi, Oluştur'un boşta olmasını bekler ancak işlev autoAdvance mülküne 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ç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 testi ile ilgili bazı yönler için yine de faydalı olabilir.