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.