Marco de prueba de Espresso: ver comparadores

El marco de Espresso proporciona muchos comparadores de vistas. El propósito del comparador es hacer coincidir una vista usando diferentes atributos de la vista como Id, Texto y disponibilidad de la vista secundaria. Cada comparador coincide con un atributo particular de la vista y se aplica a un tipo particular de vista. Por ejemplo, withId matcher coincide con la propiedad Id de la vista y se aplica a todas las vistas, mientras que withText matcher coincide con la propiedad Text de la vista y se aplica solo a TextView .

En este capítulo, aprendamos los diferentes matchers proporcionados por el marco de prueba de espresso, así como la biblioteca de Hamcrest sobre la que se construyen los matchers de espresso.

Biblioteca Hamcrest

La biblioteca Hamcrest es una biblioteca importante en el ámbito del marco de prueba de espresso. Hamcrest es en sí mismo un marco para escribir objetos de comparación. Espresso framework utiliza ampliamente la biblioteca Hamcrest y la amplía siempre que sea necesario para proporcionar comparadores simples y extensibles.

Hamcrest proporciona una función simple assertThat y una colección de comparadores para afirmar cualquier objeto. asertThat tiene tres argumentos y son los que se muestran a continuación:

  • Cadena (descripción de la prueba, opcional)

  • Objeto (real)

  • Matcher (esperado)

Escribamos un ejemplo simple para probar si un objeto de lista tiene un valor esperado.

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

Aquí, hasItem devuelve un comparador, que verifica si la lista real tiene un valor especificado como uno de los elementos.

Hamcrest tiene muchos igualadores incorporados y también opciones para crear nuevos igualadores. Algunos de los matchers incorporados importantes útiles en el marco de prueba de espresso son los siguientes:

cualquier cosa - siempre coincidentes

Emparejadores basados ​​en lógica

  • allOf - Acepte cualquier número de igualadores y coincidencias solo si todos los igualadores son exitosos.

  • anyOf - aceptar cualquier número de comparadores y coincidencias si alguno de los comparadores tuvo éxito.

  • not - acepta un emparejador y coincide solo si el emparejador falló y viceversa.

Comparadores basados ​​en texto

  • equalToIgnoringCase - utilizado para probar si la entrada real es igual a la cadena esperada ignorando el caso.

  • equalToIgnoringWhiteSpace - utilizado para probar si la entrada real es igual a la cadena especificada ignorando el caso y los espacios en blanco.

  • containsString : Se utiliza para probar si la entrada real contiene una cadena especificada.

  • endsWith - utilizado para probar si la entrada real comienza con una cadena especificada.

  • startsWith : Se utiliza para probar si la entrada finaliza con la cadena especificada.

Comparadores basados ​​en números

  • closeTo - utilizado para probar si la entrada real está cerca del número esperado.

  • greaterThan - utilizado para probar si la entrada real es mayor que el número esperado.

  • greaterThanOrEqualTo - se utiliza para probar si la entrada real es mayor o igual que el número esperado.

  • lessThan - utilizado para probar si la entrada real es menor que el número esperado.

  • lessThanOrEqualTo - utilizado para probar si la entrada real es menor o igual que el número esperado.

Comparadores basados ​​en objetos

  • equalTo - utilizado para probar si la entrada real es igual al objeto esperado

  • hasToString - utilizado para probar si la entrada real tiene el método toString.

  • instanceOf - utilizado para probar si la entrada real es la instancia de la clase esperada.

  • isCompatibleType - utilizado para probar si la entrada real es compatible con el tipo esperado.

  • notNullValue - utilizado para probar si la entrada real no es nula.

  • sameInstance - utilizado para probar si la entrada real y la esperada son de la misma instancia.

  • hasProperty - utilizado para probar si la entrada real tiene la propiedad esperada

es - Azúcar o atajo para equalTo

Matchers

Espresso proporciona el método onView () para hacer coincidir y encontrar las vistas. Acepta comparadores de vista y devuelve el objeto ViewInteraction para interactuar con la vista coincidente. La lista de comparadores de vistas de uso frecuente se describe a continuación:

withId ()

withId () acepta un argumento de tipo int y el argumento se refiere al id de la vista. Devuelve un comparador, que coincide con la vista utilizando el id de la vista. El código de muestra es el siguiente,

onView(withId(R.id.testView))

withText ()

withText () acepta un argumento de tipo cadena y el argumento se refiere al valor de la propiedad de texto de la vista. Devuelve un comparador, que coincide con la vista utilizando el valor de texto de la vista. Se aplica solo a TextView . El código de muestra es el siguiente,

onView(withText("Hello World!"))

withContentDescription ()

withContentDescription () acepta un argumento de tipo cadena y el argumento hace referencia al valor de la propiedad de descripción del contenido de la vista. Devuelve un comparador, que coincide con la vista utilizando la descripción de la vista. El código de muestra es el siguiente,

onView(withContentDescription("blah"))

También podemos pasar la identificación del recurso del valor del texto en lugar del texto en sí.

