Testlerinizi senkronize edin

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

Normalde herhangi bir işlem yapmanız gerekmez. Ancak bilmeniz gereken bazı uç durumlar vardır.

Bir test senkronize edildiğinde, Compose uygulamanız sanal saat kullanılarak zamanda ilerletilir. Bu nedenle, Oluşturma testleri anlık olarak çalışmaz ve mümkün olduğunca hızlı bir şekilde tamamlanabilir.

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 Compose hiyerarşileri için geçerli olduğunu ve uygulamanın geri kalanını etkilemediğini unutmayın.

Otomatik senkronizasyonu devre dışı bırakma

ComposeTestRule gibi bir yöntemle bir onaylama veya işlem çağırdığınızda assertExists(), 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 zamanı kontrol edebilirsiniz. Otomatik senkronizasyonu devre dışı bırakmak için autoAdvance özelliğini mainClock içinde false olarak ayarlayın:

composeTestRule.mainClock.autoAdvance = false

Genellikle, zamanı kendiniz ilerletirsiniz. advanceTimeByFrame() ile tam olarak bir kare veya advanceTimeBy() ile belirli bir süre ileri gidebilirsiniz:

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

Boşta kaynaklar

Compose, testleri ve kullanıcı arayüzünü senkronize ederek her işlemin ve onaylamanın boşta durumda yapılmasını sağlar. Bu sayede, gerektiğinde saat beklenir veya ilerletilir. Ancak sonuçları kullanıcı arayüzü durumunu etkileyen bazı eşzamansız işlemler, testin farkında olmadığı bir şekilde arka planda çalıştırılabilir.

Testinizde bu boşta kalma kaynaklarını oluşturup kaydedin. Böylece, test edilen uygulamanın meşgul mü yoksa boşta mı olduğuna karar verilirken bu kaynaklar dikkate alınır. Ek boşta kalma kaynakları kaydetmeniz gerekmiyorsa (ör. Espresso veya Compose ile senkronize edilmeyen bir arka plan işi çalıştırıyorsanız) herhangi bir işlem yapmanız gerekmez.

Bu API, test edilen öğenin boşta mı yoksa meşgul mü olduğunu belirtmek için Espresso'nun Idling Resources'ına çok benzer. IdlingResource uygulamasını kaydetmek için test kuralı oluşturma özelliğini kullanın.

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

Manuel senkronizasyon

Bazı durumlarda, Compose kullanıcı arayüzünü testinizin diğer kısımlarıyla veya test ettiğiniz uygulamayla senkronize etmeniz gerekir.

waitForIdle() işlevi, Compose'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(), bekleyen çizim ve düzen geçişlerini de bekler.

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

composeTestRule.mainClock.advanceTimeUntil(timeoutMs) { condition }

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

Koşulları bekleme

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

composeTestRule.waitUntil(timeoutMs) { condition }

Ayrıca, 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: Android'deki ana test giriş sayfası, testlerle ilgili temel bilgiler ve teknikler 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ı testler de çalıştırmak iyi bir uygulamadır. Yani doğrudan cihazda ç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 erişebileceği çok sayıda cihaz olduğundan farklı ekran boyutlarını test etmeniz gerekir.
  • Espresso: Görüntüleme tabanlı kullanıcı arayüzleri için tasarlanmış olsa da Espresso bilgisi, Compose testinin bazı yönlerinde faydalı olabilir.