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

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 em Android, 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 sua suite de testes. 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.

Exemplos de pirâmide de testes

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

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

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

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 device real. Nesse pacote normalmente colocamos testes de regra de negócio e testes unitários. Já o que está dentro de androidTest necessariamente vai precisar de um emulador ou device e aqui normalmente colocamos os testes de UI ou end-to-end.

Como opinião pessoal, eu não gosto de dizer que o que está no pacote test é estritamente unitário. Podem acontecer algumas situações em que a pessoa que constrói o teste está testando a integração entre N classes dentro de um pacote. Inclusive, ferramentas como Robolectric conseguem rodar testes de integração sem a necessidade de emuladores dentro do pacote test. Dessa forma, eu prefiro definir o pacote test como não instrumentado no lugar de unitário.

Então considerando as informações anteriores, nas quais falamos que cada pacote possui um tipo de carregamento de recurso distinto e que cada pacote é destinado para certos tipos de teste, podemos concluir que o que está em androidTest está em um nível superior da pirâmide.

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 e guidelines para construir testes, hoje nós temos opções de sobra.

Não existe uma definição concreta de onde cada ferramenta deve estar na pirâmide, pois cada modelo de pirâmide depende de cada projeto. Porém vou colocar abaixo um modelo baseado na minha opinião e experiência pessoal:

Modelo de pirâmide para Android baseado em minha experiência

No próximo post vamos aprofundar um pouco mais na camada não instrumentada da pirâmide. 👇

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