DUT Informatique Module JAVA Apprentis Département Informatique 2008 / 2009. Travaux Pratiques n o 2 : JUnit



Documents pareils
Introduction à Eclipse

TP1 : Initiation à Java et Eclipse

Environnements de développement (intégrés)

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

Le langage C. Séance n 4

Création d un service web avec NetBeans 5.5 et SJAS 9

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Eclipse atelier Java

Utilisation de GCM (Google Cloud Messaging) pour Android. Partie préliminaire éventuelle : Création d'un AVD lisant GCM

Etude de cas : PGE JEE V2

Apprendre Java et C++ avec NetBeans

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Programmation en Java IUT GEII (MC-II1) 1

Cours 1: Java et les objets

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Connexions à un projet CVS via Eclipse en accès local et distant. 15 Mai 2007

wxwidgets dans un environnement Microsoft Windows

Programmer en JAVA. par Tama

as Architecture des Systèmes d Information

Java Licence professionnelle CISII,

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Tutoriel d installation de Hibernate avec Eclipse

BIRT (Business Intelligence and Reporting Tools)

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Votre premier projet Android

Poker. A rendre pour le 25 avril

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Guide de démarrage IKEY 2032 / Vigifoncia

Cours de Java. Sciences-U Lyon. Java - Introduction Java - Fondamentaux Java Avancé.

Création d objet imbriqué sous PowerShell.

TP1 : Initiation à Java et Eclipse

TP, première séquence d exercices.

Premiers Pas en Programmation Objet : les Classes et les Objets

Découvrir la messagerie électronique et communiquer entre collègues. Entrer dans le programme Microsoft Outlook Web Access

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

TP3 Intégration de pratiques agiles. 1. User Stories (1) Scénario d intégration agile. En direct-live du château

TP1. Outils Java Eléments de correction

TD/TP 1 Introduction au SDK d Android

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

TD3: tableaux avancées, première classe et chaînes

Auto-évaluation Programmation en Java

Tp 1 correction. Structures de données (IF2)

Procédure d installation

Approche Contract First

Module.NET 3 Les Assemblys.NET

La base de données XML exist. A. Belaïd

CCI Génie Logiciel UFR - IMA. Objectifs du cours d'aujourd'hui. Génie Logiciel Validation par le test. Qu est-ce que tester un programme?

Ingénierie Dirigée par les Modèles. Editeurs de modèles. (Eclipse Modeling Tools) Jean-Philippe Babau

Programmation Objet Java Correction

Création du projet : 1 sur 13

Projet de programmation (IK3) : TP n 1 Correction

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

D E S C R I P T I O N D E S É L É M E N T S C L E F S D ' U I M A

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Programmation avec des objets : Cours 7. Menu du jour

Modélisation et Gestion des bases de données avec mysql workbench

Programmation par composants (1/3) Programmation par composants (2/3)

Construire des plug-ins pour SAS Management Console SAS 9.1

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

ACTIVITÉ DE PROGRAMMATION

Présentation de la plateforme WINDCHILL. Invitation à rejoindre la plateforme

TD/TP PAC - Programmation n 3

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Développement Logiciel

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Application web de gestion de comptes en banques

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmation par les Objets en Java

Installation de GFI Network Server Monitor

Utilisation d objets : String et ArrayList

Installation et configuration du logiciel BauBit

Bases Java - Eclipse / Netbeans

Manuel d utilisation de la messagerie.

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Tutoriel BlueJ. Michael Kölling Mærsk Institute University of Southern Denmark. Version 1.4 fr-2 par le groupe Sigma 1 pour BlueJ Version 1.2.

1 CRÉER UN TABLEAU. IADE Outils et Méthodes de gestion de l information

TD/TP PAC - Programmation n 3

TME1 Installation et programmation en ILP1

Corrigé des exercices sur les références

TP Programmation Java / JDBC / Oracle

Algorithmique et Programmation, IMA

Design patterns. Design patterns - définition. Design patterns - avantages

Gestion distribuée (par sockets) de banque en Java

Initiation à JAVA et à la programmation objet.

Installation de SQL Server Reporting Services avec l intégration dans un site Windows SharePoint Services V3

Généralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code

Chapitre 10. Les interfaces Comparable et Comparator 1

Procédure d installation Smart Map 3

GANTTPROJECT. Julien TENDERO

TP 1. Prise en main du langage Python

INITIATION AU LANGAGE JAVA

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Accès à distance sécurisé au Parlement (ADSP)

Création d une application JEE

Connected to the FP World

Générer du code à partir d une description de haut niveau

Transcription:

