O Google abriu o código fonte do Espresso, um framework de testes automatizado para Android que permite executar testes em máquinas x86 na nuvem, em um ambiente multi-thread, resolvendo os problemas de concorrência associados aos testes de UI.
Executar testes em dispositivos Android reais demanda muito tempo e é muito caro, devido ao grande número e variedade de dispositivos. Uma solução é executar testes em um emulador, um ambiente controlado que suporta diversas versões do SO, resoluções de tela e restrições de memória. Essa abordagem pode ajudar a encontrar muitos bugs no código, deixando o restante para os testes em dispositivos reais e para testadores humanos.
O problema com os emuladores é o seu tempo de execução, o gargalo de executar o Android em um emulador de CPU ARM. Para resolver este problema, o Google criou uma versão do Android que executa diretamente em hardware x86 e usa aceleração da VM. Outro gargalo é o tempo de inicialização do Android, que vem sendo resolvido mediante snapshots do SO e sua execução, oferecendo assim o SO desejado e configurações das aplicações em um curto espaço de tempo. Usando esta abordagem, o Google executou 82 milhões de testes Android em março deste ano.
Comparando os testes no Nexus 4 versus um emulador, temos um acréscimo de 65% de tempo no emulador, em comparação ao dispositivo real, para finalizar a execução do teste. Deste modo, parece que um bom emulador pode resolver o problema de testes automatizados. Mas ainda há outra pedra no caminho, os testes automatizados utilizam a API Instrumentation do Android, que executa as chamadas em threads diferentes da thread de UI. Então, testar a interface de usuário de forma automática pode trazer sérios problemas de concorrência, resultando na inconsistência e insegurança nos resultados dos testes.
A solução do Google para este problema é o Espresso, um framework de testes que permite executar testes de UI de forma segura em ambientes multi-thread, e remove muito código repetitivo associado à escrita dos testes. O Espresso trabalha com vários dispositivos móveis, incluindo telefones, TVs, óculos inteligentes etc, com diferentes resoluções de tela e espaços de memória, muitas versões da API e diferentes redes. De acordo com a equipe por trás do Espresso, a solução captura cerca de 99% dos bugs no Android e aplicações, deixando apenas alguns deles para os testes em dispositivos reais e para pessoas que são testadoras, reduzindo todo o esforço de teste.
Um exemplo de teste afirmando que uma view não é exibida, com o Espresso se assemelha ao que segue:
onView(withId(R.id.bottom_left)).check(matches(not(isDisplayed())));
Outros exemplos de testes podem ser encontrados aqui.
Neste momento o Espresso está na versão Developer Preview, e é oferecido no Google Code, mas a ideia é movê-lo para o Android SDK quando estiver suficientemente maduro e estável. O Espresso é usado pelo Google para testar mais de 30 de suas próprias aplicações, incluindo: G+, Maps e Drive.