Espresso Testing Framework - Matcher anzeigen

Das Espresso-Framework bietet viele View Matcher. Der Zweck des Matchers besteht darin, eine Ansicht mit verschiedenen Attributen der Ansicht wie ID, Text und Verfügbarkeit der untergeordneten Ansicht abzugleichen. Jeder Matcher entspricht einem bestimmten Attribut der Ansicht und gilt für einen bestimmten Ansichtstyp. Beispielsweise stimmt der withId- Matcher mit der Id- Eigenschaft der Ansicht überein und gilt für alle Ansichten, während der withText-Matcher mit der Text- Eigenschaft der Ansicht übereinstimmt und nur für TextView gilt .

In diesem Kapitel lernen wir die verschiedenen Matcher kennen, die vom Espresso-Test-Framework bereitgestellt werden, sowie die Hamcrest- Bibliothek, auf der die Espresso-Matcher basieren.

Hamcrest Bibliothek

Die Hamcrest- Bibliothek ist eine wichtige Bibliothek im Rahmen des Espresso-Test-Frameworks. Hamcrest ist selbst ein Framework zum Schreiben von Matcher-Objekten. Das Espresso-Framework verwendet die Hamcrest- Bibliothek in großem Umfang und erweitert sie bei Bedarf, um einfache und erweiterbare Matcher bereitzustellen.

Hamcrest bietet eine einfache Funktion assertThat und eine Sammlung von Matchern, um Objekte zu bestätigen. assertThat hat drei Argumente und sie sind wie unten gezeigt -

  • String (Beschreibung des Tests, optional)

  • Objekt (aktuell)

  • Matcher (erwartet)

Schreiben wir ein einfaches Beispiel, um zu testen, ob ein Listenobjekt den erwarteten Wert hat.

import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.MatcherAssert.assertThat;
@Test
public void list_hasValue() {
   ArrayList<String> list = new ArrayList<String>();
   list.add("John");
   assertThat("Is list has John?", list, hasItem("John"));
}

Hier gibt hasItem einen Matcher zurück, der prüft, ob die tatsächliche Liste einen Wert als eines der Elemente angegeben hat.

Hamcrest verfügt über viele integrierte Matcher und Optionen zum Erstellen neuer Matcher. Einige der wichtigen integrierten Matcher, die im Espresso-Test-Framework nützlich sind, sind folgende:

alles - immer Matcher

Logisch basierte Matcher

  • allOf - Akzeptieren Sie eine beliebige Anzahl von Matchern und Matches nur, wenn alle Matcher erfolgreich sind.

  • anyOf - Akzeptieren Sie eine beliebige Anzahl von Matchern und Matches, wenn ein Matcher erfolgreich war.

  • not - Akzeptiere einen Matcher und stimme nur zu, wenn der Matcher fehlgeschlagen ist und umgekehrt.

Textbasierte Matcher

  • equalToIgnoringCase - Wird verwendet, um zu testen, ob die tatsächliche Eingabe dem erwarteten Groß- / Kleinschreibung entspricht.

  • equalToIgnoringWhiteSpace - Wird verwendet, um zu testen, ob die tatsächliche Eingabe der angegebenen Zeichenfolge entspricht, wobei Groß- und Kleinschreibung und Leerzeichen ignoriert werden.

  • containsString - wird verwendet, um zu testen, ob die tatsächliche Eingabe eine angegebene Zeichenfolge enthält.

  • endsWith - Wird verwendet, um zu testen, ob die tatsächliche Eingabe mit der angegebenen Zeichenfolge beginnt.

  • startsWith - Wird verwendet, um zu testen, ob die Eingabe tatsächlich mit der angegebenen Zeichenfolge endet.