iut ORSAY DUT Informatique Département Informatique 2008 / 2009 Travaux Pratiques n o 2 : JUnit Nom(s) : Groupe : Date : Objectifs : Apprendre à vérifier une implantation à l aide de tests unitaires sous JUnit. Pouvoir critiquer une spécification et partir d elle pour implanter et vérifier une classe. 1 Notes de cours 1.1 Visibilité Il existe différentes politiques de droits d accès pour les membres d une classe, qu ils soient des constantes, des variables, des méthodes ou même des constructeurs : Publique (le champ ou la méthode est précédé du mot clé public) : le membre est accessible depuis l extérieur de la classe, depuis toutes les autres classes ; le recours à une instruction import en début de fichier sera peut-être cependant nécessaire pour utiliser la classe ellemême. Privée (le champ ou la méthode est précédé du mot clé private) : le membre n est accessible qu aux méthodes de la classe. Protégé (le champ ou la méthode est précédé du mot clé protected) : le membre n est accessible qu aux méthodes de la classe et de toutes les classes qui en héritent. Paquetage (le champ ou la méthode n est précédé d aucun mot clé relatif à l accès) : l accès au membre est limité aux classes du même paquetage (pour mémoire, si aucune mention d appartenance à un paquetage n est précisée dans un fichier contenant une classe, celle-ci est considérée comme appartenant au paquetage par défaut). 1.2 JUnit JUnit est un cadre de développement de tests pour applications JAVA. Il s agît de créer des tests automatisés pour vérifier qu une implantation respecte la spécification qui a été prévue. En pratique, pour chaque classe MaClasse d une application va correspondre une classe de test MaClasseTest et pour chaque méthode mamethode de MaClasse qu on souhaitera tester on écrira une méthode de test testmamethode dans MaClasseTest. Le code des classes et méthodes de test est semblable à celui des classes et méthodes classiques, avec cependant en plus des opérations d assertion. Ces opérations sont des points de contrôle où on vérifie qu une valeur obtenue est bien celle attendue. Quelques exemples sont :

Travaux Pratiques n o 2 JUnit 2/8 static void assertequals(int attendu, int observe) prend en argument deux valeurs entières, celle attendue et celle observée, et vérifie que les deux valeurs sont égales. static void assertequals(float attendu, float observe, float precision) prend en argument deux valeurs réelles, celle attendue et celle observée, et vérifie que les deux valeurs sont égales plus ou moins une troisième valeur de précision. static void asserttrue(boolean condition) vérifie que la valeur booléenne passée en argument est à true. static void assertnotnull(object object) vérifie que la référence passée en argument n est pas null. Lorsqu un test échoue, un rapport est envoyé (sous la forme d une exception que l on étudiera plus tard en détail) qui aidera à découvrir et corriger le(s) bug(s) d implantation. Pour connaître tous les tests disponibles, vous pourrez vous reporter à la javadoc de la classe Assert du paquetage junit disponible à l adresse http://junit.sourceforge.net/javadoc. 1.2.1 Un exemple de test On considère une classe Entier destinée à contenir et manipuler un nombre entier. Le code est présenté en Figure 1. C l a s s e E n t i e r d e s t i n é e à c o n t e n i r un nombre e n t i e r. @author Monprenom Monnom p u b l i c c l a s s E n t i e r { Nombre e n t i e r p r i v a t e i n t nombre ; C o n t r u c t e u r. @param v a l e u r Pour i n i t i a l i s e r l a t t r i b u t nombre. p u b l i c E n t i e r ( i n t nombre ) { t h i s. nombre = nombre ; Double l a v a l e u r de l a t t r i b u t nombre. p u b l i c void d o u b l e r ( ) { nombre = 2 ; G e t t e r de l a t t r i b u t nombre. @return R envoie l a v a l e u r de l a t t r i b u t nombre. p u b l i c i n t g e t V a l e u r ( ) { return nombre ; FIG. 1 Code du fichier Entier.java On souhaite vérifier que le constructeur et la méthode doubler de la classe Entier fonctionnent comme on le souhaite. En utilisant Eclipse, on doit tout d abord s assurer que la bibliothèque JUnit est bien connue. Pour cela, clic droit dans partie exploration, Build Path Configure

