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))))