Ce document est un guide succinct sur JUnit, un framework de test unitaire pour Java.

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

Programmation par les Objets en Java

Cours 1: Java et les objets

TP1 : Initiation à Java et Eclipse

TP1. Outils Java Eléments de correction

Package Java.util Classe générique

Introduction à Eclipse

Utiliser Java sans BlueJ

Bases Java - Eclipse / Netbeans

Java Licence professionnelle CISII,

Premiers Pas en Programmation Objet : les Classes et les Objets

Plan du cours. Historique du langage Nouveautés de Java 7

TP, première séquence d exercices.

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

Programmer en JAVA. par Tama

as Architecture des Systèmes d Information

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

Auto-évaluation Programmation en Java

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

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

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

TP1 : Initiation à Java et Eclipse

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

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

Java Licence Professionnelle CISII,

Projet de programmation (IK3) : TP n 1 Correction

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

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

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

Corrigé des exercices sur les références

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

Objets et Programmation. origine des langages orientés-objet

Tutoriel d installation de Hibernate avec Eclipse

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

ACTIVITÉ DE PROGRAMMATION

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

TD/TP 1 Introduction au SDK d Android

Utilisation d objets : String et ArrayList

Java Licence Professionnelle CISII,

Une introduction à Java

Remote Method Invocation (RMI)

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Programmation Orientée Objet

RMI le langage Java XII-1 JMF

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

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

Corrigés des premiers exercices sur les classes

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Initiation à JAVA et à la programmation objet.

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

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

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

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

Programmation en Java IUT GEII (MC-II1) 1

Un ordonnanceur stupide

Java au cœur de la base de données Oracle

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Cours d initiation à la programmation en C++ Johann Cuenin

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

Remote Method Invocation Les classes implémentant Serializable

TP Programmation Java / JDBC / Oracle

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Chapitre VI- La validation de la composition.

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

Création d une application JEE

Java 1.5 : principales nouveautés

LOG4430 : Architecture logicielle et conception avancée

Synchro et Threads Java TM

INITIATION AU LANGAGE JAVA

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

1. Installation d'un serveur d'application JBoss:

Votre premier projet Android

Derrière toi Une machine virtuelle!

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

Programme Compte bancaire (code)

7 Développement d une application de MapReduce

Exercices sur les interfaces

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Programmation Orientée Objet

TD/TP PAC - Programmation n 3

Introduction au langage Java

Langage Java. Classe de première SI

TD/TP PAC - Programmation n 3

Eclipse atelier Java

Traitement de données

Chapitre 10. Les interfaces Comparable et Comparator 1

Notes de cours Practical BigData

Dis papa, c est quoi un bus logiciel réparti?

Création d objet imbriqué sous PowerShell.

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Programmation Par Objets

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

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Web Tier : déploiement de servlets

Transcription:

