APIs testen

Es gibt drei Möglichkeiten, mit UI-Elementen zu interagieren:

  • 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 Assertions wird überprüft, ob die Elemente existieren oder bestimmte Attribute.
  • Durch Aktionen werden simulierte Nutzerereignisse in die Elemente eingefügt, z. B. Klicks oder andere Gesten.

Für einige dieser APIs kann ein SemanticsMatcher-Zeichen verwendet werden, um auf eines oder mehrere zu verweisen. Knoten in der Semantikstruktur.

Sucher

Mit onNode und onAllNodes können Sie einen oder mehrere Knoten auswählen Sie können aber auch die Komfortsuche für die häufigsten Suchanfragen wie onNodeWithText und onNodeWithContentDescription Die vollständige Liste finden Sie im Compose-Tests auf einen Blick

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 Semantikinformationen 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 Baums nicht verbunden abgleichen möchten, können Sie Folgendes festlegen: useUnmergedTree nach true:

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()

Assertions

Assertions durch Aufrufen von assert() in der SemanticsNodeInteraction prüfen die von einem Finder mit einem oder mehreren Matchern zurückgegeben werden:

// 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 Convenience-Funktionen für die gängigsten Assertions 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() }

Die vollständige Liste finden Sie im Compose-Tests auf einen Blick

Matcher

Zum Testen von „Compose“ sind verschiedene Matcher verfügbar Code.

Hierarchische Matcher

Mit hierarchischen Matchern können Sie im Semantikbaum nach oben oder unten gehen -Übereinstimmungen.

fun hasParent(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnySibling(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyAncestor(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyDescendant(matcher: SemanticsMatcher):  SemanticsMatcher

Hier sind einige Beispiele für die Verwendung dieser Abgleichkriterien:

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

Selektoren

Alternativ können Tests mit Selektoren erstellt werden. besser lesbar machen.

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: Hier werden die wichtigsten Android-Tests aufgeführt. Landingpage einen umfassenderen Überblick über die Grundlagen und Verfahren der Tests bietet.
  • Testgrundlagen:Weitere Informationen Kernkonzepte beim Testen einer Android-App.
  • Lokale Tests:Sie können einige Tests ausführen. lokal auf Ihrer eigenen Workstation.
  • Instrumentierte Tests:Gut instrumentierte Tests durchfü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: Nur für Aufrufe auf Basis von Aufrufen Benutzeroberflächen und Espresso-Kenntnisse können bei einigen Aspekten von „Compose“ hilfreich sein Tests durchführen.