onView(withContentDescription(R.id.res_id_blah))

hasContentDescription ()

hasContentDescription () no tiene argumento. Devuelve un comparador, que coincide con la vista que tiene cualquier descripción de contenido. El código de muestra es el siguiente,

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

withTagKey ()

withTagKey () acepta un argumento de tipo cadena y el argumento se refiere a la clave de etiqueta de la vista. Devuelve un comparador, que coincide con la vista usando su clave de etiqueta. El código de muestra es el siguiente,

onView(withTagKey("blah"))

También podemos pasar el ID de recurso del nombre de la etiqueta en lugar del nombre de la etiqueta en sí.

onView(withTagKey(R.id.res_id_blah))

withTagValue ()

withTagValue () acepta un argumento de tipo Matcher <Object> y el argumento se refiere al valor de la etiqueta de la vista. Devuelve un comparador, que coincide con la vista utilizando su valor de etiqueta. El código de muestra es el siguiente,

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

En este caso, es que es Hamcrest de coincidencias.

withClassName ()

withClassName () acepta un argumento de tipo Matcher <String> y el argumento se refiere al valor del nombre de clase de la vista. Devuelve un comparador, que coincide con la vista usando su nombre de clase. El código de muestra es el siguiente,

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

Aquí, termina con Hamcrest Matcher y devuelve Matcher <String>

withHint ()

withHint () acepta un argumento de tipo Matcher <String> y el argumento hace referencia al valor de sugerencia de la vista. Devuelve un comparador, que coincide con la vista utilizando la sugerencia de la vista. El código de muestra es el siguiente,

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

withInputType ()

withInputType () acepta un argumento de tipo int y el argumento se refiere al tipo de entrada de la vista. Devuelve un comparador, que coincide con la vista utilizando su tipo de entrada. El código de muestra es el siguiente,

onView(withInputType(TYPE_CLASS_DATETIME))

Aquí, TYPE_CLASS_DATETIME se refiere a la vista de edición que admite fechas y horas.

withResourceName ()

withResourceName () acepta un argumento de tipo Matcher <String> y el argumento se refiere al valor del nombre de clase de la vista. Devuelve un comparador, que coincide con la vista utilizando el nombre de recurso de la vista. El código de muestra es el siguiente,

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

También acepta argumentos de cadena. El código de muestra es el siguiente,

onView(withResourceName("my_res_name"))

withAlpha ()

withAlpha () acepta un argumento de tipo float y el argumento se refiere al valor alfa de la vista. Devuelve un comparador, que coincide con la vista utilizando el valor alfa de la vista. El código de muestra es el siguiente,

onView(withAlpha(0.8))

withEffectiveVisibility ()

withEffectiveVisibility () acepta un argumento de tipo ViewMatchers.Visibility y el argumento se refiere a la visibilidad efectiva de la vista. Devuelve un comparador, que coincide con la vista utilizando la visibilidad de la vista. El código de muestra es el siguiente,

onView(withEffectiveVisibility(withEffectiveVisibility.INVISIBLE))

withSpinnerText ()

withSpinnerText () acepta un argumento de tipo Matcher <String> y el argumento se refiere al valor actual de la vista seleccionada del Spinner. Devuelve un matcher, que coincide con el spinner en función del valor toString del elemento seleccionado. El código de muestra es el siguiente,

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

También acepta el argumento de cadena o la identificación de recurso de la cadena. El código de muestra es el siguiente,

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

withSubstring ()

withSubString () es similar a withText () excepto que ayuda a probar la subcadena del valor de texto de la vista.

onView(withSubString("Hello"))

hasLinks ()

hasLinks () no tiene argumentos y devuelve un comparador, que coincide con la vista que tiene enlaces. Se aplica solo a TextView. El código de muestra es el siguiente,

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

Aquí, allOf es un comparador de Hamcrest. allOf devuelve un comparador, que coincide con todos los comparadores pasados ​​y, aquí, se usa para hacer coincidir una vista, así como para verificar si la vista tiene enlaces en su valor de texto.

hasTextColor ()

hasTextColor () acepta un solo argumento de tipo int y el argumento se refiere al ID de recurso del color. Devuelve un matcher, que coincide con TextView en función de su color. Se aplica solo a TextView . El código de muestra es el siguiente,

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

hasEllipsizedText ()

hasEllipsizedText () no tiene argumento. Devuelve un comparador, que coincide con el TextView que tiene texto largo y elipsizado (primero ... diez ... último) o cortado (primero ...). El código de muestra es el siguiente,

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

hasMultilineText ()

hasMultilineText () no tiene argumento. Devuelve un comparador, que coincide con el TextView que tiene texto de varias líneas. El código de muestra es el siguiente,

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

hasBackground ()

hasBackground () acepta un solo argumento de tipo int y el argumento hace referencia al ID de recurso del recurso de fondo. Devuelve un comparador, que coincide con la vista en función de sus recursos de fondo. El código de muestra es el siguiente,

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

hasErrorText ()

