Espresso Testing Framework - Exibir correspondências

A estrutura do Espresso oferece muitos matchers de visualização. O objetivo do matcher é combinar uma visão usando diferentes atributos da visão como Id, Texto e disponibilidade de visão filha. Cada matcher corresponde a atributos específicos da visualização e se aplica a um tipo específico de visualização. Por exemplo, withId matcher corresponde à propriedade Id da visualização e se aplica a todas as visualizações, enquanto withText matcher corresponde à propriedade Text da visualização e se aplica apenas a TextView .

Neste capítulo, vamos aprender os diferentes matchers fornecidos pela estrutura de teste do espresso, bem como aprender a biblioteca Hamcrest na qual os matchers do espresso são construídos.

Biblioteca Hamcrest

A biblioteca Hamcrest é uma biblioteca importante no escopo da estrutura de teste do espresso. O próprio Hamcrest é uma estrutura para escrever objetos correspondentes. A estrutura do Espresso usa extensivamente a biblioteca Hamcrest e a estende sempre que necessário para fornecer correspondências simples e extensíveis.

Hamcrest fornece uma função simples assertThat e uma coleção de matchers para afirmar qualquer objeto. assertThat tem três argumentos e eles são mostrados abaixo -

  • String (descrição do teste, opcional)

  • Objeto (real)

  • Matcher (esperado)

Vamos escrever um exemplo simples para testar se um objeto de lista tem 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"));
}

Aqui, hasItem retorna um matcher, que verifica se a lista real especificou o valor como um dos itens.

O Hamcrest tem muitos combinadores integrados e também opções para criar novos combinadores. Alguns dos matchers integrados importantes úteis na estrutura de teste do espresso são os seguintes -

qualquer coisa - sempre combinando

Matchers baseados em lógica

  • allOf - aceitar qualquer número de matchers e correspondências apenas se todos os matchers forem bem-sucedidos.

  • anyOf - aceita qualquer número de matchers e correspondências se qualquer matcher tiver sucesso.

  • not - aceita um matcher e combina somente se o matcher falhou e vice-versa.

Matchers baseados em texto

  • equalToIgnoringCase - usado para testar se a entrada real é igual à string esperada, ignorando maiúsculas e minúsculas.

  • equalToIgnoringWhiteSpace - usado para testar se a entrada real é igual à string especificada, ignorando maiúsculas e minúsculas e espaços em branco.

  • containsString - usado para testar se a entrada real contém a string especificada.

  • endsWith - usado para testar se a entrada real começa com a string especificada.

  • startsWith - usado para testar se a entrada real termina com a string especificada.

Matchers baseados em números

  • closeTo - usado para testar se a entrada real está próxima do número esperado.

  • greaterThan - usado para testar se a entrada real é maior do que o número esperado.

  • greaterThanOrEqualTo - usado para testar se a entrada real é maior ou igual ao número esperado.

  • lessThan - usado para testar se a entrada real é menor que o número esperado.

  • lessThanOrEqualTo - usado para testar se a entrada real é menor ou igual ao número esperado.

Matchers baseados em objetos

  • equalTo - usado para testar se a entrada real é igual ao objeto esperado

  • hasToString - usado para testar se a entrada real tem o método toString.

  • instanceOf - usado para testar se a entrada real é a instância da classe esperada.

  • isCompatibleType - usado para testar se a entrada real é compatível com o tipo esperado.

  • notNullValue - usado para testar se a entrada real não é nula.

  • sameInstance - usado para testar se a entrada real e a esperada são da mesma instância.

  • hasProperty - usado para testar se a entrada real tem a propriedade esperada

is - Sugar ou atalho para equalTo

Matchers

O Espresso fornece o método onView () para corresponder e localizar as visualizações. Ele aceita correspondências de exibição e retorna o objeto ViewInteraction para interagir com a exibição correspondida. A lista frequentemente usada de matchers de visualização é descrita abaixo -

withId ()

withId () aceita um argumento do tipo int e o argumento se refere ao id da visão. Ele retorna um matcher, que corresponde à visão usando o id da visão. O código de amostra é o seguinte,

onView(withId(R.id.testView))

withText ()

withText () aceita um argumento do tipo string e o argumento refere-se ao valor da propriedade de texto da visualização. Ele retorna um matcher, que corresponde à visão usando o valor de texto da visão. Aplica-se apenas a TextView . O código de amostra é o seguinte,

onView(withText("Hello World!"))

withContentDescription ()

withContentDescription () aceita um argumento do tipo string e o argumento refere-se ao valor da propriedade de descrição do conteúdo da visualização. Ele retorna um matcher, que corresponde à visão usando a descrição da visão. O código de amostra é o seguinte,

onView(withContentDescription("blah"))

Também podemos passar o id do recurso do valor do texto em vez do próprio texto.

onView(withContentDescription(R.id.res_id_blah))

hasContentDescription ()

