Google vient de partager en open source Espresso, un framework de tests Android automatisés qui permet de lancer des tests sur des machines x86 dans le cloud, dans un environnement multi-threadé, permettant ainsi de résoudre le problème de la gestion de la concurrence dans les tests d'interface graphique.
Effectuer des tests sur du vrai matériel Android est très coûteux en temps et en ressources du fait du grand nombre de terminaux sur le marché. Une solution est d'effectuer ces tests sur un émulateur qui permet d'avoir un environnement contrôlé supportant plusieurs versions du système, des résolutions d'écrans et des contraintes de mémoire. Cette méthode permet de détecter la plupart des bugs mais le reste nécessite quand même des tests sur de vrais terminaux par des humains.
La problème principal des émulateurs est leur vitesse d'exécution, le goulet d'étranglement étant d'émuler un CPU ARM pour faire tourner Android. Pour résoudre cela, Google a créé une version d'Android qui fonctionne directement sur du x86 et utilise l'accélération de la VM. Une autre limitation est le temps de démarrage d'Android ; ce problème a été résolu en réalisant des images ("snapshots") du système et en les exécutant pour obtenir la configuration souhaitée en peu de temps. En utilisant cette technique, Google a réalisé 82 millions de tests en mars 2013.
Si on compare des tests lancés sur le Nexus 4 et un émulateur, ce dernier met seulement 65% du temps pour finir le test. Finalement, il semblerait qu'un bon émulateur aie enfin réglé le problème des tests automatisés. Mais il reste encore un obstacle majeur. Les tests automatisés utilisent l'API d'Instrumentation d'Android et ces appels sont faits dans un thread différent de celui de l'UI. Du coup, tester l'interface utilisateur peut mener à de sérieux problèmes de concurrence menant à des résultats de tests erratiques. La solution de Google est Espresso : un framework de tests qui permet d'effectuer des tests d'UI correctement, dans un environnement multi-threads et qui permet de s'affranchir d'une bonne partie du code redondant lorsqu'on écrit des tests. Espresso marche sur de nombreux terminaux mobiles dont les téléphones, les téléviseurs, les lunettes à réalité augmentée, les voitures, etc, et fonctionne pour différentes résolutions d'écran, configurations mémoires, versions des API et types de réseaux. Selon l'équipe à l'origine d'Espresso, leur solution permet de détecter 99% des bugs dans les applications Android, n'en laissant que peu à tester à la main sur de véritables terminaux, réduisant ainsi l'effort global de test.
Un exemple de test vérifiant qu'une vue ne s'affiche pas pourrait ressembler à cela avec Espresso:
onView(withId(R.id.bottom_left)).check(matches(not(isDisplayed())));
D'autres exemples de tests sont disponibles ici.
Actuellement, Espresso est disponible en version "preview" et accessible sur Google Code mais à terme, l'idée est de l'intégrer dans le SDK Android lorsque le framework sera suffisamment mature et stable. Espresso est déjà utilisé par Google pour tester plus de 30 de leurs applications, dont Google+, Maps et Drive.