Framework testowania espresso - wyświetl dopasowań

Framework Espresso zapewnia wiele dopasowań widoków. Celem dopasowania jest dopasowanie widoku przy użyciu różnych atrybutów widoku, takich jak identyfikator, tekst i dostępność widoku podrzędnego. Każdy element dopasowujący dopasowuje określone atrybuty widoku i dotyczy określonego typu widoku. Na przykład withId matcher pasuje do właściwości Id widoku i ma zastosowanie do wszystkich widoków, podczas gdy withText dopasowuje właściwość Text widoku i ma zastosowanie tylko do TextView .

W tym rozdziale zapoznajmy się z różnymi dopasowaniami zapewnianymi przez framework testowy espresso, a także poznajmy bibliotekę Hamcrest, na podstawie której zbudowane są dopasowujące espresso.

Biblioteka ścięgien

Biblioteka Hamcrest jest ważną biblioteką w zakresie frameworków do testowania espresso. Hamcrest jest sam w sobie ramą do pisania obiektów dopasowujących. Framework Espresso szeroko wykorzystuje bibliotekę Hamcrest i rozszerza ją, gdy jest to konieczne, w celu zapewnienia prostych i rozszerzalnych dopasowań.

Hamcrest zapewnia prostą funkcję assertThat i zbiór dopasowań do potwierdzenia dowolnych obiektów. assertTo ma trzy argumenty i są one pokazane poniżej -

  • Ciąg (opis testu, opcjonalnie)

  • Obiekt (rzeczywisty)

  • Dopasowanie (oczekiwane)

Napiszmy prosty przykład, aby sprawdzić, czy obiekt listy ma oczekiwaną wartość.

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"));
}

W tym przypadku hasItem zwraca element dopasowujący , który sprawdza, czy rzeczywista lista ma określoną wartość jako jeden z elementów.

Hamcrest ma wiele wbudowanych dopasowań, a także opcje tworzenia nowych dopasowań. Niektóre z ważnych wbudowanych dopasowań przydatnych w ramach testowania espresso są następujące:

wszystko - zawsze dopasowujące

Dopasowania oparte na logice

  • allOf - zaakceptuj dowolną liczbę dopasowań i dopasowań tylko wtedy, gdy wszystkie dopasowania zakończą się sukcesem.

  • anyOf - zaakceptuj dowolną liczbę dopasowań i dopasowań, jeśli którykolwiek z dopasowań się powiódł.

  • not - zaakceptuj jednego dopasowywania i dopasowuje tylko wtedy, gdy dopasowanie się nie powiodło i odwrotnie

Dopasowania tekstowe

  • equalToIgnoringCase - służy do sprawdzania, czy rzeczywiste dane wejściowe są zgodne z oczekiwanym ciągiem znaków, ignorując wielkość liter.

  • equalToIgnoringWhiteSpace - służy do sprawdzania, czy rzeczywiste dane wejściowe są zgodne z podanym ciągiem znaków, ignorując wielkość liter i spacje.

  • containsString - służy do testowania, czy rzeczywiste wejście zawiera określony ciąg.

  • endsWith - służy do testowania, czy rzeczywiste wejście zaczyna się od określonego ciągu.

  • startsWith - służy do testowania, czy rzeczywiste wejście kończy się podanym ciągiem.

Dopasowania oparte na liczbach

  • closeTo - służy do sprawdzania, czy rzeczywiste dane wejściowe są zbliżone do oczekiwanej liczby.

  • greaterThan - służy do sprawdzania, czy rzeczywiste dane wejściowe są większe niż oczekiwana liczba.

  • greaterThanOrEqualTo - służy do sprawdzania, czy rzeczywiste dane wejściowe są większe lub równe oczekiwanej liczbie.

  • lessThan - służy do sprawdzania, czy rzeczywiste dane wejściowe są mniejsze niż oczekiwana liczba.

  • lessThanOrEqualTo - służy do sprawdzania, czy rzeczywiste dane wejściowe są mniejsze lub równe oczekiwanej liczbie.

