API'leri test etme

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

  • Bulurlar, bir veya daha fazla öğe (veya semantik ağacındaki düğümler) seçerek bunlarla ilgili iddialarda bulunmanıza veya işlemler yapmanıza olanak tanır.
  • İddialar, öğelerin var olduğunu veya belirli özelliklere sahip olduğunu doğrulamak için kullanılır.
  • İşlemler, öğelere simüle edilmiş kullanıcı etkinlikleri (ör. tıklamalar veya diğer hareketler) enjekte eder.

Bu API'lerden bazıları, anlam ağacındaki bir veya daha fazla düğümü belirtmek için SemanticsMatcher kabul eder.

Bulduğunuz

Sırasıyla bir veya birden fazla düğüm seçmek için onNode ve onAllNodes kullanabilirsiniz. Ancak onNodeWithText ve onNodeWithContentDescription gibi en yaygın aramalar için kolay arama araçlarını da kullanabilirsiniz. Oluşturma Testi ile ilgili ipuçlarını inceleyerek listenin tamamına 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 anlam bilgisini birleştirir. Örneğin, iki metin öğesi içeren bir düğmede metin öğesi etiketleri birleştirilir:

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

Bir testte, anlam ağacını göstermek için printToLog() simgesini 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ğacın bir düğümünü 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 bir onNodeWithText bulucuda kullanılmaktadır.

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

İddialar

Bir veya daha fazla eşleyici içeren bir bulucu tarafından döndürülen SemanticsNodeInteraction üzerinde assert()'yi çağırarak iddiaları 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. Oluşturma Testi ile ilgili ipuçlarının yer aldığı sayfa'da listenin tamamına göz atabilirsiniz.

Ayrıca, bir düğüm koleksiyonundaki iddiaları kontrol etmek için işlevler de 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()

İşlemlere örnek olarak şunları verebiliriz:

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

Oluşturma Testi ile ilgili ipuçlarını inceleyerek listenin tamamına göz atabilirsiniz.

Eşleştirenler

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

Hiyerarşik eşleştiriciler

Hiyerarşik eşleyiciler, semantik ağacında yukarı veya aşağı gitmenize ve eşleme 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 ilişkin bazı örnekleri aşağıda bulabilirsiniz:

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

Seçiciler

Test oluşturmanın alternatif bir yolu, bazı testleri daha okunaklı hale getirebilecek seçiciler kullanmaktır.

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

Oluşturma Testi ile ilgili ipuçlarının yer aldığı sayfa'da listenin tamamına göz atabilirsiniz.

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.