Zahlenbasierte Matcher

  • closeTo - wird verwendet, um zu testen, ob die tatsächliche Eingabe nahe an der erwarteten Anzahl liegt.

  • greaterThan - wird verwendet, um zu testen, ob die tatsächliche Eingabe größer als die erwartete Anzahl ist.

  • greaterThanOrEqualTo - wird verwendet, um zu testen, ob die tatsächliche Eingabe größer oder gleich der erwarteten Anzahl ist.

  • lessThan - wird verwendet, um zu testen, ob die tatsächliche Eingabe kleiner als die erwartete Anzahl ist.

  • lessThanOrEqualTo - wird verwendet, um zu testen, ob die tatsächliche Eingabe kleiner oder gleich der erwarteten Anzahl ist.

Objektbasierte Matcher

  • equalTo - wird verwendet, um zu testen, ob die tatsächliche Eingabe dem erwarteten Objekt entspricht

  • hasToString - Wird verwendet, um zu testen, ob die tatsächliche Eingabe die toString-Methode hat.

  • instanceOf - Wird verwendet, um zu testen, ob die tatsächliche Eingabe die Instanz der erwarteten Klasse ist.

  • isCompatibleType - wird verwendet, um zu testen, ob die tatsächliche Eingabe mit dem erwarteten Typ kompatibel ist.

  • notNullValue - wird verwendet, um zu testen, ob die tatsächliche Eingabe nicht null ist.

  • sameInstance - wird verwendet, um zu testen, ob die tatsächliche Eingabe und die erwartete Eingabe von derselben Instanz sind.

  • hasProperty - wird verwendet, um zu testen, ob die tatsächliche Eingabe die erwartete Eigenschaft hat

ist - Zucker oder Abkürzung für gleich

Matcher

Espresso bietet die onView () -Methode zum Abgleichen und Finden der Ansichten. Es akzeptiert Ansichtsabgleiche und gibt das ViewInteraction-Objekt zurück, um mit der übereinstimmenden Ansicht zu interagieren. Die häufig verwendete Liste der Ansichts-Matcher wird unten beschrieben -

withId ()

withId () akzeptiert ein Argument vom Typ int und das Argument verweist auf die ID der Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht anhand der ID der Ansicht entspricht. Der Beispielcode lautet wie folgt:

onView(withId(R.id.testView))

withText ()

withText () akzeptiert ein Argument vom Typ string und das Argument verweist auf den Wert der Texteigenschaft der Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht anhand des Textwerts der Ansicht entspricht. Dies gilt nur für TextView . Der Beispielcode lautet wie folgt:

onView(withText("Hello World!"))

withContentDescription ()

withContentDescription () akzeptiert ein Argument vom Typ string und das Argument verweist auf den Wert der Inhaltsbeschreibungseigenschaft der Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht anhand der Beschreibung der Ansicht entspricht. Der Beispielcode lautet wie folgt:

onView(withContentDescription("blah"))

Wir können auch die Ressourcen-ID des Textwerts anstelle des Textes selbst übergeben.

onView(withContentDescription(R.id.res_id_blah))

hasContentDescription ()

hasContentDescription () hat kein Argument. Es wird ein Matcher zurückgegeben, der der Ansicht mit einer beliebigen Inhaltsbeschreibung entspricht. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), hasContentDescription()))

withTagKey ()

withTagKey () akzeptiert ein Argument vom Typ string und das Argument verweist auf den Tag-Schlüssel der Ansicht. Es wird ein Matcher zurückgegeben, der mit seinem Tag-Schlüssel mit der Ansicht übereinstimmt. Der Beispielcode lautet wie folgt:

onView(withTagKey("blah"))

Wir können auch die Ressourcen-ID des Tag-Namens anstelle des Tag-Namens selbst übergeben.

onView(withTagKey(R.id.res_id_blah))

withTagValue ()

withTagValue () akzeptiert ein Argument vom Typ Matcher <Objekt> und das Argument verweist auf den Tag-Wert der Ansicht. Es wird ein Matcher zurückgegeben, der anhand seines Tag-Werts mit der Ansicht übereinstimmt. Der Beispielcode lautet wie folgt:

