La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

ITI1520 Lab #7 Classes librairies et Testing avec JUnit Daniel Amyot, Diana Inkpen, Alan Williams.

Présentations similaires


Présentation au sujet: "ITI1520 Lab #7 Classes librairies et Testing avec JUnit Daniel Amyot, Diana Inkpen, Alan Williams."— Transcription de la présentation:

1 ITI1520 Lab #7 Classes librairies et Testing avec JUnit Daniel Amyot, Diana Inkpen, Alan Williams

2 Objectifs Sujets abordés: –Classes librairies –Test avec JUnit –String vs. char[] Dans ce laboratoire, vous allez créer votre propre classe librairie et apprendre comment créer et exécuter des tests pour les méthodes de votre classe.

3 Une classe “librairie” Créez une classe appelée MaMath qui implémente les méthodes suivantes, mais SANS utiliser la classe Math de l’environnement de développement Java. 1.Une méthode qui retourne la valeur absolue d’un entier x. 2.Une méthode qui calcule x y pour des entier x et y. Utilisez une boucle qui multiplie x par lui- même y fois. Supposez que y ≥ 0 Pas de lecture au clavier ou d’affichage à l’écran!

4 Algorithme pour valeur absolue DONNÉES:X(un entier) RÉSULTATS:AbsX(la valeur absolue de X) EN-TÊTE:AbsX  Abs( X ) MODULE: X  0 AbsX  – XAbsX  X faux vrai

5 Algorithme pour puissance DONNÉES:X, Y(deux entiers) RÉSULTATS:XàlaY(valeur de X Y ) INTERMÉDIAIRES:Compteur (compte combien de fois X a été multiplié par lui-même) EN-TÊTE: XàlaY  Pow( X, Y ) MODULE : Compteur ≤ Y XàlaY  XàlaY  X Compteur  Compteur + 1 faux vrai XàlaY  1 Compteur  1

6 Interagir avec la classe librairie Une fois votre classe compilée avec succès, vous pouvez invoquer ses méthodes à partir d’autres méthodes, incluant la méthode main() d’une autre classe (ou vous pourriez interagir avec l’utilisateur) Il est cependant plus simple d’invoquer les méthodes créées via la fenêtre d’interactions de DrJava. N’oubliez pas de spécifier le nom de la classe auparavant p.e., MaMath.abs(-8) Essayez quelques invocations! Peut se faire avec les classes de Java. Exemple: p.e., Math.random()

7 Test Nous allons maintenant faire quelques tests pour les méthodes de la classe MaMath. Lorsque l’on teste, il faut: 1.Invoquer la méthode avec des valeurs passées en paramètres. 2.Observer les résultats. 3.Vérifier si les résultats sont ceux attendus. Il faut donc sélectionner des valeurs pour lesquelles vous pourrez déterminer les résultats attendus (par d’autres moyens).

8 Test manuel Essayez de tester votre classe en exécutant sa méthode et en fournissant des valeurs variées pour x et y. –Sélectionnez vos valeurs avec soin afin de couvrir différents chemins dans le module de l’algorithme. Pour la méthode calculant la valeur absolue: –Essayez pour x des valeurs plus petites que zéro, égale à zéro, et plus grandes que zéro. Pour la méthode calculant la puissance: –Essayez y = 0, y = 1, y > 1 –Essayez x 1 Quels sont les problèmes de cette approche (surtout si vous changes votre code)?

9 Test avec JUnit Les interactions dans la fenêtre DrJava sont amusantes mais inefficaces lorsque les méthodes à tester sont complexes. Les tests doivent de plus être refaits manuellement à chaque fois qu’on modifie la méthode. JUnit est un ensemble de classes que vous pouvez ajouter à l’environnement de développement Java afin de faciliter et d’automatiser le test. Le nom JUnit vient de “Java unit”. –Le test unitaire (unit testing) consiste à tester des parties d’une application complète (p.e. les méthodes d’une classe librairie) –Pour plus d’informations: http://junit.orghttp://junit.org

10 Concepts de base en JUnit Verdict: chaque test peut passer (vert) ou échouer (rouge). Cas de test (test case): une expérience visant à savoir si une méthode produit les bons résultats pour un ensemble donné de valeurs passées en paramètres. –Représenté par une méthode dans une classe de test. –Il peut y avoir autant de méthodes que désirées dans une classe de test. Class de test: contient un ensemble de cas de test pour une classe. –Habituellement, il existe une classe de test correspondant à chaque classe que vous voulez tester.

11 Création d’une classe de test Assurez-vous d’avoir chargé la classe MaMath dans Dr. Java Dans Dr. Java, dans le menu ‘File’, sélectionnez “Create new JUnit test case…” On vous demandera le nom de la classe de test. Entrez: MaMathTest. –Il est important d’inclure le mot “Test” dans le nom de la classe; c’est de cette façon que JUnit trouve les classes de test (version 3.x). –JUnit version 4 utilise une autre convention (@Test). Nous utiliserons la version 3. Le résultat devrait être semblable au code de la page suivante.

