API'leri test etme

Kullanıcı arayüzü öğeleriyle etkileşimde bulunmanın üç temel yolu vardır:

  • Bulucular, iddialarda bulunmak veya üzerinde işlem gerçekleştirmek için bir veya daha fazla öğe (ya da anlam ağacındaki düğümler) seçmenize 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 edilen kullanıcı etkinliklerini ekler.

Bu API'lerin bazıları, anlam ağacında bir veya daha fazla düğüme referans vermek için SemanticsMatcher etiketini kabul eder.

Bulucular

onNode ve onAllNodes kullanarak sırasıyla bir veya daha fazla düğüm seçebilirsiniz ancak onNodeWithText ve onNodeWithContentDescription gibi en yaygın aramalar için kolay erişim aracı kullanabilirsiniz. Tam listeye göz atmak için Test Oluşturma ile ilgili yardımcı kısa bilgilere 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ç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, anlambilim ağacını göstermek için printToLog() ifadesini 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'

Ayrılmış ağacın düğümünü eşleştirmeniz gerekirse 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ır.

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

Onaylama

Bir veya daha fazla eşleştiriciye sahip bir bulucu tarafından döndürülen SemanticsNodeInteraction üzerinde assert() çağrısı yaparak 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 onaylamalar için kolaylık işlevlerini de kullanabilirsiniz. Tam listeye göz atmak için Test Oluşturma ile ilgili yardımcı kısa bilgilere göz atabilirsiniz.

Bir düğüm koleksiyonundaki onayları 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 bir perform…() işlevini çağırın:

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

İşlemlere ilişkin bazı örnekleri aşağıda bulabilirsiniz:

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

Tam listeye göz atmak için Test Oluşturma ile ilgili yardımcı kısa bilgilere göz atabilirsiniz.

Eşleştiriciler

Oluşturma 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ğı ilerleyip 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, bu eşleştiricilerin kullanımına ilişkin bazı örnekler 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 göz atmak için Test Oluşturma ile ilgili yardımcı kısa bilgilere göz atabilirsiniz.

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.