Dopasowywanie obiektów oparte na obiektach

  • equalTo - służy do testowania, czy rzeczywiste wejście jest równe oczekiwanemu obiektowi

  • hasToString - służy do testowania, czy rzeczywiste dane wejściowe mają metodę toString.

  • instanceOf - służy do sprawdzania, czy rzeczywiste dane wejściowe są instancją oczekiwanej klasy.

  • isCompatibleType - służy do testowania, czy rzeczywiste wejście jest zgodne z oczekiwanym typem.

  • notNullValue - służy do testowania, czy rzeczywiste dane wejściowe nie są zerowe.

  • sameInstance - służy do sprawdzania, czy rzeczywiste dane wejściowe i oczekiwane mają tę samą instancję.

  • hasProperty - służy do sprawdzania, czy rzeczywiste dane wejściowe mają oczekiwaną właściwość

is - Sugar lub skrót na equalTo

Dopasowani

Espresso udostępnia metodę onView () do dopasowywania i znajdowania widoków. Akceptuje dopasowania widoku i zwraca obiekt ViewInteraction do interakcji z dopasowanym widokiem. Często używaną listę dopasowań widoków opisano poniżej -

withId ()

withId () przyjmuje argument typu int, a argument odwołuje się do id widoku. Zwraca dopasowanie, które dopasowuje widok przy użyciu identyfikatora widoku. Przykładowy kod jest następujący:

onView(withId(R.id.testView))

withText ()

withText () przyjmuje argument typu string, a argument odwołuje się do wartości właściwości text widoku. Zwraca dopasowanie, które dopasowuje widok przy użyciu wartości tekstowej widoku. Dotyczy tylko TextView . Przykładowy kod jest następujący:

onView(withText("Hello World!"))

withContentDescription ()

withContentDescription () przyjmuje argument typu string, a argument odwołuje się do wartości właściwości opisu zawartości widoku. Zwraca dopasowanie, które dopasowuje widok przy użyciu opisu widoku. Przykładowy kod jest następujący:

onView(withContentDescription("blah"))

Możemy również przekazać identyfikator zasobu wartości tekstowej zamiast samego tekstu.

onView(withContentDescription(R.id.res_id_blah))

hasContentDescription ()

hasContentDescription () nie ma argumentu. Zwraca dopasowanie, które pasuje do widoku, który ma dowolny opis zawartości. Przykładowy kod jest następujący:

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

withTagKey ()

withTagKey () przyjmuje argument typu string, a argument odwołuje się do klucza tagu widoku. Zwraca dopasowanie, które dopasowuje widok za pomocą jego klucza tagu. Przykładowy kod jest następujący:

onView(withTagKey("blah"))

Możemy również przekazać identyfikator zasobu nazwy tagu zamiast samej nazwy tagu.

onView(withTagKey(R.id.res_id_blah))

withTagValue ()

withTagValue () przyjmuje argument typu Matcher <Object>, a argument odwołuje się do wartości znacznika widoku. Zwraca dopasowanie, które dopasowuje widok za pomocą wartości jego tagu. Przykładowy kod jest następujący:

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

Tutaj jest to Hamcrest dopasowujący.

withClassName ()

withClassName () przyjmuje argument typu Matcher <String>, a argument odwołuje się do wartości nazwy klasy widoku. Zwraca element dopasowujący, który dopasowuje widok przy użyciu nazwy jego klasy. Przykładowy kod jest następujący:

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

Tutaj endWith jest dopasowaniem Hamcrest i zwraca Matcher <String>

withHint ()

withHint () przyjmuje argument typu Matcher <String>, a argument odwołuje się do wartości wskazówki widoku. Zwraca dopasowanie, które dopasowuje widok za pomocą podpowiedzi widoku. Przykładowy kod jest następujący:

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

withInputType ()

withInputType () przyjmuje argument typu int, a argument odwołuje się do typu wejściowego widoku. Zwraca element dopasowujący, który dopasowuje widok za pomocą jego typu wejściowego. Przykładowy kod jest następujący:

onView(withInputType(TYPE_CLASS_DATETIME))

Tutaj TYPE_CLASS_DATETIME odnosi się do widoku edycji obsługującego daty i godziny.

withResourceName ()

withResourceName () przyjmuje argument typu Matcher <String>, a argument odwołuje się do wartości nazwy klasy widoku. Zwraca dopasowanie, które dopasowuje widok przy użyciu nazwy zasobu widoku. Przykładowy kod jest następujący:

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

Akceptuje również argument w postaci łańcucha. Przykładowy kod jest następujący:

onView(withResourceName("my_res_name"))