12 Classe de test (DrJava) import junit.framework.TestCase; /** * A JUnit test case class. * Every method starting with the word "test" will be called * when running the test with JUnit. */ public class MaMathTest extends TestCase { /** * A test method. * (Replace "X" with a name describing the test. You may * write as many "testSomething" methods in this class as * you wish, and each one will be called when running * JUnit over this class.) */ public void testX() { }

13 Éléments de la classe test import junit.framework.TestCase; –Nous utiliserons la classe TestCase incluse dans JUnit. On retrouve après le nom de la classe: extends TestCase –Ceci (héritage) indique que la classe va agir comme un cas de test, tel que défini par Junit. Une méthode vide qui retourne un résultat vide (void) et qui n’a pas de paramètres. –JUnit considère cette méthode comme un cas de test. –La méthode devrait être renommée testXXX où XXX est un nom qui indique l’intention (le but) du test.

14 Création d’une méthode de test Créons un test pour la méthode calculant la valeur absolue. Cette méthode accepte une valeur en paramètre; nous devons fournir une valeur de test pour ce paramètre. –Exemple: si on invoque abs(-4), nous devrions obtenir 4 comme résultat. –Fixons trois valeurs: valeurTestX : le -4 utilisé comme valeur de test. attendue : le résultat attendu, 4 retournée : le résultat retourné par l’invocation de abs(-4).

15 Vérification du résultat Une partie importante du processus de test consiste à vérifier que le résultat obtenu correspond à ce qui était attendu. Le résultat est un verdict: passe (pass) ou échoue (fail). Avec JUnit, il existe une méthode de la classe Assert appelée Assert.assertEquals( attendue, retournée ) –Si les valeurs attendue et retournée sont égales, alors l’exécution du test continuera. –Si les valeurs ne sont pas égales, alors le cas de test aura échoué à ce point. L’exécution de la méthode de test termine à cet endroit. Si la fin de la méthode de test est atteinte sans aucun échec, alors le test aura passé avec succès.

16 La méthode assertEquals Il existe quelques versions de la méthode assertEquals afin de comparer plusieurs types de données. –La valeur attendue est toujours le premier paramètre, et la valeur retournée le deuxième: Assert.assertEquals( int, int ) Assert.assertEquals( char, char ) Assert.assertEquals( boolean, boolean ) Assert.assertEquals( String, String ) Assert.assertEquals( double, double, double ) –Pour tester l’égalité de deux nombres réels, il faut fournir un 3e paramètre qui indique la différence maximale acceptée pour que les deux valeurs soient considérées comme “égales” (par exemple 0.00001 ) Rappelez-vous la section 6 des notes qui traite du sujet…

17 Entrez une méthode de test Remplacez la méthode vide testX avec : public void testAbsNégatif() { // But: teste que abs() fonctionne pour une valeur < 0. int valeurTestX; // Donnée de test pour la méthode invocatrice int attendue; // Valeur attendue comme résultat int retournée; // Valeur retournée par la méthode // Donnée de test pour la méthode valeurTestX = -4; // Résultats attendus et retournés attendue = 4; retournée = MaMath.abs( valeurTestX ); // Vérifie si nous avons obtenu la valeur attendue Assert.assertEquals( attendue, retournée ); }

18 Un détail de plus… Ajoutez, au haut de votre classe: import junit.framework.Assert; Ceci permettra d’utiliser la méthode assertEquals de la classe JUnit Assert.

19 Compiler les tests Assurez-vous d’avoir les classes MaMath et MaMathTest chargées dans Dr. Java. Appuyez sur le bouton ‘Compile all’. Après quelques secondes, le bouton ‘Test’ devrait être disponible. –À moins qu’il n’y ait un problème de compilation…

20 Problème potentiel avec DrJava Si l'installation par défaut ne fonctionne pas avec l'erreur suivante: Error: package junit.framework does not exist il faudra ajouter junit.jar à votre installation Java et indiquer à DrJava où se trouve ce fichier: Copiez http://www.site.uottawa.ca/~damyot/iti1520/lab/junit.jar (à peu près 120 ko) sur votre ordinateur (p.e. sur le Desktop) http://www.site.uottawa.ca/~damyot/iti1520/lab/junit.jar Trouvez où se trouve le répertoire lib de votre installation JDK (le mien est à C:\Program Files\Java\jdk1.5.0_09\lib) Déplacez le fichier junit.jar dans ce répertoire lib Démarrez DrJava (suite page suivante)

21 Problème potentiel avec DrJava Edit > Preferences > Cliquez dans la zone "Extra Classpath" (devrait être sur le premier onglet, sinon sélectionnez "Resource Locations" dans le panneau de gauche) > Cliquez sur Add > ajoutez à la liste le junit.jar situé dans votre répertoire lib Sélectionnez "Apply".

22 Exécuter les tests Appuyez sur le bouton “Test”. Rapport De test Bouton Test Barre Passe/ Échoue

23 Résultats de JUnit JUnit montre toujours une barre colorée après l’exécution des tests: –Vert: tous les tests ont passé –Rouge: au moins un test a échoué. –Slogan JUnit : “if the bar is green, the code is clean”! Sinon, l’erreur peut être dans le test ou dans l’application… Les messages d’erreurs sont affichés dans le rapport.

24 Ajoutons un test qui va échouer Ajoutez une deuxième méthode à votre classe. Cette fois, nous ferons échouer ce test délibérément. –Invoquons abs(4) avec -4 comme valeur attendue (ce qui est incorrect)

25 Résultat affiché pour un test échoué

26 Le rapport de test MaMathTest testAbsNégatif testAbsPositif File: C:\...\MaMathTest.java [line: 41] Failure: attendue: but was: Les tests qui ont passé sont affichés en vert, et ceux qui ont échoué en rouge. Pour chaque échec, vous obtenez: –Le numéro de la ligne où l’échec a été observé. –Le résultat de la comparaison Affichés entre au cas où vous auriez des chaînes de caractères avec espaces comme valeurs.

27 Essayez d’ajouter ces méthodes de test Valeur absolue –Donnée pour test: 0 –Donnée pour test : >= 1 Puissance: –x > 1, x = 1, x = 0, x < 0 –y = 0, y = 1, y > 1, y pair/impair quand x < 0

28 Si le temps le permet… Ajoutez les méthodes mathématiques suivantes à votre classe MaMath de même que les tests appropriés dans MaMathTest –carré(int n) : retourne le carré de n Faites des tests avec n=40000 et n=50000. Que remarquez- vous? –arrondi(double n) : retourne la valeur entière arrondie de n. Hypothèse: la valeur arrondie de n est représentable par un entier (~ -2 milliards à +2 milliards). Note: Math.floor(x) retourne un nombre réel représentant un entier plus petit ou égal au réel x: –Math.floor(3.6) retourne 3.0 –Math.floor(-3.2) retourne -4.0 Exemples: –MaMath.arrondi(3.9) donne 4 –MaMath.arrondi(3.1) donne 3 –MaMath.arrondi(3.5) donne 4 –MaMath.arrondi(-1.2) donne -1 –MaMath.arrondi(-1.5) donne -1 –MaMath.arrondi(-1.6) donne -2

29 String vs. char[] Ressemblances: –Tout deux sont des collections de caractères –Tout deux indexés de 0 jusqu’à length - 1 –Tout deux sont des variables de référence Pas de comparaison ==

30 String vs. char[] Différences: –Accès à un seul caractère: str.charAt(i) vs array[i] –Les caractères d’une chaîne String ne peuvent pas être modifiés facilement après la création de la chaîne. Pas d’équivalent à array[i] = 'x' –Les variables String peuvent se voir assigner des constantes où l’utilisation de new est optionnelle. String str; str = "abc"; str = new String( "def" ); –La plupart des opérations sur les Strings sont faites avec des méthodes. array.length // pas de ( ): attribut et non une invocation str.length( ) //() obligatoire: invocation d’une méthode

31 Conversions: String  char[] char[] tableau; char[] tableau2; String str;... // Créer un String à partir d’un tableau str = new String( tableau ); // Créer un tableau à partir d’un String tableau2 = str.toCharArray( );

32 Méthodes usuelles de String Informez-vous sur les méthodes comprises dans la classe String: http://java.sun.com/javase/6/docs/api/java/lang/String.html charAt(…), indexOf(…), length(…) toCharArray(…) equals(…), compareTo(…) concat(…), substring(…), toLowerCase(…), toUpperCase(…) …

33 Attention! Pour les chaînes de caractères String: –Utilisez le guillemet droit ( " ) –N’utilisez pas: “, ”, « ou » Pour les tableaux de caractères: –Utilisez l’apostrophe droit ( ' ) –N’utilisez pas: ‘ ou ’

34 Exercices sur les String et char[] Onglet Interactions dans Dr Java –Utilisez des constantes String de votre choix et essayez d’invoquer les fonctions usuelles de la classe String. Par exemple: "012345678".length() "12345".charAt(4) puis “12345”.indexOf('4') "minuscule".toUpperCase() "A".compareTo("a") (et l’inverse?) "joyeuses".concat(" ").concat("fêtes") String s1="ab"; String s2="ab"; s1.equals(s2) (et s1==s2 ?) String s3="merci"; char[] tabS3= s3.toCharArray(); tabS3[0]

35 Si le cœur vous en dit… Écrivez une méthode compteMinuscule qui compte le nombre de caractères minuscules dans un objet String. Testez-la dans l’onglet Interaction. (Plus avancé) Écrivez une méthode renverseMinusMajus qui prend un objet String en paramètre et qui change les caractères minuscules en majuscules et réciproquement.


Télécharger ppt "ITI1520 Lab #7 Classes librairies et Testing avec JUnit Daniel Amyot, Diana Inkpen, Alan Williams."

Présentations similaires


Annonces Google