JAVA TP : JUnit et les tests en Java JAVA TP : JUnit et les tests en Java • • • JUnit : développement orienté tests CREATION : 2010/10/04 MISE A JOUR : 2010/10/11 Corriger l’indentation du code Renommer equals() en equals2() Refaire une méthode equals() qui renvoie toujours faux. La classe Object définit deux méthodes equals() et hashCode() qui doivent être cohérentes pour déterminer si deux instances sont équivalentes ou pas. Avec Eclipse et Netbeans, vous avez dans les mains des EDI qui se prêtent bien au développement agile. Le développement est incrémental : on livre de nouvelles versions régulièrement avec de nouvelles fonctionnalités. Une des difficultés est d’éviter les régressions de code. Une des méthodes préférées des développeurs JAVA est d’utiliser des outils comme JUnit (on parle alors de développement orienté tests si c’est bien fait). Partie 2 : Mise en place des jeux de test • Le principe est simple : avant d’écrire une fonctionnalité, on écrit le test qui correspond. Au début, une application n’est pas livrable car elle échoue à tous les tests. Petit à petit, elle répond au cahier des charges pour réussir tous les tests. Les tests sont écrits une fois pour toutes et sont répétables. • JUnit introduit un formalisme un peu spécial qui dépend de la version utilisée. Sur développez.com, vous trouverez un tutoriel pour les versions 2 et 3, nous allons nous intéresser à la dernière version, la 4, qui fait usage d’annotations et non plus de méthodes particulières pour lancer les tests ou les jeux de tests. • @Test : une méthode qui réalise un test doit être annotée avec @Test. Elle ne renvoie rien ni n’accepte de paramètre. Si la méthode doit renvoyer une exception, elle est précisée avec le champ expected. • • • • • Tout test annoté par @Ignore (avec éventuellement une chaîne de caractères pour info) doit être ignoré par le générateur de test. Les méthodes annotées par @Before et @After sont exécutées respectivement avant et après chaque test. @BeforeClass et @AfterClass ne sont exécutées qu’une seule fois par classe de test, les méthodes doivent être statiques. On appelle toutes ces méthodes des fixtures. Créer une nouvelle classe (par exemple : LivreTest) qui testera le code que l’on vient d’écrire avec les raccourcis : o (M) File > New > New JUnit Test. o (D) Sélectionner JUnit 4 o Eclipse pourra vous demander d’ajouter la bibliothèque JUnit au projet courant. Déclarer trois instances de Livre : instancier les trois objets dans une méthode init() précédée de l’annotation @BeforeClass : deux avec le même titre mais des prix différents et l’autre avec un autre titre Créer une méthode testEquals() précédée de l’annotation @Test qui teste si les titres des livres sont bien égaux ou pas avec assertTrue() et assertFalse() Enlever les erreurs de compilation avec les bons imports (statiques ou non) Exécuter la classe avec JUnit. Relever les différentes erreurs Ecrire une nouvelle méthode testEquals2() qui fait la même chose avec equals2(). Retester Placer @Ignore devant testEquals() et retester A vous d’intégrer désormais JUnit pour vos prochains TPs ou projets. Seule ou avec d’autres classes, vous pourrez faire des choses très sympathiques. La plateforme Java propose parfois des classes étonnantes comme java.awt.Robot qui permet de simuler le comportement d’un utilisateur (saisie d’un caractère, clic de souris, déplacement de souris). Il est aussi possible d’utiliser des assertions : celles du java standard (mot réservé assert) et celles de JUnit (classe Assert avec ses méthodes). Partie 1 : Mise en place de la classe à tester Nous allons utiliser JUnit pour le développement minimaliste de la classe Livre dont la représentation UML est donnée ci-contre. • Créer la classe Livre avec ses attributs et générer automatiquement le code des autres méthodes Source > Generate Constructor using Fields Source > Generate Getters and Setters Source > Generate Hashcode et equals en se limitant à l’attribut prix Livre #nom : string #prix : reel +Livre(nom, prix) +getNom() : string +setNom(n : string) +getPrix() : reel +setPrix(p : reel) +equals(o : objet) : boolean ISIMA Page 1 ISIMA Page 2