Espresso Testing Framework - Visualizza Matchers
Il framework Espresso offre molti abbinamenti di visualizzazione. Lo scopo del matcher è quello di abbinare una vista utilizzando diversi attributi della vista come ID, Testo e disponibilità della vista figlia. Ogni matcher corrisponde a un particolare attributo della vista e si applica a un particolare tipo di vista. Ad esempio, withId matcher corrisponde alla proprietà Id della vista e si applica a tutta la vista, mentre withText matcher corrisponde alla proprietà Text della vista e si applica solo a TextView .
In questo capitolo, impariamo i diversi abbinamenti forniti dal framework di test dell'espresso e impariamo la libreria Hamcrest su cui sono costruiti gli abbinatori dell'espresso.
Biblioteca Hamcrest
La libreria Hamcrest è una libreria importante nell'ambito del framework di test espresso. Hamcrest è esso stesso un framework per scrivere oggetti matcher. Il framework Espresso utilizza ampiamente la libreria Hamcrest e la amplia quando necessario per fornire abbinamenti semplici ed estendibili.
Hamcrest fornisce una semplice funzione assertThat e una raccolta di matcher per affermare qualsiasi oggetto. assert Questo ha tre argomenti e sono come mostrato di seguito -
Stringa (descrizione del test, opzionale)
Oggetto (effettivo)
Matcher (previsto)
Scriviamo un semplice esempio per verificare se un oggetto lista ha un valore atteso.
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"));
}
Qui, hasItem restituisce un matcher, che controlla se l'elenco effettivo ha un valore specificato come uno degli elementi.
Hamcrest ha molti matcher integrati e anche opzioni per creare nuovi matcher. Alcuni degli importanti abbinamenti integrati utili nel framework di test dell'espresso sono i seguenti:
qualsiasi cosa - sempre matchers
Abbinamenti basati sulla logica
allOf - accetta un numero qualsiasi di abbinamenti e corrispondenze solo se tutti gli abbinamenti hanno successo.
anyOf - accetta un numero qualsiasi di abbinamenti e corrispondenze se uno di essi ha avuto successo.
not - accetta un matcher e corrisponde solo se il matcher ha fallito e viceversa.
Corrispondenze basate sul testo
equalToIgnoringCase - utilizzato per verificare se l'input effettivo è uguale alla stringa prevista ignorando il caso.
equalToIgnoringWhiteSpace - utilizzato per verificare se l'input effettivo è uguale alla stringa specificata ignorando maiuscole e minuscole e spazi bianchi.
containsString - utilizzato per verificare se l'input effettivo contiene la stringa specificata.
endsWith - utilizzato per verificare se l'input effettivo inizia con la stringa specificata.
startsWith - utilizzato per verificare se l'effettivo input termina con la stringa specificata.
Abbinamenti basati sul numero
closeTo - utilizzato per verificare se l'input effettivo è vicino al numero previsto.
greaterThan - utilizzato per verificare se l'input effettivo è maggiore del numero previsto.
greaterThanOrEqualTo - utilizzato per verificare se l'input effettivo è maggiore o uguale al numero previsto.
lessThan - utilizzato per verificare se l'input effettivo è inferiore al numero previsto.
lessThanOrEqualTo - utilizzato per verificare se l'input effettivo è inferiore o uguale al numero previsto.
Matcher basati su oggetti
equalTo - utilizzato per verificare se l'input effettivo è uguale all'oggetto atteso
hasToString - utilizzato per verificare se l'input effettivo ha il metodo toString.
instanceOf - utilizzato per verificare se l'input effettivo è l'istanza della classe prevista.
isCompatibleType - utilizzato per verificare se l'input effettivo è compatibile con il tipo previsto.
notNullValue - utilizzato per verificare se l'input effettivo non è nullo.
sameInstance - utilizzato per verificare se l'input effettivo e quello atteso sono della stessa istanza.
hasProperty - utilizzato per verificare se l'input effettivo ha la proprietà attesa
è - Zucchero o scorciatoia per uguale a
Matchers
Espresso fornisce il metodo onView () per abbinare e trovare le visualizzazioni. Accetta i matcher della vista e restituisce l'oggetto ViewInteraction per interagire con la vista corrispondente. L'elenco di corrispondenze di visualizzazione utilizzato di frequente è descritto di seguito:
withId ()
withId () accetta un argomento di tipo int e l'argomento fa riferimento all'id della vista. Restituisce un matcher, che corrisponde alla vista utilizzando l'id della vista. Il codice di esempio è il seguente,
onView(withId(R.id.testView))
withText ()
withText () accetta un argomento di tipo stringa e l'argomento fa riferimento al valore della proprietà text della vista. Restituisce un matcher, che corrisponde alla vista utilizzando il valore di testo della vista. Si applica solo a TextView . Il codice di esempio è il seguente,
onView(withText("Hello World!"))
withContentDescription ()
withContentDescription () accetta un argomento di tipo stringa e l'argomento fa riferimento al valore della proprietà di descrizione del contenuto della vista. Restituisce un matcher, che corrisponde alla vista utilizzando la descrizione della vista. Il codice di esempio è il seguente,
onView(withContentDescription("blah"))
Possiamo anche passare l'ID risorsa del valore di testo invece del testo stesso.
onView(withContentDescription(R.id.res_id_blah))
hasContentDescription ()
hasContentDescription () non ha argomenti. Restituisce un matcher, che corrisponde alla visualizzazione che ha una descrizione del contenuto. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_view_id), hasContentDescription()))
withTagKey ()
withTagKey () accetta un argomento di tipo stringa e l'argomento fa riferimento alla chiave del tag della vista. Restituisce un matcher, che corrisponde alla vista utilizzando la sua chiave tag. Il codice di esempio è il seguente,
onView(withTagKey("blah"))
Possiamo anche passare l'ID della risorsa del nome del tag invece del nome del tag stesso.
onView(withTagKey(R.id.res_id_blah))
withTagValue ()
withTagValue () accetta un argomento di tipo Matcher <Object> e l'argomento fa riferimento al valore del tag della vista. Restituisce un matcher, che corrisponde alla vista utilizzando il suo valore di tag. Il codice di esempio è il seguente,
onView(withTagValue(is((Object) "blah")))
Qui, è è Hamcrest matcher.
withClassName ()
withClassName () accetta un argomento di tipo Matcher <String> e l'argomento fa riferimento al valore del nome della classe della vista. Restituisce un matcher, che corrisponde alla vista utilizzando il nome della sua classe. Il codice di esempio è il seguente,
onView(withClassName(endsWith("EditText")))
Qui , endsWith è Hamcrest matcher e return Matcher <String>
withHint ()
withHint () accetta un argomento di tipo Matcher <String> e l'argomento fa riferimento al valore di suggerimento della vista. Restituisce un matcher, che corrisponde alla vista utilizzando il suggerimento della vista. Il codice di esempio è il seguente,
onView(withClassName(endsWith("Enter name")))
withInputType ()
withInputType () accetta un argomento di tipo int e l'argomento fa riferimento al tipo di input della vista. Restituisce un matcher, che corrisponde alla vista usando il suo tipo di input. Il codice di esempio è il seguente,
onView(withInputType(TYPE_CLASS_DATETIME))
Qui, TYPE_CLASS_DATETIME si riferisce a date e orari di supporto della visualizzazione di modifica.
withResourceName ()
withResourceName () accetta un argomento di tipo Matcher <String> e l'argomento fa riferimento al valore del nome della classe della vista. Restituisce un matcher, che corrisponde alla vista utilizzando il nome della risorsa della vista. Il codice di esempio è il seguente,
onView(withResourceName(endsWith("res_name")))
Accetta anche argomenti stringa. Il codice di esempio è il seguente,
onView(withResourceName("my_res_name"))
withAlpha ()
withAlpha () accetta un argomento di tipo float e l'argomento fa riferimento al valore alfa della vista. Restituisce un matcher, che corrisponde alla vista utilizzando il valore alfa della vista. Il codice di esempio è il seguente,
onView(withAlpha(0.8))
withEffectiveVisibility ()
withEffectiveVisibility () accetta un argomento di tipo ViewMatchers.Visibility e l'argomento si riferisce alla visibilità effettiva della vista. Restituisce un matcher, che corrisponde alla vista utilizzando la visibilità della vista. Il codice di esempio è il seguente,
onView(withEffectiveVisibility(withEffectiveVisibility.INVISIBLE))
withSpinnerText ()
withSpinnerText () accetta un argomento di tipo Matcher <String> e l'argomento fa riferimento al valore della vista selezionata corrente dello Spinner. Restituisce un matcher, che corrisponde allo spinner in base al valore toString dell'elemento selezionato. Il codice di esempio è il seguente,
onView(withSpinnerText(endsWith("USA")))
Accetta anche l'argomento stringa o l'ID risorsa della stringa. Il codice di esempio è il seguente,
onView(withResourceName("USA"))
onView(withResourceName(R.string.res_usa))
withSubstring ()
withSubString () è simile a withText () tranne che aiuta a testare la sottostringa del valore di testo della vista.
onView(withSubString("Hello"))
hasLinks ()
hasLinks () non ha argomenti e restituisce un matcher, che corrisponde alla vista che ha collegamenti. Si applica solo a TextView. Il codice di esempio è il seguente,
onView(allOf(withSubString("Hello"), hasLinks()))
Qui, allOf è un matcher di Hamcrest. allOf restituisce un matcher, che corrisponde a tutti i matcher passati e qui, viene utilizzato per abbinare una vista e per controllare se la vista ha collegamenti nel suo valore di testo.
hasTextColor ()
hasTextColor () accetta un singolo argomento di tipo int e l'argomento fa riferimento all'ID risorsa del colore. Restituisce un matcher, che corrisponde al TextView in base al suo colore. Si applica solo a TextView . Il codice di esempio è il seguente,
onView(allOf(withSubString("Hello"), hasTextColor(R.color.Red)))
hasEllipsizedText ()
hasEllipsizedText () non ha argomenti. Restituisce un matcher, che corrisponde al TextView che ha testo lungo e con ellissi (primo .. dieci .. ultimo) o troncato (primo…). Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_text_view_id), hasEllipsizedText()))
hasMultilineText ()
hasMultilineText () non ha argomenti. Restituisce un matcher, che corrisponde al TextView che ha un testo su più righe. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_test_view_id), hasMultilineText()))
hasBackground ()
hasBackground () accetta un singolo argomento di tipo int e l'argomento fa riferimento all'ID risorsa della risorsa in background. Restituisce un matcher, che corrisponde alla visualizzazione in base alle sue risorse in background. Il codice di esempio è il seguente,
onView(allOf(withId("image"), hasBackground(R.drawable.your_drawable)))
hasErrorText ()
hasErrorText () accetta un argomento di tipo Matcher <String> e l'argomento fa riferimento al valore della stringa di errore della vista (EditText). Restituisce un matcher, che corrisponde alla vista utilizzando la stringa di errore della vista. Questo vale solo per EditText . Il codice di esempio è il seguente,
onView(allOf(withId(R.id.editText_name), hasErrorText(is("name is required"))))
Accetta anche argomenti stringa. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.editText_name), hasErrorText("name is required")))
hasImeAction ()
hasImeAction () accetta un argomento di tipo Matcher <Integer> e l'argomento fa riferimento ai metodi di input supportati dalla vista (EditText). Restituisce un matcher, che corrisponde alla vista utilizzando il metodo di input supportato della vista. Questo vale solo per EditText . Il codice di esempio è il seguente,
onView(allOf(withId(R.id.editText_name),
hasImeAction(is(EditorInfo.IME_ACTION_GO))))
Qui, EditorInfo.IME_ACTION_GO è una delle opzioni dei metodi di input. hasImeAction () accetta anche argomenti interi. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.editText_name),
hasImeAction(EditorInfo.IME_ACTION_GO)))
supportsInputMethods ()
supportsInputMethods () non ha argomenti. Restituisce un matcher, che corrisponde alla vista se supporta metodi di input. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.editText_name), supportsInputMethods()))
isRoot ()
isRoot () non ha argomenti. Restituisce un matcher, che corrisponde alla vista root. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_root_id), isRoot()))
È visualizzato()
isDisplayed () non ha argomenti. Restituisce un matcher, che corrisponde alla visualizzazione attualmente visualizzata. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_view_id), isDisplayed()))
isDisplayingAtLeast ()
isDisplayingAtLeast () accetta un singolo argomento di tipo int. Restituisce un matcher, che corrisponde alla visualizzazione attualmente visualizzata almeno per la percentuale specificata. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_view_id), isDisplayingAtLeast(75)))
isCompletelyDisplayed ()
isCompletelyDisplayed () non ha argomenti. Restituisce un matcher, che corrisponde alla visualizzazione attualmente visualizzata completamente sullo schermo. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_view_id), isCompletelyDisplayed()))
è abilitato()
isEnabled () non ha argomenti. Restituisce un matcher, che corrisponde alla visualizzazione abilitata. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_view_id), isEnabled()))
isFocusable ()
isFocusable () non ha argomenti. Restituisce un matcher, che corrisponde alla vista che ha l'opzione focus. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_view_id), isFocusable()))
hasFocus ()
hasFocus () non ha argomenti. Restituisce un matcher, che corrisponde alla visualizzazione attualmente focalizzata. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_view_id), hasFocus()))
isClickable ()
isClickable () non ha argomenti. Restituisce un matcher, che corrisponde alla visualizzazione che è l'opzione clic. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_view_id), isClickable()))
è selezionato()
isSelected () non ha argomenti. Restituisce un matcher, che corrisponde alla visualizzazione attualmente selezionata. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_view_id), isSelected()))
isChecked ()
isChecked () non ha argomenti. Restituisce un matcher, che corrisponde alla vista che è di tipo CompoundButton (o sottotipo di esso) ed è in stato selezionato. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_view_id), isChecked()))
isNotChecked ()
isNotChecked () è esattamente l'opposto di isChecked. Il codice di esempio è il seguente *,
onView(allOf(withId(R.id.my_view_id), isNotChecked()))
isJavascriptEnabled ()
isJavascriptEnabled () non ha argomenti. Restituisce un matcher, che corrisponde al WebView che sta valutando JavaScript. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.my_webview_id), isJavascriptEnabled()))
withParent ()
withParent () accetta un argomento di tipo Matcher <View>. L'argomento fa riferimento a una vista. Restituisce un matcher, che corrisponde alla vista in cui la vista specificata è la vista principale. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.childView), withParent(withId(R.id.parentView))))
hasSibling ()
hasSibling () accetta un argomento di tipo Matcher> View <. L'argomento fa riferimento a una vista. Restituisce un matcher, che corrisponde alla vista che la vista passata è una delle sue viste di pari livello. Il codice di esempio è il seguente,
onView(hasSibling(withId(R.id.siblingView)))
withChild ()
withChild () accetta un argomento di tipo Matcher <View>. L'argomento fa riferimento a una vista. Restituisce un matcher, che corrisponde alla vista che la vista passata è vista figlia. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.parentView), withChild(withId(R.id.childView))))
hasChildCount ()
hasChildCount () accetta un argomento di tipo int. L'argomento fa riferimento al conteggio figlio di una vista. Restituisce un matcher, che corrisponde alla vista che ha esattamente lo stesso numero di viste secondarie specificato nell'argomento. Il codice di esempio è il seguente,
onView(hasChildCount(4))
hasMinimumChildCount ()
hasMinimumChildCount () accetta un argomento di tipo int. L'argomento fa riferimento al conteggio figlio di una vista. Restituisce un matcher, che corrisponde alla vista che ha almeno il numero di viste figlio come specificato nell'argomento. Il codice di esempio è il seguente,
onView(hasMinimumChildCount(4))
hasDescendant ()
hasDescendant () accetta un argomento di tipo Matcher <View>. L'argomento fa riferimento a una vista. Restituisce un matcher, che corrisponde alla vista che la vista passata è una delle viste discendenti nella gerarchia della vista. Il codice di esempio è il seguente,
onView(hasDescendant(withId(R.id.descendantView)))
isDescendantOfA ()
isDescendantOfA () accetta un argomento di tipo Matcher <View>. L'argomento fa riferimento a una vista. Restituisce un matcher, che corrisponde alla vista che la vista passata è una delle viste antenate nella gerarchia della vista. Il codice di esempio è il seguente,
onView(allOf(withId(R.id.myView), isDescendantOfA(withId(R.id.parentView))))