onView(withTagValue(is((Object) "blah")))

Hier ist ist hamcrest Matcher.

withClassName ()

withClassName () akzeptiert ein Argument vom Typ Matcher <String> und das Argument verweist auf den Klassennamenwert der Ansicht. Es wird ein Matcher zurückgegeben, der mit seinem Klassennamen mit der Ansicht übereinstimmt. Der Beispielcode lautet wie folgt:

onView(withClassName(endsWith("EditText")))

Hier endet, ist Hamcrest Matcher und gibt Matcher <String> zurück

withHint ()

withHint () akzeptiert ein Argument vom Typ Matcher <String> und das Argument verweist auf den Hinweiswert der Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht anhand des Hinweises der Ansicht entspricht. Der Beispielcode lautet wie folgt:

onView(withClassName(endsWith("Enter name")))

withInputType ()

withInputType () akzeptiert ein Argument vom Typ int und das Argument verweist auf den Eingabetyp der Ansicht. Es wird ein Matcher zurückgegeben, der anhand seines Eingabetyps mit der Ansicht übereinstimmt. Der Beispielcode lautet wie folgt:

onView(withInputType(TYPE_CLASS_DATETIME))

Hier bezieht sich TYPE_CLASS_DATETIME auf die Bearbeitungsansicht, die Datum und Uhrzeit unterstützt.

withResourceName ()

withResourceName () akzeptiert ein Argument vom Typ Matcher <String> und das Argument verweist auf den Klassennamenwert der Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht unter Verwendung des Ressourcennamens der Ansicht entspricht. Der Beispielcode lautet wie folgt:

onView(withResourceName(endsWith("res_name")))

Es akzeptiert auch String-Argumente. Der Beispielcode lautet wie folgt:

onView(withResourceName("my_res_name"))

withAlpha ()

withAlpha () akzeptiert ein Argument vom Typ float und das Argument verweist auf den Alpha-Wert der Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht anhand des Alpha-Werts der Ansicht entspricht. Der Beispielcode lautet wie folgt:

onView(withAlpha(0.8))

withEffectiveVisibility ()

withEffectiveVisibility () akzeptiert ein Argument vom Typ ViewMatchers.Visibility und das Argument verweist auf die effektive Sichtbarkeit der Ansicht. Es wird ein Matcher zurückgegeben, der anhand der Sichtbarkeit der Ansicht mit der Ansicht übereinstimmt. Der Beispielcode lautet wie folgt:

onView(withEffectiveVisibility(withEffectiveVisibility.INVISIBLE))

withSpinnerText ()

withSpinnerText () akzeptiert ein Argument vom Typ Matcher <String> und das Argument verweist auf den Wert der aktuell ausgewählten Ansicht des Spinners. Es wird ein Matcher zurückgegeben, der dem Spinner basierend auf dem toString-Wert des ausgewählten Elements entspricht. Der Beispielcode lautet wie folgt:

onView(withSpinnerText(endsWith("USA")))

Es akzeptiert auch das String-Argument oder die Ressourcen-ID des Strings. Der Beispielcode lautet wie folgt:

onView(withResourceName("USA"))
onView(withResourceName(R.string.res_usa))

withSubstring ()

withSubString () ähnelt withText () , hilft jedoch beim Testen der Teilzeichenfolge des Textwerts der Ansicht.

onView(withSubString("Hello"))

hasLinks ()

hasLinks () hat keine Argumente und gibt einen Matcher zurück, der der Ansicht mit Links entspricht. Dies gilt nur für TextView. Der Beispielcode lautet wie folgt:

onView(allOf(withSubString("Hello"), hasLinks()))

Hier ist allOf ein Hamcrest-Matcher. allOf gibt einen Matcher zurück, der mit allen übergebenen Matchern übereinstimmt. Hier wird er verwendet, um eine Ansicht abzugleichen und um zu überprüfen, ob der Text der Ansicht Links enthält.

