Explorando a pirâmide de testes no Android — parte 1

Phellipe Silva
Android Dev BR
Published in
4 min readMay 20, 2018

Creio que exista um consenso entre pessoas que desenvolvem software sobre o quão benéfico é ter testes automatizados em seu projeto, sejam eles no Android ou não. Ao entrar no mundo dos testes automatizados, nos deparamos com vários termos técnicos, um deles é a pirâmide de testes.

A pirâmide de testes poderia ser resumida como uma estratégia de divisão de testes no seu projeto. Nessa divisão, as camadas mais inferiores contêm testes mais rápidos, baratos e isolados ao comportamento da aplicação. Na parte superior da pirâmide teremos testes mais lentos, caros e integrados.

Exemplo ilustrativo de pirâmides de teste

O Google também possui sua própria definição de pirâmide para Android, que está dividida nas camadas small, medium e large. De acordo com eles, a divisão ideal de testes para Android seria:

Although the proportion of tests for each category can vary based on your app’s use cases, we generally recommend the following split among the categories: 70 percent small, 20 percent medium, and 10 percent large

Em resumo seu app deve conter:

  • 70% testes small ou unitários
  • 20% testes medium ou integrados
  • 10% testes large ou end-to-end

Essas definições são apenas sugestões do Google, a distribuição da sua pirâmide de testes vai depender da necessidade do seu projeto!

Legal, entendi o conceito…. Mas como isso se traduz na prática no mundo Android?

No Android Studio

No nosso projeto dentro do Android Studio nós vamos encontrar duas estruturas de pacotes de testes. Uma chamada test (não instrumentados) outra androidTest (instrumentados).

Basicamente tudo que está no pacote test pode ser executado sem necessidade de carregar os recursos do Android, ou seja, sem necessidade de carregar um emulador ou um dispositivo real. Esses testes são executados na JVM (Java Virtual Machine) e normalmente estão relacionados às camadas mais baixas da pirâmide.

Já o que está dentro de androidTest necessariamente vai precisar de um emulador ou um dispositivo real e aqui normalmente colocamos os testes de integração ou end-to-end. Esses testes se encaixam nas camadas mais altas da pirâmide.

Imagem explicando onde encontrar os pacotes de teste dentro do Android Studio

Normalmente tendemos a associar o que está no pacote test com testes unitários (por se encontrar em um nível mais baixo da pirâmide). Como opinião pessoal, eu não gosto de dizer que o que está no pacote test é estritamente unitário. Pode acontecer do teste que foi construído nesse pacote estar testando a integração entre muitas classes, inclusive, ferramentas como Robolectric conseguem fazer testes mais integrados nesse pacote.

Dessa forma, prefira definir o pacote test como não instrumentado no lugar de unitário.

Quais ferramentas posso utilizar para construir meus testes em Android e como elas estão distribuídas na pirâmide?

Dentre as ferramentas mais utilizadas para construir testes automatizados em Android nós temos:

Quando antes nos faltavam opções de ferramentas para construir testes, hoje nós temos opções de sobra. Também podemos consultar diversos guias e algumas ferramentas na documentação oficial do Android.

É importante mencionar que a ferramenta que utilizamos não é o único critério que vai definir o tipo ou nível do teste:

A ferramenta é só o meio de implementar o teste que queremos fazer. O tipo do teste e sua localização na pirâmide será definido pela estratégia de velocidade vs nível de integração e não somente pela ferramenta que escolhemos.

Com isso em mente, coloco abaixo um modelo básico de pirâmide de testes no Android baseada na minha experiência pessoal:

Modelo de pirâmide de testes — Distribuição por variáveis de integração, quantidade e custo
Modelo de pirâmide de testes — Distribuição por tipo de teste

As pirâmides a cima estão divididas em 4 blocos:

  • Nível mais baixo: Camada não instrumentada no ambiente de desenvolvimento Android. Inclui testes unitários com JUnit + mocks, além de testes unitários e integrados com Robolectric.
  • Nível intermediário: Camada instrumentada no ambiente de desenvolvimento Android. Inclui testes de UI com Espresso, testes de integração com AndroidJUnit4 e também testes end-to-end com UI Automator.
  • Nível mais alto: Camada end-to-end com ferramentas de terceiros fora do ambiente de desenvolvimento Android. Nessa camada podemos escrever testes bem integrados com tecnologias e linguagens diferentes. A ferramenta mais utilizada para esse cenario é o Appium.
  • Nível fora da pirâmide: Testes manuais.

Vamos explorar todos esses níveis da pirâmide nos próximos posts. Na sequência aprofundaremos um pouco mais na camada não instrumentada. 👇

Feedbacks também são muito bem-vindos! Obrigado!

--

--

Phellipe Silva
Android Dev BR

Android engineer and test automation enthusiast. Working @Wise and formerly @ThoughtWorks. Twitter profile: @phellipeafsilva