Es gibt drei Hauptmethoden für die Interaktion mit UI-Elementen:
- Mit Findern können Sie ein oder mehrere Elemente (oder Knoten im Bereich Semantik), um Assertions zu erstellen oder Aktionen für sie auszuführen.
- Mit Behauptungen wird überprüft, ob die Elemente vorhanden sind oder bestimmte Attribute haben.
- Durch Aktionen werden simulierte Nutzerereignisse in die Elemente eingefügt, z. B. Klicks oder andere Gesten.
Einige dieser APIs akzeptieren ein SemanticsMatcher
, um sich auf einen oder mehrere Knoten im semantischen Baum zu beziehen.
Finder
Mit onNode
und onAllNodes
können Sie einen oder mehrere Knoten auswählen
Sie können aber auch die am häufigsten verwendete Suchfunktion
Suchanfragen wie onNodeWithText
und
onNodeWithContentDescription
Die vollständige Liste finden Sie in der Kurzübersicht zum Erstellen von Tests.
Einzelnen Knoten auswählen
composeTestRule.onNode(<<SemanticsMatcher>>, useUnmergedTree = false): SemanticsNodeInteraction
// Example
composeTestRule
.onNode(hasText("Button")) // Equivalent to onNodeWithText("Button")
Mehrere Knoten auswählen
composeTestRule
.onAllNodes(<<SemanticsMatcher>>): SemanticsNodeInteractionCollection
// Example
composeTestRule
.onAllNodes(hasText("Button")) // Equivalent to onAllNodesWithText("Button")
Baum nicht verbunden
Einige Knoten führen die semantischen Informationen ihrer untergeordneten Knoten zusammen. Beispiel: Bei einer Schaltfläche mit zwei Textelementen werden die Textelement-Labels zusammengeführt:
MyButton {
Text("Hello")
Text("World")
}
In einem Test können Sie mit printToLog()
den Semantikbaum anzeigen lassen:
composeTestRule.onRoot().printToLog("TAG")
Dieser Code gibt die folgende Ausgabe aus:
Node #1 at (...)px
|-Node #2 at (...)px
Role = 'Button'
Text = '[Hello, World]'
Actions = [OnClick, GetTextLayoutResult]
MergeDescendants = 'true'
Wenn Sie einen Knoten des nicht zusammengeführten Baums abgleichen möchten, können Sie useUnmergedTree
auf true
festlegen:
composeTestRule.onRoot(useUnmergedTree = true).printToLog("TAG")
Dieser Code gibt die folgende Ausgabe aus:
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]'
Der Parameter useUnmergedTree
ist in allen Findern verfügbar. Hier ein Beispiel
er wird in einem onNodeWithText
-Finder verwendet.
composeTestRule
.onNodeWithText("World", useUnmergedTree = true).assertIsDisplayed()
Behauptungen
Prüfen Sie Behauptungen, indem Sie assert()
auf die SemanticsNodeInteraction
anwenden, die von einem Finder mit einem oder mehreren Matchern zurückgegeben wird:
// 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"))
Sie können auch praktische Funktionen für die häufigsten Behauptungen verwenden, z. B. assertExists
, assertIsDisplayed
und assertTextEquals
.
Die vollständige Liste finden Sie auf der Übersicht zu Composer-Tests.
Es gibt auch Funktionen zum Prüfen von Assertions für eine Sammlung von Knoten:
// 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())
Aktionen
Rufen Sie eine perform…()
-Funktion auf, um eine Aktion auf einem Knoten einzufügen:
composeTestRule.onNode(...).performClick()
Hier einige Beispiele für Aktionen:
performClick(),
performSemanticsAction(key),
performKeyPress(keyEvent),
performGesture { swipeLeft() }
Eine vollständige Liste finden Sie in der Kurzübersicht zum Erstellen von Tests.
Matcher
Für den Test Ihres Compose-Codes stehen verschiedene Übereinstimmungsmechanismen zur Verfügung.
Hierarchische Matcher
Mit hierarchischen Abgleichern können Sie im semantischen Baum nach oben oder unten gehen und einen Abgleich durchführen.
fun hasParent(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnySibling(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyAncestor(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyDescendant(matcher: SemanticsMatcher): SemanticsMatcher
Hier einige Beispiele für die Verwendung dieser Abgleichsmechanismen:
composeTestRule.onNode(hasParent(hasText("Button")))
.assertIsDisplayed()
Selektoren
Alternativ können Sie Auswahlen verwenden, um einige Tests übersichtlicher zu gestalten.
composeTestRule.onNode(hasTestTag("Players"))
.onChildren()
.filter(hasClickAction())
.assertCountEquals(4)
.onFirst()
.assert(hasText("John"))
Die vollständige Liste finden Sie auf der Übersicht zu Composer-Tests.
Zusätzliche Ressourcen
- Apps unter Android testen: Die Haupt-Landingpage für Android-Tests bietet einen umfassenderen Überblick über die Grundlagen und Techniken des Testens.
- Grundlagen des Testens: Hier erfahren Sie mehr über die grundlegenden Konzepte beim Testen einer Android-App.
- Lokale Tests:Sie können einige Tests ausführen. lokal auf Ihrer eigenen Workstation.
- Instrumentierte Tests: Es empfiehlt sich, auch instrumentierte Tests auszuführen. Das sind Tests, die direkt auf dem Gerät.
- Continuous Integration: Mit Continuous Integration können Sie Ihre Tests in Ihre Bereitstellung einbinden zu erstellen.
- Verschiedene Bildschirmgrößen testen:Mit Geräten verfügbar sind, sollten Sie auf verschiedenen Bildschirmen testen, Größen.
- Espresso: Obwohl Espresso für viewbasierte UIs gedacht ist, können Kenntnisse zu Espresso für einige Aspekte von Compose-Tests hilfreich sein.