hasTextColor ()

hasTextColor () akzeptiert ein einzelnes Argument vom Typ int und das Argument verweist auf die Ressourcen-ID der Farbe. Es wird ein Matcher zurückgegeben, der anhand seiner Farbe mit der Textansicht übereinstimmt . Dies gilt nur für TextView . Der Beispielcode lautet wie folgt:

onView(allOf(withSubString("Hello"), hasTextColor(R.color.Red)))

hasEllipsizedText ()

hasEllipsizedText () hat kein Argument. Es wird ein Matcher zurückgegeben, der mit der Textansicht übereinstimmt, die Langtext enthält und entweder ellipsiert (zuerst .. zehn .. zuletzt) ​​oder abgeschnitten (zuerst…) ist. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_text_view_id), hasEllipsizedText()))

hasMultilineText ()

hasMultilineText () hat kein Argument. Es wird ein Matcher zurückgegeben, der mit der Textansicht übereinstimmt, die einen mehrzeiligen Text enthält. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_test_view_id), hasMultilineText()))

hasBackground ()

hasBackground () akzeptiert ein einzelnes Argument vom Typ int und das Argument verweist auf die Ressourcen-ID der Hintergrundressource. Es wird ein Matcher zurückgegeben, der anhand seiner Hintergrundressourcen mit der Ansicht übereinstimmt. Der Beispielcode lautet wie folgt:

onView(allOf(withId("image"), hasBackground(R.drawable.your_drawable)))

hasErrorText ()

hasErrorText () akzeptiert ein Argument vom Typ Matcher <String> und das Argument verweist auf den Fehlerzeichenfolgenwert der Ansicht (EditText). Es wird ein Matcher zurückgegeben, der der Ansicht mithilfe der Fehlerzeichenfolge der Ansicht entspricht. Dies gilt nur für EditText . Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.editText_name), hasErrorText(is("name is required"))))

Es akzeptiert auch String-Argumente. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.editText_name), hasErrorText("name is required")))

hasImeAction ()

hasImeAction () akzeptiert ein Argument vom Typ Matcher <Integer> und das Argument verweist auf die von der Ansicht (EditText) unterstützten Eingabemethoden. Es wird ein Matcher zurückgegeben, der mit der unterstützten Eingabemethode der Ansicht mit der Ansicht übereinstimmt. Dies gilt nur für EditText . Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.editText_name),
hasImeAction(is(EditorInfo.IME_ACTION_GO))))

Hier ist EditorInfo.IME_ACTION_GO eine der Eingabemethodenoptionen. hasImeAction () akzeptiert auch ganzzahlige Argumente. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.editText_name),
hasImeAction(EditorInfo.IME_ACTION_GO)))

unterstütztInputMethods ()

unterstütztInputMethods () hat kein Argument. Es wird ein Matcher zurückgegeben, der der Ansicht entspricht, wenn Eingabemethoden unterstützt werden. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.editText_name), supportsInputMethods()))

isRoot ()

isRoot () hat kein Argument. Es wird ein Matcher zurückgegeben, der der Stammansicht entspricht. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_root_id), isRoot()))

wird angezeigt()

isDisplayed () hat kein Argument. Es wird ein Matcher zurückgegeben, der der aktuell angezeigten Ansicht entspricht. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), isDisplayed()))

isDisplayingAtLeast ()

isDisplayingAtLeast () akzeptiert ein einzelnes Argument vom Typ int. Es wird ein Matcher zurückgegeben, der mit der aktuell angezeigten Ansicht mindestens dem angegebenen Prozentsatz entspricht. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), isDisplayingAtLeast(75)))

isCompletelyDisplayed ()

isCompletelyDisplayed () hat kein Argument. Es wird ein Matcher zurückgegeben, der der Ansicht entspricht, die derzeit vollständig auf dem Bildschirm angezeigt wird. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), isCompletelyDisplayed()))

aktiviert()

