API'leri test etme

Kullanıcı arayüzü öğeleriyle etkileşim kurmanın üç ana yolu vardır:

  • Bulucular, bir veya daha fazla öğe (ya da semantik ağacındaki düğümler) seçerek bunlar üzerinde iddialarda bulunmanıza veya işlemler yapmanıza olanak tanır.
  • Onaylar, öğelerin mevcut olduğunu veya belirli özelliklere sahip olduğunu doğrulamak için kullanılır.
  • İşlemler, öğelere tıklama veya diğer hareketler gibi simüle edilmiş kullanıcı etkinlikleri ekler.

Bu API'lerden bazıları, semantik ağacındaki bir veya daha fazla düğüme başvurmak için SemanticsMatcher kabul eder.

Bulucular

Sırasıyla bir veya daha fazla düğüm seçmek için onNode ve onAllNodes kullanabilirsiniz. Ancak onNodeWithText ve onNodeWithContentDescription gibi en yaygın aramalar için kolaylık sağlayan bulucuları da kullanabilirsiniz. Listenin tamamına Compose Testleri Özet Sayfası'ndan göz atabilirsiniz.

Tek bir düğüm seçin

composeTestRule.onNode(<<SemanticsMatcher>>, useUnmergedTree = false): SemanticsNodeInteraction
// Example
composeTestRule
    .onNode(hasText("Button")) // Equivalent to onNodeWithText("Button")

Birden fazla düğüm seçme

composeTestRule
    .onAllNodes(<<SemanticsMatcher>>): SemanticsNodeInteractionCollection
// Example
composeTestRule
    .onAllNodes(hasText("Button")) // Equivalent to onAllNodesWithText("Button")

Birleştirilmemiş ağaç

Bazı düğümler, alt öğelerinin semantik bilgilerini birleştirir. Örneğin, iki metin öğesi içeren bir düğme, metin öğesi etiketlerini birleştirir:

MyButton {
    Text("Hello")
    Text("World")
}

Testten semantik ağacını göstermek için printToLog() kullanın:

composeTestRule.onRoot().printToLog("TAG")

Bu kod aşağıdaki çıkışı yazdırır:

Node #1 at (...)px
 |-Node #2 at (...)px
   Role = 'Button'
   Text = '[Hello, World]'
   Actions = [OnClick, GetTextLayoutResult]
   MergeDescendants = 'true'

Birleştirilmemiş ağaçta yer alacak bir düğümü eşleştirmeniz gerekiyorsa useUnmergedTree değerini true olarak ayarlayabilirsiniz:

composeTestRule.onRoot(useUnmergedTree = true).printToLog("TAG")

Bu kod aşağıdaki çıkışı yazdırır:

Node #1 at (...)px
 |-Node #2 at (...)px
   OnClick = '...'
   MergeDescendants = 'true'
    |-Node #3 at (...)px
    | Text = '[Hello]'
    |-Node #5 at (83.0, 86.0, 191.0, 135.0)px
      Text = '[World]'

useUnmergedTree parametresi tüm bulucularda kullanılabilir. Örneğin, burada onNodeWithText bulucuda kullanılıyor.

composeTestRule
    .onNodeWithText("World", useUnmergedTree = true).assertIsDisplayed()

Onaylar

Bir veya daha fazla eşleştirici içeren bir bulucunun döndürdüğü SemanticsNodeInteraction üzerinde assert() yöntemini çağırarak onayları kontrol edin:

// Single matcher:
composeTestRule
    .onNode(matcher)
    .assert(hasText("Button")) // hasText is a SemanticsMatcher

// Multiple matchers can use and / or
composeTestRule
    .onNode(matcher).assert(hasText("Button") or hasText("Button2"))

assertExists, assertIsDisplayed ve assertTextEquals gibi en yaygın iddialar için kolaylık işlevlerini de kullanabilirsiniz. Listenin tamamına Compose Testleri ile ilgili özet bilgi sayfasından göz atabilirsiniz.

Bir düğüm koleksiyonundaki iddiaları kontrol etmek için de işlevler vardır:

// Check number of matched nodes
composeTestRule
    .onAllNodesWithContentDescription("Beatle").assertCountEquals(4)
// At least one matches
composeTestRule
    .onAllNodesWithContentDescription("Beatle").assertAny(hasTestTag("Drummer"))
// All of them match
composeTestRule
    .onAllNodesWithContentDescription("Beatle").assertAll(hasClickAction())

İşlemler

Bir düğüme işlem eklemek için perform…() işlevini çağırın:

composeTestRule.onNode(...).performClick()

Aşağıda bazı işlem örnekleri verilmiştir:

performClick(),
performSemanticsAction(key),
performKeyPress(keyEvent),
performGesture { swipeLeft() }

Listenin tamamına Compose Testi Özet Sayfası'ndan göz atabilirsiniz.

Eşleştiriciler

Compose kodunuzu test etmek için çeşitli eşleştiriciler kullanılabilir.

Hiyerarşik eşleştiriciler

Hiyerarşik eşleştiriciler, semantik ağacında yukarı veya aşağı gidip eşleştirme yapmanıza olanak tanır.

fun hasParent(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnySibling(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyAncestor(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyDescendant(matcher: SemanticsMatcher):  SemanticsMatcher

Bu eşleştiricilerin kullanımına dair bazı örnekler:

composeTestRule.onNode(hasParent(hasText("Button")))
    .assertIsDisplayed()

Seçiciler

Test oluşturmanın alternatif bir yolu da bazı testleri daha okunabilir hale getirebilecek seçicileri kullanmaktır.

composeTestRule.onNode(hasTestTag("Players"))
    .onChildren()
    .filter(hasClickAction())
    .assertCountEquals(4)
    .onFirst()
    .assert(hasText("John"))

Listenin tamamına Compose Testleri ile ilgili özet bilgi sayfasından göz atabilirsiniz.

Ek Kaynaklar

  • Android'de uygulamaları test etme: Android testleriyle ilgili ana açılış sayfası, testle ilgili temel bilgiler ve teknikler hakkında daha geniş bir bakış açısı sunar.
  • Testlerle ilgili temel bilgiler: Android uygulamalarını test etmenin temel kavramları hakkında daha fazla bilgi edinin.
  • Yerel testler: Bazı testleri yerel olarak, kendi iş istasyonunuzda çalıştırabilirsiniz.
  • Enstrümantasyon testleri: Enstrümantasyon 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 kullanabileceği çok sayıda cihaz olduğundan farklı ekran boyutlarını test etmeniz gerekir.
  • Espresso: Görünüm tabanlı kullanıcı arayüzleri için tasarlanmış olsa da Espresso bilgisi, Compose testinin bazı yönleri için yine de faydalı olabilir.