API'leri test etme

Kullanıcı arayüzü öğeleriyle etkileşime geçmenin üç ana yolu vardır:

  • Bulucular, bir veya daha fazla öğeyi (veya anlam ağacında düğüm) seçerek onaylamalar yapmanıza ya da bunlar üzerinde işlem 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.

Bulucular

Sırasıyla bir veya birden fazla düğüm seçmek için onNode ve onAllNodes kullanabilirsiniz. Ancak en yaygın aramalar için onNodeWithText ve onNodeWithContentDescription gibi kolay arama araçlarını da kullanabilirsiniz. Tam listeye Test Testi için yardımcı kısa bilgiler bölümünden 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 çok düğüm seçin

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ı inceleyerek 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 testinin bazı yönleri için yine de yararlı olabilir.