IN201 : JUnit SUPAERO 2A Christophe Garion <garion@supaero.fr> Ce document est un guide succinct sur JUnit, un framework de test unitaire pour Java. Le problème principal qui se pose en «informatique» est de pouvoir vérifier, voire prouver, que les développements que l on fait sont corrects : au sens de ce qu attend le client (fonctionnalités) ; que tout est intégrable (i.e. que les classes développées peuvent interagir entre elles) ; au niveau de la classe enfin (est-ce que les méthodes font bien ce que l on veut?). Nous ne nous intéresserons ici qu au troisième cas, i.e. nous nous attacherons à vérifier que les méthodes des classes ont un comportement correct. Pour cela nous nous appuierons sur une classe Point minimale, sans documentation que nous allons tester. public class Point { private double x; private double y; public Point(double x_, double y_) { this.x = x_; this.y = y_; public double getx() { return this.x; public double gety() { return this.y; public double getmodule() { return (Math.sqrt(this.x * this.x + this.y * this.y)); public double getargument() { if (this.getmodule()==0) { return 0; double ancienarg = Math.acos(this.x/this.getModule()); if (this.y<0) { return(-1 * ancienarg); return(ancienarg); 1

public void translater(double dx, double dy) { this.x += dx; this.y += dy + 1; public void setmodule(double module) { double ancienmodule = getmodule(); if (ancienmodule==0) { this.x = module; else { this.x = (this.x * module)/ancienmodule; this.y = (this.y * module)/ancienmodule; public void setargument(double arg) { double ancienmodule = this.getmodule(); x = ancienmodule * Math.cos(arg); y = ancienmodule * Math.sin(arg); public double distance(point p) { return Math.sqrt(Math.pow(this.x - p.x, 2) + Math.pow(this.y - p.y, 2)); Pour pouvoir tester les méthodes de la classe Point, nous allons utiliser JUnit, un framework de test automatisé 1 [1]. 1 Installation et utilisation de JUnit 1.1 Installation JUnit est un ensemble de classes disponibles sous forme d une archive JAR s appelant junit.jar. On peut charger depuis [1] une archive ZIP contenant l archive JAR nécessaire. On peut la placer n importe où a priori. Il est à noter que si l on utilise Eclipse, l archive JAR est fournie avec Eclipse. 1.2 Utilisation en ligne de commande Si l on veut utiliser JUnit depuis la ligne de commande, il faut inclure l archive junit.jar dans le CLASS- PATH. Au Centre Informatique, l archive se trouve dans /opt/junit3.8.1. Pour pouvoir positionner le CLASSPATH, deux solutions existent : 1 Attention, ici automatisé ne signifie pas que JUnit va écrire les tests automatiquement. Il va simplement simplifier l écriture, le lancement et la gestion des tests. 2

1. positionner la variable d environnement CLASSPATH via la commande export CLASSPATH=$CLASSPATH:/opt/junit3.8.1/junit.jar. Cette commande peut être exécutée dans un terminal (et alors toutes les commandes de compilation et d exécution effectuées dans ce terminal tiendront compte du nouveau CLASSPATH) ou peut être placée dans le fichier d initialisation de votre shell (~/.bashrc, ~/.zshrc etc). 2. donner explicitement le chemin vers l archive à chaque compilation avec javac ou exécution avec java en utilisant l option -classpath. Par exemple : javac -d../classes -classpath../classes:/opt/junit3.8.1/junit.jar *.java java -classpath.:/opt/junit3.8.1/junit.jar fr.supaero.figures.testpoint 1.3 Utilisation avec Eclipse L utilisation d Eclipse facilite grandement la manipulation de JUnit. Pour pouvoir créer une classe de test (nous reviendrons dessus dans ce qui suit), il suffit de cliquer droit sur la classe que l on veut tester, de choisir «JUnit Test Class» et les archives nécessaires seront importées. On peut alors choisir quelles seront les méthodes à tester. Lorsque l on utilise des classes de tests provenant d une source extérieure (lors des TP par exemple), Eclipse ne va ajouter automatiquement les archives nécessaires. Il faut alors cliquer droit sur votre projet, puis choisir «Properties», «Java Build Path», «Librairies» et choisir «Add External Jars». Ajouter ensuite l archive junit.jar que l on peut trouver : au Centre Informatique dans le répertoire /opt/junit3.8.1 ; généralement, dans le répertoire où vous avez installé Eclipse sous plugins/org.junit_3.8.1. Par exemple /usr/share/eclipse-3.0.2/plugins/org.junit_3.8.1. 2 Écrire une classe de test JUnit On peut se demander comment tester. Y-a-t il en particulier une «procédure» classique de test? On a l habitude d utiliser les 3A (Acteur, Action et Assertion) : l acteur est un objet sur le lequel le test va porter ; l action est une action qui consiste à appeler la méthode à tester sur l acteur ; l assertion est une propriété (vraie ou fausse) qui vérifie que l action a bien eu l effet escompté. Par exemple, pour la méthode translater de la classe Point : on initialise un point de coordonnées (1, 2) ; on le translate avec un vecteur (2, 3) ; on vérifie que les nouvelles coordonnées du point sont (3, 5). 2.1 Architecture d une classe de test JUnit Une classe de test minimale est composée des éléments suivants : import junit.framework.testcase; public class TestPoint extends TestCase { public TestPoint (String name){ super(name); 3

protected void setup() { // TestPoint La méthode setup permet d initialiser les acteurs dont on aura besoin dans le test. Elle est appelée avant chaque test, donc les acteurs sont réinitialisés avant chaque test de méthode par exemple. Les acteurs doivent être des attributs de la classe de test, car ils seront manipulés par toutes les méthodes de test de la classe. Par exemple : private Point p; private Point q;... protected void setup() { this.p = new Point(1,2); this.q = new Point(2,3); 2.2 Écriture des méthodes de test Lorsque l on veut écrire une méthode de test pour la méthode translater par exemple, on va écrire une méthode testtranslater. Toutes les méthodes dont le nom commence par test sont considérées comme des méthodes de test. C est dans ces méthodes que nous allons modifier l état des acteurs et vérifier des assertions. Par exemple : public void testtranslater() { p.translater(3,6); Assert.assertEquals(4.0, p.getx(), 0.0); Assert.assertEquals(8.0, p.gety(), 0.0); Les actions correspondent à des appels de méthodes sur les acteurs. Les assertions sont écrites en utilisant la classe Assert qui possède de nombreuses méthodes statiques permettant de vérifier des conditions : assertequals(string expected, String actual) qui permet de vérifier si deux chaînes de caractères sont identiques ; assertequals(double exp, double actual, double delta) qui permet de vérifier que deux réels sont égaux à un delta près ; assertequals(int expected, int actual) qui permet de vérifier que deux entiers sont égaux ; assertfalse(boolean condition) qui permet de vérifier qu une condition est fausse ; asserttrue(boolean condition) qui permet de vérifier qu une condition est vraie ; assertnotnull(object object) qui permet de vérifier qu une poignée ne référe pas null ; assertnull(object object) qui permet de vérifier qu une poignée référe null ; assertsame(object expected, Object actual) qui permet de vérifier que deux poignées référent le même objet (pour l égalité avec equals, utiliser assertequals) ; assertnotsame(object expected, Object actual) qui permet de vérifier que deux poignées ne référent pas le même objet ;... 4

Si une des conditions exprimées via ces méthodes dans une méthode de test n est pas vraie, alors le test échoue. Les messages d erreur sont suffisamment explicites, en particulier le framework vous indique quelle était la valeur attendue et quelle était la valeur réelle. Vous trouverez la javadoc de ces méthodes sur le site de documentation de JUnit (à SUPAERO, en local sur /opt/junit3.8.1/javadoc/index.html). 2.3 Lancement du test Pour «exécuter» la classe de test, on utilise la commande suivante : java junit.textui.testrunner TestPoint On obtient alors la sortie suivante :...F. Time: 0,016 There was 1 failure: 1) testtranslater(testpointmin)junit.framework.assertionfailederror: expected:<8.0> but was:<9.0> at TestPointMin.testTranslater(TestPointMin.java:49) at sun.reflect.nativemethodaccessorimpl.invoke0(native Method) at sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39) at sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25) at TestPointMin.main(TestPointMin.java:57) FAILURES!!! Tests run: 8, Failures: 1, Errors: 0 Le framework nous indique que la méthode testtranslater a échoué et que l assertion qui a échoué attendait un résultat de 8 et a obtenu 9 (la méthode translater de Point est fausse, elle ajoute systèmatiquement 1 à l ordonnée du point). On peut également avoir une sortie graphique avec : java junit.swingui.testrunner TestPoint On obtient alors une interface graphique représentée sur la figure 1. On peut lancer le test depuis la classe de test en écrivant la méthode main suivante dans TestPoint : public static void main(string[] args) { junit.textui.testrunner.run(testpoint.class); En remplaçant junit.textui.testrunner.run(testpoint.class); par junit.swingui.testrunner.run(testpoint.class); dans le main, on utilise l affichage graphique. Il est à noter que sous Eclipse, il suffit d exécuter la classe de test. Voici la classe de test complète pour Point : import junit.framework.test; import junit.framework.testcase; import junit.framework.testsuite; import junit.framework.assert; 5

Fig. 1 Interface graphique de JUnit public class TestPoint extends TestCase { private Point p; private Point q; public TestPoint (String name){ super(name); protected void setup() { this.p = new Point(1,2); this.q = new Point(2,3); public void testgetx() { Assert.assertEquals(1.0, p.getx(), 0.0); public void testgety() { Assert.assertEquals(2.0, p.gety(), 0.0); public void testgetargument() { Assert.assertEquals(Math.acos(p.getX()/p.getModule()), p.getargument(), 0.0); 6

public void testgetmodule() { Assert.assertEquals(Math.sqrt(p.getX() * p.getx() + p.gety() * p.gety()), p.getmodule(), 0.0) public void testsetargument() { p.setargument(3); Assert.assertEquals(3.0, p.getargument(), 1E-10); public void testsetmodule() { p.setmodule(4); Assert.assertEquals(4.0, p.getmodule(), 1E-10); public void testtranslater() { p.translater(3,6); Assert.assertEquals(4.0, p.getx(), 0.0); Assert.assertEquals(8.0, p.gety(), 0.0); public void testdistance() { Assert.assertEquals(Math.sqrt(2), p.distance(q), 0.0); public static void main(string[] args) { junit.textui.testrunner.run(testpoint.class); // TestPoint 2.4 Construire des suites de test Normalement, lorsque l on modifie une partie d un logiciel, une classe par exemple, on doit vérifier que les changements n impactent pas les classes utilisant la classe modifiée. Ce sont des tests de nonrégression. En utilisant JUnit, on ne va pas lancer toutes les classes de test, ce serait trop fastidieux. On peut par contre créer une classe de test regroupant toutes les classes de tests dans une suite de tests. Par exemple, pour les classes de test sur les figures géométriques, on peut écrire la classe suivante : package fr.supaero.figures; import junit.framework.test; import junit.framework.testcase; import junit.framework.testsuite; import junit.framework.assert; /** * <code>testgeneral</code> est une classe permettant de lancer tous * les tests. * * @author <a href="mailto:garion@supaero.fr">christophe Garion</a> * @version 1.0 7

*/ public class TestGeneral { public static void main(string[] args) { junit.textui.testrunner.run(suite()); public static Test suite() { TestSuite suite = new TestSuite("Tous les tests sur les figures"); suite.addtest(new TestSuite(TestPolygone.class)); suite.addtest(new TestSuite(TestPoint.class)); suite.addtest(new TestSuite(TestPointNomme.class)); suite.addtest(new TestSuite(TestSegment.class)); suite.addtest(new TestSuite(TestEnsemblePoint.class)); return suite; On peut remplacer junit.textui.testrunner.run(suite()) par junit.swingui.testrunner.run(testgeneral.class) si l on veut utiliser l interface graphique. Références [1] JUnit. http://www.junit.org. 8