withAlpha ()

withAlpha () przyjmuje argument typu float, a argument odwołuje się do wartości alfa widoku. Zwraca dopasowanie, które dopasowuje widok przy użyciu wartości alfa widoku. Przykładowy kod jest następujący:

onView(withAlpha(0.8))

withEffectiveVisibility ()

withEffectiveVisibility () przyjmuje argument typu ViewMatchers.Visibility, a argument odwołuje się do efektywnej widoczności widoku. Zwraca dopasowanie, które dopasowuje widok przy użyciu widoczności widoku. Przykładowy kod jest następujący:

onView(withEffectiveVisibility(withEffectiveVisibility.INVISIBLE))

withSpinnerText ()

withSpinnerText () przyjmuje argument typu Matcher <String>, a argument odwołuje się do aktualnie wybranej wartości widoku Spinner. Zwraca dopasowywanie, które dopasowuje spinner na podstawie wartości toString wybranego elementu. Przykładowy kod jest następujący:

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

Akceptuje również argument ciągu lub identyfikator zasobu łańcucha. Przykładowy kod jest następujący:

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

withSubstring ()

withSubString () jest podobne do withText (), z wyjątkiem tego, że pomaga w testowaniu podłańcucha wartości tekstowej widoku.

onView(withSubString("Hello"))

hasLinks ()

hasLinks () nie ma argumentów i zwraca element dopasowujący, który pasuje do widoku zawierającego linki. Dotyczy tylko TextView. Przykładowy kod jest następujący:

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

Tutaj allOf jest dopasowaniem Hamcrest. allOf zwraca element dopasowujący, który pasuje do wszystkich przekazanych w dopasowaniach i tutaj jest używany do dopasowania widoku, a także do sprawdzenia, czy widok ma linki w swojej wartości tekstowej.

hasTextColor ()

hasTextColor () przyjmuje pojedynczy argument typu int, a argument odwołuje się do identyfikatora zasobu koloru. Zwraca dopasowywanie, które dopasowuje TextView na podstawie jego koloru. Dotyczy tylko TextView . Przykładowy kod jest następujący:

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

hasEllipsizedText ()

hasEllipsizedText () nie ma argumentu. Zwraca element dopasowujący, który pasuje do TextView, który ma długi tekst i jest elipsy (pierwsza… dziesiątka… ostatnia) lub obcięta (pierwsza…). Przykładowy kod jest następujący:

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

hasMultilineText ()

hasMultilineText () nie ma argumentu. Zwraca dopasowanie, które pasuje do TextView, który ma dowolny tekst wieloliniowy. Przykładowy kod jest następujący:

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

hasBackground ()

hasBackground () przyjmuje pojedynczy argument typu int, a argument odwołuje się do identyfikatora zasobu tła. Zwraca dopasowanie, które dopasowuje widok na podstawie jego zasobów w tle. Przykładowy kod jest następujący:

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

hasErrorText ()

hasErrorText () przyjmuje argument typu Matcher <String>, a argument ten odnosi się do wartości ciągu błędu widoku (EditText). Zwraca element dopasowujący, który dopasowuje widok przy użyciu ciągu błędu widoku. Dotyczy to tylko EditText . Przykładowy kod jest następujący:

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

Akceptuje również argument w postaci łańcucha. Przykładowy kod jest następujący:

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

hasImeAction ()

hasImeAction () przyjmuje argument typu Matcher <Integer>, a argument odwołuje się do obsługiwanych metod wejściowych widoku (EditText). Zwraca element dopasowujący, który dopasowuje widok przy użyciu obsługiwanej metody wprowadzania widoku. Dotyczy to tylko EditText . Przykładowy kod jest następujący:

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

Tutaj EditorInfo.IME_ACTION_GO jest jedną z opcji metod wprowadzania. hasImeAction () akceptuje również argument będący liczbą całkowitą. Przykładowy kod jest następujący:

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

supportInputMethods ()

SupportInputMethods () nie ma argumentu. Zwraca element dopasowujący, który pasuje do widoku, jeśli obsługuje metody wprowadzania. Przykładowy kod jest następujący:

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

isRoot ()

isRoot () nie ma argumentu. Zwraca dopasowanie, które pasuje do widoku głównego. Przykładowy kod jest następujący:

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

isDisplayed ()

