API'leri test etme

Kullanıcı arayüzü öğeleriyle etkileşim kurmanın üç 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.
  • Onaylar, öğelerin mevcut olduğunu veya belirli özelliklere sahip olduğunu doğrulamak için kullanılır.
  • İşlemler, simüle edilmiş kullanıcı etkinliklerini (tıklamalar veya diğer hareketler gibi) öğelere ekler.

Bu API'lerin bazıları, anlam ağacında bir veya daha fazla düğüme başvuruda bulunmak için SemanticsMatcher ifadesini kabul eder.

Bulucular

Sırasıyla bir veya daha fazla düğüm seçmek için onNode ve onAllNodes tuşlarını kullanabilirsiniz ancak onNodeWithText ve onNodeWithContentDescription gibi en sık yapılan aramalar için kolaylık bulucular 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ştirilen ağaç

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

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

Bir testte, printToLog() işlevini kullanarak anlam ağacını gösterin:

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ştirilen ağacın bir düğümünü eşlemeniz 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ılır.

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

Onaylamalar

Bir veya daha fazla eşleştiriciye sahip bir bulucu tarafından döndürülen SemanticsNodeInteraction üzerinde assert() çağrısı yaparak onaylamaları 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"))

En yaygın onaylamalar için assertExists, assertIsDisplayed ve assertTextEquals gibi kolaylık işlevlerini de kullanabilirsiniz. Tam listeye Test Etme ile ilgili yardımcı kısa bilgiler bölümünden göz atabilirsiniz.

Bir düğüm koleksiyonundaki onayları kontrol eden 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()

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

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

Tam listeye Test Testi için yardımcı kısa bilgiler bölümünden 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, anlam ağacında yukarı veya aşağı gidip eşleme yapmanızı sağlar.

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

Aşağıda, kullanılan bu eşleştiricilerin bazı örnekleri verilmiştir:

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

Seçiciler

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

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

Tam listeye Test Etme ile ilgili yardımcı kısa bilgiler bölümünden göz atabilirsiniz.

Ek Kaynaklar

  • Android'de uygulamaları test etme: Ana Android testi açılış sayfası, testle ilgili temel bilgiler ve teknikler hakkında daha kapsamlı bir görünüm sağlar.
  • Testin temelleri: Android uygulamasını test etmenin temel kavramları hakkında daha fazla bilgi edinin.
  • Yerel testler: Bazı testleri yerel olarak kendi iş istasyonunuzda çalıştırabilirsiniz.
  • Araçlı testler: Araçlı 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 kullanımına sunulan bazı cihazlar söz konusu olduğunda, farklı ekran boyutlarını test etmeniz gerekir.
  • Espresso: View tabanlı kullanıcı arayüzlerine yönelik olsa da Espresso bilgisi, Compose testinin bazı yönlerinde yararlı olabilir.