Travaux Pratiques n o 2 JUnit 3/8 Build Path..., dans la fenêtre qui s affiche, choisir l onglet Libraries pour Java Build Path, faire Add Library... JUnit Next choisir JUnit 3 et enfin Finish OK. Pour créer une classe de test JUnit à partir d Eclipse : se placer dans partie exploration sur la classe que l on souhaite tester, clic droit, New JUnit Test Case. Choisir New JUnit 3 test, cocher setup() et éventuellement teardown() dans la boîte de dialogue qui s ouvre et cliquez sur Next. Ensuite Eclipse propose la liste des méthodes que l on souhaite tester. Il ne reste qu à choisir (dans notre exemple, Entier(int) et doubler) puis enfin Finish. Eclipse génère automatiquement une classe EntierTest avec ses méthodes qui ne restent qu à remplir. N ajoutez du code qu à la fin des méthodes. Les mots clé extends, throws et super vous sont peut être encore inconnus, vous découvrirez bientôt leur rôle. Un exemple complet est présenté en Figure 2. import j u n i t. framework. T estcase ; C l a s s e de t e s t J U n i t pour l a c l a s s e E n t i e r. @author Monprenom Monnom p u b l i c c l a s s E n t i e r T e s t extends T estcase { A t t r i b u t r é f é r e n c e v e r s un o b j e t de t y p e E n t i e r. E n t i e r e n t i e r ; Méthode e x e c u t é e a v a n t chaque méthode de t e s t. p r o t e c t e d void setup ( ) throws E x c e p t i o n { super. setup ( ) ; System. o u t. p r i n t l n ( " Début d un t e s t. " ) ; e n t i e r = new E n t i e r ( 2 ) ; / / C r é a t i o n d un E n t i e r avec nombre = 2. Méthode e x e c u t é e a p r è s chaque méthode de t e s t. p r o t e c t e d void teardown ( ) throws E x c e p t i o n { super. teardown ( ) ; System. o u t. p r i n t l n ( " Fin d un t e s t. " ) ; Méthode de t e s t pour l e c o n t r u c t e u r de l a c l a s s e E n t i e r. p u b l i c void t e s t E n t i e r ( ) { System. o u t. p r i n t l n ( " T e s t du c o n s t r u c t e u r. " ) ; a s s e r t N o t N u l l ( e n t i e r ) ; / / L o b j e t d o i t b i e n a v o i r é t é c r é é. a s s e r t E q u a l s ( 2, e n t i e r. g e t V a l e u r ( ) ) ; / / Son nombre d o i t v a l o i r 2. Méthode de t e s t pour l a méthode d o u b l e r de l a c l a s s e E n t i e r. p u b l i c void t e s t D o u b l e r ( ) { System. o u t. p r i n t l n ( " T e s t de d o u b l e r. " ) ; e n t i e r. d o u b l e r ( ) ; / / On double l a v a l e u r du nombre. a s s e r t E q u a l s ( 4, e n t i e r. g e t V a l e u r ( ) ) ; / / I l d o i t donc v a l o i r 4. FIG. 2 Code du fichier EntierTest.java

Travaux Pratiques n o 2 JUnit 4/8 Pour lancer le test à partir d Eclipse, clic droit dans la partie navigation sur la classe de test, Run As JUnit Test. Un nouvel onglet JUnit s ouvre alors, contenant le rapport d erreur (avec notre exemple il ne devrait y avoir aucune erreur), et l onglet Console imprime le résultat de l exécution. En pratique chaque test se déroule de la manière suivante : (1) la méthode setup est exécutée si elle a été définie, on y fait ce qu il y a de commun au début de tous les tests, (2) une méthode de test est exécutée (il n y a pas d ordre précis) et (3) la méthode teardown est exécutée si elle a été définie. Pour plus d informations : 2 Description du problème http://www.junit.org On considère une application dédiée à la saisie et à l étude des notes d un groupe d étudiants. Le programme demande à l utilisateur le nombre de notes qu il souhaite entrer puis les notes une à une. Quand toutes les notes ont été entrées, il affiche la liste des notes et des statistiques. Cette application est construite autour de trois objets dont les classes vous sont fournies (voir http://www.lri.fr/ bastoul/teaching/java) : Un objet de type Notes qui est destiné à contenir la liste des notes, les statistiques sur ces notes ainsi qu à effectuer des opérations sur cette liste. Le diagramme UML de la classe Notes ainsi que sa spécification vous sont fournis en Figure 3. Pour rappel, en UML un «+» signifie publique, un «-» signifie privé et le soulignement désigne les constantes. Un objet de type Clavier dédié à la saisie d informations à partir du clavier. Un objet utilitaire de type Principale qui contient la méthode principale et orchestre l utilisation des deux premiers objets. Invariants Note la plus haute Note la plus basse Moyenne des notes Nombre de notes Tableau des notes Taille du tableau de notes Constructeur, taille du tableau en paramètre Affiche les notes, les min, max et moyenne Ajoute une note et met à jour les statistiques si la note est correcte et le tableau non plein renvoie true si la note a été ajoutée, false sinon Accesseurs Met à jour les statistiques Renvoie false si la note n est pas entre MIN_NOTE et MAX_NOTE, true sinon Notes +MAX_NOTES:float=20 +MIN_NOTES:int=0 +maxnotes:float +minnotes:float +moynotes:float +nbnotes:int +notes:float[] +taillenotes:int +Notes(tailleNotes:int) +afficherstatistiques() +ajouternote(note:float):boolean +getmaxnotes():float +getminnotes():float +getmoynotes():float +getnbnotes():int miseajour() notecorrecte(note:float):boolean tableauplein():boolean Renvoie true si le tableau est plein, false sinon FIG. 3 Spécification UML de la classe Notes

Travaux Pratiques n o 2 JUnit 5/8 3 Vérification du respect d une spécification Respectez l ordre des étapes, dans cette section il est interdit de modifier les codes donnés! Importez l archive Notes.zip sous Eclipse. Pour cela, dans le menu File, choisissez Import, puis General Existing Projects into Workspace, faites alors Select archive file, Browse jusqu au fichier et enfin Finish. Lancez une première exécution du programme et observez son comportement. Copiez ci-dessous le résultat d une exécution. Conformément à la spécification définie en Section 2, écrire un test JUnit pour la classe Notes du paquetage notation (ne pas tester les accesseurs et les routines d affichage) en suivant la spécification de l objet. Vous joindrez le code de cette classe de test au compterendu. La classe Notes du paquetage notation passe-t-elle avec succès le test que vous avez défini? Plusieurs autres équipes de programmeurs ont écrit leur propre version de la classe Notes dans des paquetages notation_vx avec 1 x 4. Pour les utiliser dans la classe Principale à la place de celle du paquetage notation, il suffit de modifier l instruction import en tout début de fichier. Exécutez le programme en utilisant chacune de ces quatre classes et les notes (exactement et dans cet ordre) 0, 5, 10 15 et 20. Pour chaque version, est-ce que le programme semble fonctionner correctement?

Travaux Pratiques n o 2 JUnit 6/8 Utilisez votre classe de test, telle que vous l avez écrite, pour tester chaque version. Donner honnêtement (jouez le jeu, cette partie n a aucune incidence sur une quelconque note!) les rapports d erreur pour chaque version de la classe Notes. Améliorez votre classe de test, normalement aucune classe, sauf celle du paquetage notation, ne devrait passer le test. Vous joindrez le code de cette nouvelle classe de test au compte-rendu. 4 Respect de l encapsulation À la fin de la méthode main dans la classe Principale, essayez de modifier directement des attributs de l objet référencé par listenotes puis de réafficher les statistiques, par exemple changez la première note en ajoutant les instructions suivantes (et n entrez que des valeurs supérieures à 2 lors de l exécution) : l i s t e N o t e s. n o t e s [ 0 ] = 2 ; l i s t e N o t e s. a f f i c h e r S t a t i s t i q u e s ( ) ; Est-ce qu une erreur est détectée à la compilation? À l exécution? Les valeurs affichées sont-elles cohérentes (par exemple, la moyenne affichée est-elle bien correcte)?

Travaux Pratiques n o 2 JUnit 7/8 On peut remarquer que la politique d accès pour tous les attributs est publique. Corrigez cela de manière à ce que l utilisateur de la classe ne puisse pas faire n importe quoi. Que doit-on modifier dans le diagramme UML? Tentez à nouveau de modifier directement des attributs rendus privés ou d appeler des méthodes rendues privées. Que se passe-t-il? À quel niveau (compilation, exécution) une erreur est-elle repérée? Quelles sont vos conclusions sur l intérêt de l encapsulation? Sur les compétences de celui qui a écrit la spécification? Un bon programmeur aurait-il dû corriger l erreur de spécification dans le programme? 5 Changement d implantation La programmation orientée objet permet de facilement remplacer un objet par un autre sans se soucier du reste de l application, du moment que l interface avec l extérieur (ce qui n est pas privé) ne change pas de nom ou de fonctionnement. Dans l application présentée dans la première partie du TP, une implantation à base de tableau pour maintenir la liste des notes était proposée pour la classe Notes. Cette implantation a pour limitation d obliger à définir un nombre maximum de notes à entrer (la taille du tableau). On souhaite écrire une nouvelle version plus puissante de la classe Notes, pour cela on souhaite utiliser la classe ArrayList proposée par JAVA pour stocker les notes (voir la Javadoc pour plus d informations).

Travaux Pratiques n o 2 JUnit 8/8 Réaliser une nouvelle classe Notes utilisant ArrayList. Vous joindrez le code de cette nouvelle classe au compte-rendu. Remplacer l ancienne classe par la nouvelle et vérifier que le fonctionnement du programme est toujours correct, en particulier, utilisez votre test JUnit. Il est interdit de modifier les autres objets. Votre nouvelle classe passe-t-elle votre test? 6 Second changement d implantation (facultatif) Écrire une troisième classe Notes (et son test JUnit) qui a une spécification plus riche : elle permet d afficher toutes les notes dans l ordre où elles ont été entrées et permet le remplacement de la ième note par une nouvelle et ne change rien si la position i n est pas cohérente. Vous joindrez le code de cette nouvelle classe et de sa classe de test au compte-rendu.