isDisplayed () nie ma argumentu. Zwraca dopasowanie, które pasuje do widoku, który jest aktualnie wyświetlany. Przykładowy kod jest następujący:

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

isDisplayingAtLeast ()

isDisplayingAtLeast () przyjmuje pojedynczy argument typu int. Zwraca dopasowanie, które pasuje do aktualnie wyświetlanych widoków, co najmniej w określonym procencie. Przykładowy kod jest następujący:

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

isCompletelyDisplayed ()

isCompletelyDisplayed () nie ma argumentu. Zwraca dopasowanie, które pasuje do widoku, który jest aktualnie wyświetlany w całości na ekranie. Przykładowy kod jest następujący:

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

jest włączony()

isEnabled () nie ma argumentu. Zwraca dopasowanie, które pasuje do włączonego widoku. Przykładowy kod jest następujący:

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

isFocusable ()

isFocusable () nie ma argumentu. Zwraca dopasowanie, które pasuje do widoku, który ma opcję fokusu. Przykładowy kod jest następujący:

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

hasFocus ()

hasFocus () nie ma argumentu. Zwraca dopasowanie, które pasuje do widoku, na którym aktualnie jest fokus. Przykładowy kod jest następujący:

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

isClickable ()

isClickable () nie ma argumentu. Zwraca dopasowanie, które pasuje do widoku, który jest opcją kliknięcia. Przykładowy kod jest następujący:

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

jest zaznaczony()

isSelected () nie ma argumentu. Zwraca dopasowanie, które pasuje do aktualnie wybranego widoku. Przykładowy kod jest następujący:

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

sprawdzone()

isChecked () nie ma argumentu. Zwraca element dopasowujący, który pasuje do widoku typu CompoundButton (lub jego podtypu) i jest w stanie zaznaczenia. Przykładowy kod jest następujący:

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

isNotChecked ()

isNotChecked () jest przeciwieństwem isChecked. Przykładowy kod jest następujący *:

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

isJavascriptEnabled ()

isJavascriptEnabled () nie ma argumentu. Zwraca element dopasowujący, który pasuje do WebView, który ocenia JavaScript. Przykładowy kod jest następujący:

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

z rodzicem()

withParent () akceptuje jeden argument typu Matcher <View>. Argument odnosi się do poglądu. Zwraca dopasowanie, które pasuje do widoku, którego określony widok jest widokiem nadrzędnym. Przykładowy kod jest następujący:

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

hasSibling ()

hasSibling () akceptuje jeden argument typu Matcher> View <. Argument odnosi się do poglądu. Zwraca element dopasowujący, który pasuje do widoku, którego przekazany widok jest jednym z jego widoków siostrzanych. Przykładowy kod jest następujący:

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

z dzieckiem()

withChild () przyjmuje jeden argument typu Matcher <View>. Argument odnosi się do poglądu. Zwraca element dopasowujący, który pasuje do widoku, którego przekazany widok jest widokiem podrzędnym. Przykładowy kod jest następujący:

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

hasChildCount ()

hasChildCount () przyjmuje jeden argument typu int. Argument odnosi się do liczby potomków widoku. Zwraca dopasowanie, które pasuje do widoku, który ma dokładnie taką samą liczbę widoków podrzędnych, jak określono w argumencie. Przykładowy kod jest następujący:

onView(hasChildCount(4))

hasMinimumChildCount ()

hasMinimumChildCount () przyjmuje jeden argument typu int. Argument odnosi się do liczby potomków widoku. Zwraca element dopasowujący, który pasuje do widoku, który ma co najmniej liczbę widoków potomnych podaną w argumencie. Przykładowy kod jest następujący:

onView(hasMinimumChildCount(4))

hasDescendant ()

hasDescendant () akceptuje jeden argument typu Matcher <View>. Argument odnosi się do poglądu. Zwraca element dopasowujący, który pasuje do widoku, którego przekazany widok jest jednym z widoków podrzędnych w hierarchii widoków. Przykładowy kod jest następujący:

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

isDescendantOfA ()

isDescendantOfA () przyjmuje jeden argument typu Matcher <View>. Argument odnosi się do poglądu. Zwraca element dopasowujący, który pasuje do widoku, do którego przekazany widok jest jednym z widoków nadrzędnych w hierarchii widoków. Przykładowy kod jest następujący:

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