hasContentDescription () não tem argumento. Ele retorna um matcher, que corresponde à visualização que possui qualquer descrição de conteúdo. O código de amostra é o seguinte,

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

withTagKey ()

withTagKey () aceita um argumento do tipo string e o argumento se refere à chave de tag da visualização. Ele retorna um matcher, que corresponde à visualização usando sua chave de tag. O código de amostra é o seguinte,

onView(withTagKey("blah"))

Também podemos passar a id do recurso do nome da tag em vez do próprio nome da tag.

onView(withTagKey(R.id.res_id_blah))

withTagValue ()

withTagValue () aceita um argumento do tipo Matcher <Object> e o argumento se refere ao valor da tag da visualização. Ele retorna um matcher, que corresponde à visualização usando seu valor de tag. O código de amostra é o seguinte,

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

Aqui está o matcher de Hamcrest.

withClassName ()

withClassName () aceita um argumento do tipo Matcher <String> e o argumento se refere ao valor do nome da classe da visualização. Ele retorna um matcher, que corresponde à visualização usando seu nome de classe. O código de amostra é o seguinte,

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

Aqui, endsWith é o matcher Hamcrest e Return Matcher <String>

withHint ()

withHint () aceita um argumento do tipo Matcher <String> e o argumento se refere ao valor de dica da visualização. Ele retorna um matcher, que corresponde à visão usando a dica da visão. O código de amostra é o seguinte,

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

withInputType ()

withInputType () aceita um argumento do tipo int e o argumento se refere ao tipo de entrada da visualização. Ele retorna um matcher, que corresponde à visualização usando seu tipo de entrada. O código de amostra é o seguinte,

onView(withInputType(TYPE_CLASS_DATETIME))

Aqui, TYPE_CLASS_DATETIME refere-se à visualização de edição de datas e horas de suporte.

withResourceName ()

withResourceName () aceita um argumento do tipo Matcher <String> e o argumento se refere ao valor do nome da classe da visualização. Ele retorna um matcher, que corresponde à visão usando o nome do recurso da visão. O código de amostra é o seguinte,

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

Ele também aceita argumentos de string. O código de amostra é o seguinte,

onView(withResourceName("my_res_name"))

withAlpha ()

withAlpha () aceita um argumento do tipo float e o argumento se refere ao valor alfa da visão. Ele retorna um matcher, que corresponde à visualização usando o valor alfa da visualização. O código de amostra é o seguinte,

onView(withAlpha(0.8))

withEffectiveVisibility ()

withEffectiveVisibility () aceita um argumento do tipo ViewMatchers.Visibility e o argumento se refere à visibilidade efetiva da visualização. Ele retorna um matcher, que corresponde à visualização usando a visibilidade da visualização. O código de amostra é o seguinte,

onView(withEffectiveVisibility(withEffectiveVisibility.INVISIBLE))

withSpinnerText ()

withSpinnerText () aceita um argumento do tipo Matcher <String> e o argumento se refere ao valor da visão atual selecionada do Spinner. Ele retorna um matcher, que corresponde ao spinner com base no valor toString do item selecionado. O código de amostra é o seguinte,

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

Aceita argumento de string ou id de recurso da string também. O código de amostra é o seguinte,

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

withSubstring ()

withSubString () é semelhante a withText (), exceto que ajuda a testar a substring do valor de texto da visualização.

onView(withSubString("Hello"))

hasLinks ()

hasLinks () não tem argumentos e retorna um matcher, que corresponde à visão que tem links. Aplica-se apenas a TextView. O código de amostra é o seguinte,

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

Aqui, allOf é um matcher Hamcrest. allOf retorna um matcher, que corresponde a todos os matchers passados ​​e aqui, ele é usado para corresponder a uma visão e também verificar se a visão tem links em seu valor de texto.

hasTextColor ()

hasTextColor () aceita um único argumento do tipo int e o argumento refere-se ao id de recurso da cor. Ele retorna um matcher, que corresponde a TextView com base em sua cor. Aplica-se apenas a TextView . O código de amostra é o seguinte,

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

hasEllipsizedText ()

hasEllipsizedText () não tem argumento. Ele retorna um matcher, que corresponde ao TextView que tem texto longo e reticulado (primeiro .. dez .. último) ou cortado (primeiro ...). O código de amostra é o seguinte,

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

hasMultilineText ()

hasMultilineText () não tem argumento. Ele retorna um matcher, que corresponde ao TextView que possui qualquer texto de várias linhas. O código de amostra é o seguinte,

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

hasBackground ()

hasBackground () aceita um único argumento do tipo int e o argumento refere-se ao id do recurso do recurso de fundo. Ele retorna um matcher, que corresponde à visualização com base em seus recursos de fundo. O código de amostra é o seguinte,

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

hasErrorText ()

hasErrorText () aceita um argumento do tipo Matcher <String> e o argumento se refere ao valor da string de erro da visualização (EditText). Ele retorna um matcher, que corresponde à visualização usando a string de erro da visualização. Isso se aplica apenas ao EditText . O código de amostra é o seguinte,

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

