Il existe aujourd'hui plusieurs solutions et frameworks de tests automatisés ou d'outils pour le développement d'applications Android, qui sont entre autres dédiés à l'instrumentation d'Activité telles que MonkeyRunner, Robotium, ou encore Robolectric. LessPainful met lui à notre disposition des tests automatisés sur de vrais smartphone.
Android possède également un support basique pour les tests d'instrumentation dont la classe ActivityInstrumentationTestCase2 du package android.test qui étend de JUnit TestCase, pour avoir des tests fonctionnels des Activités Android. Quand une application est testée, chaque activité instrumentée est lancée à l'intérieur de la machine virtuelle Dalvik sur un émulateur Android ou un smartphone.
Le SDK Android embarque un utilitaire de test appelé MonkeyRunner, qui fournit une API et un environnement d'exécution de tests écrits en Python. Cet outil possède des API pour se connecter à un périphérique, pour installer / désinstaller et exécuter des applications et pour prendre des screenshots. Il permet aussi de comparer des images à une référence, qui définit si l'écran affiche ce qu'il faut, lorsque certaines commandes ont été effectuées, et pour exécuter un package de test sur une application. MonkeyRunner utilise la classe InstrumentationTestRunner pour exécuter des tests en définissant des scénarios de test avec entre autres [ActivityInstrumentationTestCase2](http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html, ProviderTestCase, ServiceTestCase SingleLaunchActivityTestCase.
Robotium est un autre framework qui interagit avec l'API de tests d'Android via le InstrumentationTestRunner, fournissant des tests systèmes, fonctionnels et d'acceptation à travers de multiples Activités. Robotium gère les Activités, Dialogues, Toasts, menus et menus contextuels, y compris pour Honeycomb, et il s'intègre bien avec Maven et Ant pour exécuter des tests d'intégration continue. Robotium est similaire à Selenium, mais pour les applications Android.
Robolectric a pris un chemin différent. Au lieu de s'appuyer sur les fonctionnalités de test d'Android, ce framework de test utilise des objets virtuels et exécute les tests sur une simple poste de travail / serveur et met de coté l'étape de dexing, du packaging, le déploiement et l'exécution de l'application sur un émulateur ou un terminal réel, ce qui réduit le temps nécessaire pour effectuer des tests. Pivotal Labs affirme être capable d'exécuter 1,047 tests en 28 secondes avec Robolectric.
LessPainful pousse les tests sous Android à la vitesse supérieure en offrant un service d'automatisation des tests d'applications sur de multiples terminaux. L'utilisateur upload l'application (*. Apk) et un fichier de test écrit en Cucumber (une DSL lisible) puis il sélectionne la configuration des terminaux sur lesquels il souhaite lancer les tests, et ceux-ci sont exécutés automatiquement, et enfin un rapport est généré. La liste des terminaux supportés contient Garmin Asus, plusieurs HTC, des LGs, la gamme Samsung Galaxy, des Sony Xperia, et le Motorola Motodefy.
Nous avons discuté avec Jonas Maturana Larsen, directeur général de LessPainful, pour en savoir plus sur ce service. Voici une courte interview :
InfoQ: Quels problèmes rencontre-t-on en lancant des applications sur différentes versions d'Android ? Est-ce qu'un développeur a besoin de tester son application sur toutes les versions d'Android pour s'assurer qu'elle fonctionne correctement ?
JML: Un exemple : Le SAXParser sur Android avant la 2.2 a un bug dans le callback à ContentHandler.startElement ce qui fait que l'application se comporte bizarrement.
Au total, nous avons remarqué pas mal de différences entre les versions de l'OS. Quelque chose faisait planter l'application sur 2.1 update1 mais fonctionnait sur 2.1-update3 et 2.2 ...
InfoQ: Y at-il une véritable fragmentation parmi les différents terminaux Android ? Pouvez-vous donner un exemple d'une application qui tourne sous Android 2.2 (par exemple) sur HTC et ne fonctionne pas sur un Samsung ? (Vous pouvez utiliser n'importe quelle combinaison de version d'Android et de constructeurs.)
JML: Sur les téléphones LG, HorizontalScrollViews provoque parfois la disparition des images de fond sur les vues filles. Cela se produit sur tous les téléphones LG que nous avons testés et indépendamment des différentes versions de l'OS.
Les thèmes feront que votre application aura un aspect différent sur différents terminaux si vous ne les gérez pas vous-même. Motorola, par exemple, met en évidence un champ de saisie avec une bordure rouge. J'ai travaillé sur un projet où nous avions utilisé exactement la même bordure rouge pour signaler les erreurs de saisie.
D'autres problèmes sont plus liés au matériel qu'au fabricant : Certains téléphones avec peu de RAM et un appareil photo haute résolution se bloquent si vous essayez de traiter une photo directement sur le téléphone qui l'a prise.
InfoQ: Comment sont exécutés les tests ?
JML: Le test est simplement lancé comme un ActivityInstrumentationTestCase2 en utilisant Robotium. La seule modification que nous apportons à l'application est de retirer la signature et de la resigner.
Une fois le test exécuté, l'application est désinstallée et les paramètres du téléphone sont restaurés aux valeurs par défaut.
InfoQ: Quels sont les avantages de votre service par rapport à MonkeyRunner, Robotium ou Robolectric ?
JML: LessPainful n'est pas seulement un framework, c'est aussi un service. Nous voulons construire un service qui non seulement permet de tester, mais le fait d'une manière qui économise des quantités massives de temps aux gens et les aide à trouver plus de bugs que s'ils avaient utilisés un des autres frameworks.
Une autre raison est que nous pensons qu'utiliser les résultats de Cucumber permet de génèrer des spécifications de test de haut niveau qui peuvent être partagées en dehors de l'équipe de dev.
On pourrait dire que nous voulons être ce que github est à git plutot que ce que certaines librairies git sont à git.
InfoQ: Avez-vous l'intention de supporter plus de terminaux dans le futur ?
JML: Oui. Nous avons l'intention de supporter de plus en plus de terminaux. Si quelqu'un nous demande le support pour un terminal spécifique, nous allons essayer de le faire.
Nous travaillons actuellement aussi à supporter les terminaux iOS. Nous devrions être prêt pour la bêta publique au cours de l'automne.
InfoQ: Qu'est-ce que le LessPainful entreprise ?
JML: Nous vous fournirons un package. Ce sera très probablement un Mac Mini, mais nous sommes très flexibles quand il s'agit des besoins des clients. LessPainful Enterprise n'est pas un produit standard donc cela dépend vraiment de ce que le client recherche.