isEnabled () hat kein Argument. Es wird ein Matcher zurückgegeben, der der aktivierten Ansicht entspricht. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), isEnabled()))

isFocusable ()

isFocusable () hat kein Argument. Es wird ein Matcher zurückgegeben, der der Ansicht mit der Fokusoption entspricht. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), isFocusable()))

hasFocus ()

hasFocus () hat kein Argument. Es wird ein Matcher zurückgegeben, der der aktuell fokussierten Ansicht entspricht. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), hasFocus()))

isClickable ()

isClickable () hat kein Argument. Es wird ein Matcher zurückgegeben, der der Ansicht entspricht, bei der es sich um eine Klickoption handelt. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), isClickable()))

ist ausgewählt()

isSelected () hat kein Argument. Es wird ein Matcher zurückgegeben, der der aktuell ausgewählten Ansicht entspricht. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), isSelected()))

wird geprüft()

isChecked () hat kein Argument. Es wird ein Matcher zurückgegeben, der der Ansicht vom Typ CompoundButton (oder Subtyp davon) entspricht und sich im aktivierten Zustand befindet. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), isChecked()))

isNotChecked ()

isNotChecked () ist genau gegenüber von isChecked. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_view_id), isNotChecked()))

isJavascriptEnabled ()

isJavascriptEnabled () hat kein Argument. Es wird ein Matcher zurückgegeben, der mit der WebView übereinstimmt, die JavaScript auswertet. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.my_webview_id), isJavascriptEnabled()))

mit Eltern()

withParent () akzeptiert ein Argument vom Typ Matcher <View>. Das Argument bezieht sich auf eine Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht entspricht, dass die angegebene Ansicht eine übergeordnete Ansicht ist. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.childView), withParent(withId(R.id.parentView))))

hasSibling ()

hasSibling () akzeptiert ein Argument vom Typ Matcher> View <. Das Argument bezieht sich auf eine Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht entspricht, dass die übergebene Ansicht eine der Geschwisteransichten ist. Der Beispielcode lautet wie folgt:

onView(hasSibling(withId(R.id.siblingView)))

mit Kind()

withChild () akzeptiert ein Argument vom Typ Matcher <View>. Das Argument bezieht sich auf eine Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht entspricht, dass die übergebene Ansicht eine untergeordnete Ansicht ist. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.parentView), withChild(withId(R.id.childView))))

hasChildCount ()

hasChildCount () akzeptiert ein Argument vom Typ int. Das Argument bezieht sich auf die untergeordnete Anzahl einer Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht entspricht, die genau die gleiche Anzahl von untergeordneten Ansichten aufweist, wie im Argument angegeben. Der Beispielcode lautet wie folgt:

onView(hasChildCount(4))

hasMinimumChildCount ()

hasMinimumChildCount () akzeptiert ein Argument vom Typ int. Das Argument bezieht sich auf die untergeordnete Anzahl einer Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht entspricht, die mindestens die im Argument angegebene Anzahl der untergeordneten Ansichten enthält. Der Beispielcode lautet wie folgt:

onView(hasMinimumChildCount(4))

hasDescendant ()

hasDescendant () akzeptiert ein Argument vom Typ Matcher <View>. Das Argument bezieht sich auf eine Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht entspricht, dass die übergebene Ansicht eine der untergeordneten Ansichten in der Ansichtshierarchie ist. Der Beispielcode lautet wie folgt:

onView(hasDescendant(withId(R.id.descendantView)))

isDescendantOfA ()

isDescendantOfA () akzeptiert ein Argument vom Typ Matcher <View>. Das Argument bezieht sich auf eine Ansicht. Es wird ein Matcher zurückgegeben, der der Ansicht entspricht, dass die übergebene Ansicht eine der Vorfahrenansichten in der Ansichtshierarchie ist. Der Beispielcode lautet wie folgt:

onView(allOf(withId(R.id.myView), isDescendantOfA(withId(R.id.parentView))))