Skip to topic | Skip to bottom
Home
Minfo05
Minfo05.GlooTD3r1.4 - 14 Oct 2005 - 16:08 - PhilippeCollettopic end

Start of topic | Skip to actions

TD 3 : JUnit

PhilippeCollet

Le retour des bébêtes

  • Créez un nouveau projet dans JBuilder dans un répertoire fait pour ce 3ème TD.
  • Téléchargez l'archive junitbebetes.zip et décompactez la sur le sous-répertoire src de votre projet (l'archive contient un répertoire src).
  • Rafraichissez les fichiers du projet dans JBuilder, vous devriez voir apparaitre les nouveaux packages et classes.
  • Allez dans les propriétés du projet, puis dans le noeud "General", tout en haut du panneau, modifiez "Encoding" pour passer à ISO-8859-15, afin de bien visualiser les accents (c'est aussi important car certains outils et plugins utilisés sont "sensibles" a cela).

Vous êtes toujours face au simulateur de bébêtes, mais sa conception a légèrement changé :

  • La classe principale de l'application s'appele maintenant LanceBebetes. Tout est en Swing et la fenêtre principale est une JFrame et le champ un JPanel. Les tailles sont gérées par setPreferredSize() sur le JPanel et pack() sur la JFrame.
  • L'angle et la longueur de vue sont maintenant placés dans BebeteAbstraite.
  • La vitesse est de type float pour éviter la diminution de la vitesse lors des calculs (troncature en int).
  • La plupart des attributs des bébêtes sont maintenant "protected" et des méthodes getter et setter sont fournies.
  • Des attributs pour gérer la distance minimale entre les bébêtes émergentes sont placés dans... BebeteEmergente.
  • L'action d'une bébête est définie un peu plus précisément :
    • La méthode agit() n'est plus abstraite dans BebeteAbstraite, elle définit une action par défaut, qui consiste à appeler successivement deux autres méthodes (abstraites dans cette classe) : calculeDeplacementAFaire() qui peut modifier la vitesse et la direction, puis effectueDeplacement() qui doit modifier x et y en conséquence.
    • La classe BebeteEmergente fournie est une forme de correction du TD 1. Elle définit notamment les méthodes calculeDeplacementAFaire() et effectueDeplacement(), mais elle redéfinit aussi la méthode agit() pour modifier le comportement en fonction de la distance minimale (ne pas se déplacer si on voit une autre bébête trop près).
  • Vous trouverez aussi une correction du TD 2, dans la classe BebeteAbstraite qui redéfinit la méthode toString() en utilisant la réflexivité. Le champ de bébêtes a aussi été modifié pour répondre au clic souris, chercher la bébête la plus proche et afficher dans une petite fenêtre le résultat de toString().

Ecriture de tests unitaires

On décide de créer une nouvelle bébête, qui se ballade au hasard et qui rebondit sur les bords du champ. Comme vous travaillez en eXtreme Programming (si si), votre collègue a déjà implémenté BebeteHasard.java et vous n'avez pas encore écrit les tests ! On va s'en occuper.

  • Vous pouvez déjà créer une configuration d'exécution sur LanceBebete et regarder le résultat.
  • Votre collègue a déjà implémenté BebeteHasard, et il aussi changé le champ pour créer 10 BebeteHasard.
  • Vous observez qu'il a du mal faire son travail car certaines des bébêtes disparaissent ou ne rebondissent pas très bien...

Réflexion préliminaire

On pourrait très bien se passer du code de BebeteHasard.java pour écrire nos tests, mais on ne peut s'empêcher d'aller jeter un coup d'oeil :

  • La classe BebeteHasard redéfinit bien correctement les deux méthodes pour déterminer l'action.
  • Dans calculeDeplacementAFaire(), elle utilise une variable nbTour pour changer de direction et de vitesse au bout d'un certain nombre de tours.
  • La méthode effectueDeplacement() s'occupe de déplacer x et y, et surtout de faire rebondir la bébête. On va commencer par cette méthode !!!

Réfléchissez à quels tests il faudrait mettre en oeuvre (quelles sont les partitions d'équivalence, les valeurs moyennes, les fameuses valeurs aux bornes).

Un premier test

  • A partir de File/New, allez dans la gallerie "test" et sélectionnez "Test Case", puis "OK".
  • Vous devez être face a un "Test Case Wizard". Il permet de sélectionner la classe à tester (mettez bebetes.BebeteHasard), puis une ou plusieurs méthodes à tester (cochez "effectueDeplacement" uniquement). Passez au panneau suivant.
  • Un nom de classes est proposé. On pourrait le garder mais on va mieux expliciter nos cas tests. Appelez donc la classe "TestBebeteHasardDeplacement". Passez au suivant.
  • Si on décide d'écrire du code de mise en place du contexte (fixture) qui est partagé par plusieurs classes TestCase, on pourrait sélectionner une ou plusieurs classes qui joueraient ce rôle. Ce n'est pas le cas ici, on passe...
  • Enfin, on coche la création du configuration, en conservant les paramètres par défaut (vous remarques que cela va utiliser le JBuilder Test Runner...).

Observez le code produit. Pas mal de choses ont été générées automatiquement. Il reste a créer effectivement le contexte et le premier test :

  • Réfléchissez à ce dont on a besoin de faire dans le setup pour pouvoir tester unitairement la méthode en question, puis sur ce qu'il faut appeler comme méthode et enfin quoi vérifier (les 3 étapes du test !).

Aide :

  • On n'a pas besoin de faire afficher le champ pour tester que le déplacement est correct. En revanche on a besoin d'un objet champ correctement initialisé
  • Pour démarrer, on peut créer une seule bébête, au milieu du champ, avec une vitesse quelconque, un angle simple (0 par exemple !).
  • Pour la tester, il suffit d'appeler la méthode qui effectue le déplacement (c'est déjà dans le code normalement), puis une ou plusieurs méthodes assertXXX() pour vérifier ce qui est nécessaire (pensez à la complétion automatique pour écrire les assertXXX).

Exécution du test

Une fois que votre test compile, il suffit d'appeler la configuration de test (vous devriez avoir deux configs, une pour l'exécution classique, l'autre pour votre test). Ce sera intéressant de définir la configuration de test comme config par défaut (cochez la case correspondante).

  • Observez maintenant le résultat dans la console JBuilder. Le test runner spécifique présente le résultat en trois panneaux :
    1. Test Hierarchy qui synthétise les résultats hiérarchiquement avec des feux verts et rouges.
    2. Test Failures qui donne la liste des échecs avec plus de détails (la stack trace par exemple)
    3. Test output qui montre les sorties standards de l'exécution, au cas ou il y a quelque chose à observer.
  • Normalement, votre simple test doit passer (sinon c'est votre test qui est faux), car les erreurs sont plutot dans la gestion des rebonds sur les bords...

Le jeu des 3 erreurs

Trouvez les autres tests à écrire et ajoutez des méthodes testXXX() avec des noms significatifs dans le même TestCase. Vous remarquerez que le test runner exécute automatiquement vos nouvelles méthodes de test (merci la réflexivité).

Aide :

  • Il y a 3 erreurs à trouver dans le code de la méthode
  • Les test aux bornes sont à faire quand une bébête arrive sur un bord (il y en a 4) et qu'il faut bien calculer les valeurs attendues.
  • En haut à gauche du champ, x est à 0, y est à 0. La direction à 0 pointe à droite, elle est censée être dans l'intervalle [0,2PI[, PI/2 pointant vers le bas, PI vers la gauche, et 3PI/2 pointant vers le haut.

Un autre test

Si vous avez terminé :

  • Ecrivez un nouveau TestCase (et hop le wizard) qui teste la méthode fabriqueBebetes() du champ. Ecrivez un seul test (pas aux bornes), simplement pour vérifier un minimum de choses à la sortie de la fabrique.
  • Modifiez votre configuration d'exécution de test en cochant, dans la partie "Run", un package au lieu d'une classe individuelle. Sélectionnez le package bebetes et voila que JBuilder va exécuter automatiquement toutes les méthodes de toutes les classes de test du package !

Questions facultatives

  • Utilisez le wizard de création de TestSuite pour assembler vos deux TestCase précédents, puis testez les. Vérifiez que cela donne la même chose qu'avec la méthode réflexive utilisée par JBuilder.
  • Ecrivez des tests pour vérifier le calcul du champ de vision des bébêtes (listeDeBebetesAutour).

-- PhilippeCollet - 12 Oct 2005
to top


You are here: Minfo05 > GlooTD3

to top

Copyright © 1999-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding WIKIDeptinfo? Send feedback