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.