hasErrorText () acepta un argumento de tipo Matcher <String> y el argumento hace referencia al valor de la cadena de error de la vista (EditText). Devuelve un comparador, que coincide con la vista utilizando la cadena de error de la vista. Esto se aplica solo a EditText . El código de muestra es el siguiente,

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

También acepta argumentos de cadena. El código de muestra es el siguiente,

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

hasImeAction ()

hasImeAction () acepta un argumento de tipo Matcher <Integer> y el argumento hace referencia a los métodos de entrada admitidos por la vista (EditText). Devuelve un comparador, que coincide con la vista utilizando el método de entrada admitido de la vista. Esto se aplica solo a EditText . El código de muestra es el siguiente,

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

Aquí, EditorInfo.IME_ACTION_GO es una de las opciones de métodos de entrada. hasImeAction () también acepta argumentos enteros. El código de muestra es el siguiente,

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

supportsInputMethods ()

supportsInputMethods () no tiene argumento. Devuelve un comparador, que coincide con la vista si admite métodos de entrada. El código de muestra es el siguiente,

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

isRoot ()

isRoot () no tiene argumento. Devuelve un comparador, que coincide con la vista raíz. El código de muestra es el siguiente,

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

se visualiza()

isDisplayed () no tiene argumento. Devuelve un comparador, que coincide con la vista que se muestra actualmente. El código de muestra es el siguiente,

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

isDisplayingAtLeast ()

isDisplayingAtLeast () acepta un solo argumento de tipo int. Devuelve un comparador, que coincide con la vista que se muestra actualmente al menos el porcentaje especificado. El código de muestra es el siguiente,

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

isCompletelyDisplayed ()

isCompletelyDisplayed () no tiene argumento. Devuelve un comparador, que coincide con la vista que se muestra actualmente completamente en la pantalla. El código de muestra es el siguiente,

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

está habilitado()

isEnabled () no tiene argumento. Devuelve un comparador, que coincide con la vista que está habilitada. El código de muestra es el siguiente,

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

isFocusable ()

isFocusable () no tiene argumento. Devuelve un comparador, que coincide con la vista que tiene la opción de enfoque. El código de muestra es el siguiente,

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

hasFocus ()

hasFocus () no tiene argumento. Devuelve un comparador, que coincide con la vista que está enfocada actualmente. El código de muestra es el siguiente,

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

isClickable ()

isClickable () no tiene argumento. Devuelve un comparador, que coincide con la vista que es la opción de clic. El código de muestra es el siguiente,

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

isSelected ()

isSelected () no tiene argumento. Devuelve un comparador, que coincide con la vista que está seleccionada actualmente. El código de muestra es el siguiente,

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

está chequeado()

isChecked () no tiene argumento. Devuelve un comparador, que coincide con la vista que es de tipo CompoundButton (o subtipo) y está en estado marcado. El código de muestra es el siguiente,

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

isNotChecked ()

isNotChecked () es justo lo opuesto a isChecked. El código de muestra es el siguiente *

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

isJavascriptEnabled ()

isJavascriptEnabled () no tiene argumento. Devuelve un comparador, que coincide con WebView que evalúa JavaScript. El código de muestra es el siguiente,

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

con los padres()

withParent () acepta un argumento de tipo Matcher <View>. El argumento se refiere a una vista. Devuelve un comparador, que coincide con la vista que la vista especificada es la vista principal. El código de muestra es el siguiente,

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

hasSibling ()

hasSibling () acepta un argumento de tipo Matcher> View <. El argumento se refiere a una vista. Devuelve un comparador, que coincide con la vista que la vista pasada es una de sus vistas hermanas. El código de muestra es el siguiente,

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

con niño()

withChild () acepta un argumento de tipo Matcher <View>. El argumento se refiere a una vista. Devuelve un comparador, que coincide con la vista que la vista pasada es vista secundaria. El código de muestra es el siguiente,

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

hasChildCount ()

hasChildCount () acepta un argumento de tipo int. El argumento se refiere al recuento secundario de una vista. Devuelve un comparador, que coincide con la vista que tiene exactamente el mismo número de vista secundaria que se especifica en el argumento. El código de muestra es el siguiente,

onView(hasChildCount(4))

hasMinimumChildCount ()

hasMinimumChildCount () acepta un argumento de tipo int. El argumento se refiere al recuento secundario de una vista. Devuelve un comparador, que coincide con la vista que tiene al menos el número de vistas secundarias como se especifica en el argumento. El código de muestra es el siguiente,

onView(hasMinimumChildCount(4))

hasDescendant ()

hasDescendant () acepta un argumento de tipo Matcher <View>. El argumento se refiere a una vista. Devuelve un comparador, que coincide con la vista que la vista pasada es una de las vistas descendientes en la jerarquía de vistas. El código de muestra es el siguiente,

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

isDescendantOfA ()

isDescendantOfA () acepta un argumento de tipo Matcher <View>. El argumento se refiere a una vista. Devuelve un comparador, que coincide con la vista que la vista pasada es una de las vistas anteriores en la jerarquía de vistas. El código de muestra es el siguiente,

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