Executando Teste Instrumentado com o Framework Espresso

Geralmente, os desenvolvedores amadores testam seus aplicativos de forma manual, ou seja, colocam a “mão na massa” quando querem testar um app. No mercado, entre os programadores profissionais, a coisa não é bem assim. Os testes são altamente padronizados e automatizados, com o objetivo de validar as alterações de código mais rapidamente. De acordo com meu amigo Eduardo Seabra, um tipo de teste muito comum usado no mercado atualmente é o teste instrumentado.

Um teste instrumentado pode ser descrito como um tipo de teste que é executado diretamente no emulador ou dispositivo, simulando o comportamento de um usuário, ou seja, digitar nos EditText ou clicar nos Button de uma Activity, por exemplo. Em resumo, esse tipo de teste valida a lógica gráfica do seu app.

Visando auxiliar o desenvolvedor na execução de testes instrumentados de seus apps, o Google desenvolveu um framework chamado Espresso. Com o Espresso, a escrita de testes fica simples, rápida e confiável. Esse framework sincroniza os testes com a interface gráfica da aplicação, o que elimina ricos de timeout, por exemplo. Além disso, o Espresso também respeita o ciclo de vida das Activities, o que evita exceções quando, por exemplo, ocorre a mudança de uma Activity para outra.
Para adicionar o Espresso ao seu projeto Android no Android Studio, basta acrescentar as seguintes linhas na parte de dependência do seu arquivo gradle:

Além disso, no defaultConfig do gradle é necessário adicionar a linha abaixo:

A versão final do gradle deve ficar semelhante à apresentada no código abaixo:

Com as dependências declaradas e já sincronizadas no gradle, já é possível criar um teste instrumentado para o aplicativo.

Para ilustrar melhor o uso do Espresso, resolvi criar um app exemplo que possui uma Activity de login e outra Activity que representa a tela posterior ao login. A Activity de login possui um EditText para receber o username, outro EditText para o password e um Button que, ao ser clicado, chama o método que realiza o login. O código dessa Activity pode ser visto abaixo:

A Activity posterior ao login possui um TextView com a expressão “Logado!”, apenas para representar o acesso correto ao sistema.

Com as duas telas já codificadas, chegou a hora de criar o teste instrumentado! Para isso, iremos criar uma classe chamada LoginTest no pacote de testes do projeto onde encontramos a classe ApplicationTest, como mostra a imagem abaixo:

exemplo_espresso_pacote

O primeiro passo na implementação da classe LoginTest é adicionar as annotations @RunWith e @LargeTest. A @RunWith serve para informar a classe que será responsável por executar o teste, no nosso caso será a AndroidJUnit4.class. Por sua vez, a @LargeTest significa que o teste será fim a fim.

O segundo passo é especificar por qual Activity o teste será iniciado. Para isso, é necessário acrescentar na classe LoginTest o seguinte trecho de código:

Após todas essas alterações, o código da classe LoginTest fica da seguinte forma:

O terceiro passo é a criação do método que executará o teste propriamente dito. Esse método deve receber a annotation @Test, como mostra o código abaixo:

No método implementado acima é possível observar os métodos onView(), withId(), peform(), closeSoftKeyboard(), typeText() e click(). Cada um desses métodos tem uma função específica durante a execução do teste.

O onView() cria uma interação com uma View, a qual é obtida através do ID passado no withId(). Essa View sofrerá uma ação, a qual é especificada no perfom(). Essa ação pode ser a digitação de um texto (typeText()) ou um execução de um clique (click()), por exemplo. O método closeSoftKeyboard() serve para fechar o teclado após a digitação.

Sendo assim, o método executarTesteLoginContaErrada() implementado anteriormente digita o usuário no campo user, em seguida, digita a senha no campo pass e, por fim, clica no botão. Como o usuário e senha especificados no método são incorretos, o teste será executado normalmente, porém um alerta será exibido, simulando uma negação de acesso.

Para executar o teste, basta clicar com o botão direito do mouse sobre a classe LoginTest e clicar em Run LoginTest, como mostrar a imagem a seguir:

Executando Teste Espresso

O gif abaixo mostra a execução do teste.

Espresso Framework Running

Para simular um caso de login correto, na classe LoginTest, podemos criar um método chamado executarTesteLoginContaCorreta(). Esse método se comportará da mesma forma que o anterior, porém ele também verificará se o TextView presente na tela posterior ao login apresenta o texto “Logado!”. Essa verificação é feita por meio do método check(). O código abaixo mostra a implementação do método executarTesteLoginContaCorreta():

Após adicionar o método executarTesteLoginContaCorreta(), a versão final da classe LoginTest pode ser vista no bloco de código abaixo:

O gif a seguir mostra a execução dos dois testes presentes na classe LoginTest em sequência.

Espresso Framework Running

Pronto, agora que o Espresso foi apresentado, você já pode executar os testes instrumentados no seu aplicativo, validar seu código e economizar um tempinho para jogar aquele dotinha com seus amigos (kkkkk).

Caso você deseje ver a implementação completa do aplicativo exemplo, acesse o código fonte que está disponível no GitHub através deste link: Exemplo Teste Interface.

Tem alguma dúvida ou quer complementar o post com alguma informação? Deixe um comentário.

Deixe um comentário