Module de Programmation Android (LP PRISM AirFrance)

TD10 - Test unitaires

L'objectif de ce TD est la mise en place de tests unitaires simples permettant de tester des propriétés d'une application : Pour cela, nous allons repartir du TD8, et vérifier quelques propriétés du jeu Click the Buttonᵀᴹ.

Mise en place

Reprenez votre TD8, ou téléchargez le corrigé. Par la suite, nous supposerons que le paquet Java a pour nom fr.lri.keller.td8correction et que la classe de l'activité a pour nom TD8Activity ; adaptez les noms si vous utilisez votre propre version du TD8.

Tests unitaires sur l'activité

Observer le fichier ApplicationTest contenu dans le répertoire app/java/fr.lri.keller.td8correction (androidTest). Il permet de créer des tests unitaires à l'échelle de l'application toute entière : nous allons faire quelque chose de similaire, mais à l'échelle de l'activité.

Faire un clic droit sur le répertoire app/java/fr.lri.keller.td8correction (androidTest) et choisir New/Java Class. L'appeler du nom de votre activité en ajoutant Test à la fin, comme par exemple TD8ActivityTest.

Faire hériter cette classe de ActivityInstrumentationTestCase2<TD8Activity>. Vous devez alors ajouter un constructeur : définir un constructeur ne prenant par d'argument et faisant un appel au constructeur de la super-classe avec comme argument TD8Activity.class.

Ajouter un test unitaire trivial, comme par exemple :

  public void testTrivial() {
    assertEquals(42,42);
  }

Pour lancer ce test, faire un clic droit sur TD8ActivityTest dans l'arborescence et choisir Run 'TD8ActivityTest'.

Ajouter également un test faux, et regarder quelle est l'erreur affichée dans AndroidStudio. Le retirer ensuite.

Récupération de l'activité et des objets de son interface

Nous allons vouloir observer les valeurs des zones de texte contenant le score et le niveau. Nous allons pour cela, au lancement des tests, accéder à l'activité et ainsi à ses zones de texte.

Définir dans la classe TD8ActivityTest trois champs non initialisés: un de type TD8Activity, destiné à recevoir l'activité, et deux de type TextView, destinés à recevoir les deux zones de texte.

Surcharger la méthode setUp de la classe ActivityInstrumentationTestCase2, en précisant qu'elle peut renvoyer une exception Java. Dans le corps de cette méthode :

Préconditions des tests

Avant de manipuler ces objets dans les tests que l'on souhaite effectuer, il est préférable de s'assurer qu'ils ont bien été initialisés : cela permet de détecter tout de suite les erreurs introduites au niveau du test, évitant ainsi de polluer la recherche des erreurs introduites au niveau du code principal.

Avant tout autre test, définir une méthode de test public void testPreconditions() s'assurant que les deux champs de type TextView sont bien initialisés.

Enfin un test utile !

Définir une méthode de test s'assurant que l'entier contenu dans l'affichage du niveau est toujours égal au cinquième du score plus 1.

Rappel : les méthodes de test doivent obligatoirement être publiques, renvoyer void, ne pas prendre d'argument, et leur nom doit commencer par test.

Lancer les tests.

Simuler une action de l'utilisateur

On veut vérifier que l'affichage du score est bien incrémenté à chaque clic sur le bouton.

Récupérer le bouton dans un champ de la classe TD8ActivityTest lors de la méthode setUp.

Pour pouvoir simuler des actions de l'utilisateur, il faut les autoriser explicitement : dans le corps de setUp, ajouter un appel à setActivityInitialTouchMode(true) avant l'appel à getActivity().

Définir une méthode de test correspondant la vérification que l'on souhaite faire dans cette partie. Dans le corps de cette méthode : Lancer les tests. Regarder le comportement de la tablette ou de l'émulateur pendant les tests.

À vous de jouer

  1. Vérifier que le score est toujours un entier positif.
  2. Vérifier que le niveau est toujours un entier strictement positif.
  3. Vérifier que le niveau est incrémenté de 1 après 5 clics sur le bouton.
  4. Utiliser le score pour déterminer le nombre minimal de clics à effectuer sur le bouton pour que le niveau augmente de 1, et le tester.

Pour aller plus loin

Définir des tests unitaires pour d'autres TDs.
Retour à la page du cours