Testlerinizi senkronize edin

Oluşturma testleri varsayılan olarak kullanıcı arayüzünüzle senkronize edilir. ComposeTestRule ile bir onay veya işlem çağırdığınızda test, kullanıcı arayüzü ağacı boşta kalana kadar beklenerek ö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 bir saat kullanarak gelişmiş olur. Bu, Compose testlerinin gerçek zamanlı olarak çalışmayacağı ve dolayısıyla olabildiğince hızlı bir şekilde geçebileceği anlamına gelir.

Ancak testlerinizi senkronize eden yöntemleri kullanmazsanız yeniden oluşturma yapılmaz 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 Oluşturma hiyerarşileri için geçerli olduğunu, uygulamanın geri kalanı için geçerli olmadığını unutmayın.

Otomatik senkronizasyonu devre dışı bırakma

ComposeTestRule üzerinden bir onaylama veya işlem (ör. assertExists()) çağırdığınızda 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 meşgul olacağı bir noktada animasyonun doğru ekran görüntülerini alma süresini 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 saati siz ilerlersiniz. advanceTimeByFrame() ile tam olarak bir kare veya advanceTimeBy() ile belirli bir süre ilerleyebilirsiniz:

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

Boşta olan kaynaklar

Compose, testleri ve kullanıcı arayüzünü senkronize edebilir. Böylece her işlem ve onaylama işlemi boşta durumdayken tamamlanır. Bununla birlikte, sonuçları kullanıcı arayüzü durumunu etkileyen bazı eşzamansız işlemler, test bunların farkında değilken arka planda çalıştırılabilir.

Test edilen uygulamanın meşgul ya da boşta olup olmadığına karar verilirken dikkate alınmaları için, testinize bu boşta olan kaynakları oluşturup kaydedin. Boşta kalan başka kaynaklar kaydetmeniz gerekmediği sürece (örneğin, Espresso veya Oluşturma ile senkronize edilmeyen bir arka plan işi çalıştırıyorsanız) herhangi bir işlem yapmanız gerekmez.

Bu API, test edilen kişinin boşta mı yoksa meşgul mü olduğunu belirtmek açısından Espresso'nun Boşta Kalma Kaynakları aracına çok benzer. IdlingResource uygulamasının kullanımını kaydetmek için Test oluşturma 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 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() öğesinin bekleyen çizme ve düzen geçitlerini 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çüsü ya da çizimi (yani Compose'un dışında ölçme veya çizim yapma) gibi harici çalışmaya bağlı tüm koşullarda, waitUntil() gibi daha genel bir kavram kullanılmalıdır:

composeTestRule.waitUntil(timeoutMs) { condition }

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 testi açılış sayfası, testlerle ilgili temel bilgiler ve tekniklere dair daha kapsamlı bir bakış sunar.
  • Testlerle ilgili temel bilgiler: Android uygulamalarını test etmenin ardındaki temel kavramlar hakkında daha fazla bilgi edinin.
  • Yerel testler: Kendi iş istasyonunuzda yerel olarak bazı testler yapabilirsiniz.
  • Araçlı testler: Araçlı testler de çalıştırmak iyi bir uygulamadır. Yani, doğrudan cihaz üzerinde yapı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 kullanımına sunulan çok sayıda cihaz arasından farklı ekran boyutlarını test etmeniz gerekir.
  • Espresso: Görünüm tabanlı kullanıcı arayüzlerinde kullanılmak üzere tasarlanmış olsa da Espresso bilgisi, Oluşturma testinin bazı bölümlerinde yine de yararlı olabilir.