API'leri test etme

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

  • Bulucular, üzerinde onaylama yapmak veya işlem gerçekleştirmek için bir ya da birden fazla öğe (veya semantik ağaçtaki düğümler) seçmenize olanak tanır.
  • Onaylamalar, öğ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 yerleştirir.

Bu API'lerden bazıları, anlam ağacındaki bir veya daha fazla SemanticsMatcher kabul eder.

Finders

Sırasıyla bir veya birden fazla düğüm seçmek için onNode ve onAllNodes simgelerini kullanabilirsiniz. Bununla birlikte, en yaygın aramalar için kolaylık sağlayan bulucuları da (ör. onNodeWithText ve onNodeWithContentDescription) kullanabilirsiniz. Tam listeye Compose Testing cheat sheet'ten göz atabilirsiniz.

Tek bir düğüm seçme

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")
}

Bir testten, semantik ağacı göstermek için printToLog() simgesini kullanın:

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

Bu kod aşağıdaki çıktıyı 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çtaki bir düğümü eşleştirmeniz gerekiyorsa useUnmergedTree değerini true olarak ayarlayabilirsiniz:

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

Bu kod aşağıdaki çıktıyı 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ıyor.

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

Onaylamalar

Bir veya daha fazla eşleştiriciyle arama yapan bir bulucunun döndürdüğü 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"))

Ayrıca, en yaygın onaylamalar için kolaylık sağlayan işlevleri de kullanabilirsiniz. Örneğin, assertExists, assertIsDisplayed ve assertTextEquals. Tam listeye Compose Testing cheat sheet'ten göz atabilirsiniz.

Ayrıca, 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 perform…() işlevini çağırın:

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

İşlemlere bazı örnekler:

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

Tam listeye Compose Testing cheat sheet'ten 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ğaçta yukarı veya aşağı gitmenize ve 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 ilişkin bazı örnekleri aşağıda bulabilirsiniz:

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

Seçiciler

Test oluşturmanın alternatif bir yolu da seçicileri kullanmaktır. Bu yöntem, bazı testlerin daha okunabilir olmasını sağlayabilir.

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

Tam listeye Compose Testing cheat sheet'ten göz atabilirsiniz.

Ek Kaynaklar

  • Android'de uygulamaları test etme: Android'deki ana test giriş sayfası, testlerle ilgili temel bilgiler ve teknikler 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çlı testler: Araçlı testler de çalıştırmak iyi bir uygulamadır. Yani doğrudan cihazda ç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 erişebileceği çok sayıda cihaz olduğundan farklı ekran boyutlarını test etmeniz gerekir.
  • Espresso: Görüntüleme tabanlı kullanıcı arayüzleri için tasarlanmış olsa da Espresso bilgisi, Compose testinin bazı yönlerinde faydalı olabilir.