Ele também aceita argumentos de string. O código de amostra é o seguinte,

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

hasImeAction ()

hasImeAction () aceita um argumento do tipo Matcher <Integer> e o argumento refere-se aos métodos de entrada suportados pela visão (EditText). Ele retorna um matcher, que corresponde à visualização usando o método de entrada compatível da visualização. Isso se aplica apenas ao EditText . O código de amostra é o seguinte,

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

Aqui, EditorInfo.IME_ACTION_GO está entre as opções de métodos de entrada. hasImeAction () aceita argumentos inteiros também. O código de amostra é o seguinte,

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

supportInputMethods ()

supportInputMethods () não tem argumento. Ele retorna um matcher, que corresponde à visualização, se ele suportar métodos de entrada. O código de amostra é o seguinte,

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

isRoot ()

isRoot () não tem argumento. Ele retorna um matcher, que corresponde à visão raiz. O código de amostra é o seguinte,

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

é exibido()

isDisplayed () não tem argumento. Ele retorna um matcher, que corresponde à visualização exibida atualmente. O código de amostra é o seguinte,

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

isDisplayingAtLeast ()

isDisplayingAtLeast () aceita um único argumento do tipo int. Ele retorna um matcher, que corresponde à visualização que é exibida atualmente, pelo menos a porcentagem especificada. O código de amostra é o seguinte,

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

isCompletelyDisplayed ()

isCompletelyDisplayed () não tem argumento. Ele retorna um matcher, que corresponde à visualização que é exibida completamente na tela. O código de amostra é o seguinte,

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

está ativado()

isEnabled () não tem argumento. Ele retorna um matcher, que corresponde à visualização que está habilitada. O código de amostra é o seguinte,

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

isFocusable ()

isFocusable () não tem argumento. Ele retorna um matcher, que corresponde à visualização que possui a opção de foco. O código de amostra é o seguinte,

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

hasFocus ()

hasFocus () não tem argumento. Ele retorna um matcher, que corresponde à visão que está focada no momento. O código de amostra é o seguinte,

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

isClickable ()

isClickable () não tem argumento. Ele retorna um matcher, que corresponde à visualização da opção de clique. O código de amostra é o seguinte,

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

é selecionado()

isSelected () não tem argumento. Ele retorna um matcher, que corresponde à visualização atualmente selecionada. O código de amostra é o seguinte,

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

está checado()

isChecked () não tem argumento. Ele retorna um matcher, que corresponde à visualização do tipo CompoundButton (ou subtipo dele) e está no estado verificado. O código de amostra é o seguinte,

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

isNotChecked ()

isNotChecked () é exatamente o oposto de isChecked. O código de amostra é o * seguinte,

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

isJavascriptEnabled ()

isJavascriptEnabled () não tem argumento. Ele retorna um matcher, que corresponde ao WebView que está avaliando o JavaScript. O código de amostra é o seguinte,

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

Com os pais()

withParent () aceita um argumento do tipo Matcher <View>. O argumento refere-se a uma visão. Ele retorna um matcher, que corresponde à visão que a visão especificada é visão pai. O código de amostra é o seguinte,

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

hasSibling ()

hasSibling () aceita um argumento do tipo Matcher> View <. O argumento refere-se a uma visão. Ele retorna um matcher, que corresponde à visão que a visão passada é uma de suas visões irmãs. O código de amostra é o seguinte,

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

com criança()

withChild () aceita um argumento do tipo Matcher <View>. O argumento refere-se a uma visão. Ele retorna um matcher, que corresponde à visão que a visão passada é visão filha. O código de amostra é o seguinte,

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

hasChildCount ()

hasChildCount () aceita um argumento do tipo int. O argumento refere-se à contagem de filhos de uma visualização. Ele retorna um matcher, que corresponde à visualização que possui exatamente o mesmo número de visualizações filho conforme especificado no argumento. O código de amostra é o seguinte,

onView(hasChildCount(4))

hasMinimumChildCount ()

hasMinimumChildCount () aceita um argumento do tipo int. O argumento refere-se à contagem de filhos de uma visualização. Ele retorna um matcher, que corresponde à visualização que possui pelo menos o número de visualizações filho conforme especificado no argumento. O código de amostra é o seguinte,

onView(hasMinimumChildCount(4))

hasDescendant ()

hasDescendant () aceita um argumento do tipo Matcher <View>. O argumento refere-se a uma visão. Ele retorna um matcher, que corresponde à visão que a visão passada é uma das visões descendentes na hierarquia de visões. O código de amostra é o seguinte,

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

isDescendantOfA ()

isDescendantOfA () aceita um argumento do tipo Matcher <View>. O argumento refere-se a uma visão. Ele retorna um matcher, que corresponde à visualização que a visualização passada é uma das visualizações ancestrais na hierarquia de visualizações. O código de amostra é o seguinte,

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