BlueJ_VI 1 Java, les objets : tout de suite ! Test, assertions, « vérification statique » Notes de cours associées au chapitre 6 Avec des assertions, utilisation.

Slides:



Advertisements
Présentations similaires
Un environnement de développement éducatif
Advertisements

Spécialisation/généralisation Héritage Polymorphisme
Gestion des événements (suite)
Au programme du jour …. Ce que vous navez pas encore vu Constantes et variables de classe Main et Tests Utilisation de lAPI Existence des packages Existence.
Au programme du jour …. Introduction à lhéritage Un concept important de la programmation objet Livraison de code Organisation des répertoires et packages.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Android View, onClick, Activity, Modèle Vue Contrôleur
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
PILOTE - Sous Projet PILOTE SOUS-PROJET 5 Cyril Carrez, Elie Najm, Alexandre Tauveron.
Programmer en JAVA par Tama
Algorithme et structure de données
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe
ESCPI 1 Programmation par contrats Une méthode appelée Appel de la méthode Si le contrat est respecté : Pré-assertions Lappelant En retour le contrat est.
26/05/071 Présentation de JUnit Partie 2 NICOLAS BOUSSEKEYT CNAM
High Frequency Trading Introduction. Séminaires de 30 minutes, une fois par semaine (8 en tout) Sujets abordés – Définition dun algorithme et introduction.
Les entrées /sorties en Java François Bonneville
Test intégré de composants basé sur les contrats Apinya TANGKAWANIT.
بسم الله الرحمن الرحيم. Institut Supérieure des Etudes Technologiques de Kébili.
Connexion base de données
Chapitre IV Object, interfaces, classes imbriquées.
Tests Programmation par contrats
BlueJ_XI 1 Java, les objets : tout de suite ! Gestion des erreurs : les exceptions Notes de cours associées au chapitre 11 tutorial BlueJ
CYCLE 3 : Alternatives Faire des choix dans un programme en C 1- AIGUILLAGE SIMPLE sur CONDITION : if-else 2-AIGUILLAGE MULTIPLE sur CONDITIONS if-else.
Récursivité.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
POO-L3 H. Fauconnier1 Chapitre IV 1. classe Object, clonage 2. interfaces 3. classes internes et imbriquées.
Faculté I&C, Claude Petitpierre, André Maurer 1 Java.
Langage Oriente Objet Cours 4.
Cours du 19 octobre. POO-L3 H. Fauconnier2 E) Constructeurs et héritage Le constructeurs ne sont pas des méthodes comme les autres: le redéfinition na.
Premier cours (23 septembre). Cours programmation- orientée objet en Java Licence dinformatique Hugues Fauconnier
Master 1 SIGLIS java Lecteur Stéphane Tallard Chapitre 4 – Structures de contrôle.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
F Copyright © Oracle Corporation, Tous droits réservés. Créer des programmes avec Procedure Builder.
Complément Le diagramme des classes
Le patron de conception « Strategy » Simon Durocher ( )
Programmation par Objets et Java
Structures de données IFT-2000
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 7 : Classes et fonctions paramétrables Département.
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
JUnit Présentation complète de JUnit et « guide d’utilisation » en 13 transparents.
CERN IT Department CH-1211 Genève 23 Switzerland t Get the most of Office 2007! Bruno Lenski, IT/OIS.
Présentation Structures de Données et TDA
1 CSI 2532 Lab5 Installation de JDBC Février 13, 2012.
Multi-Thread Jian-Yun Nie
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Piles Premier arrivé, dernier servi: LIFO (Last In, First Out) Liste à usage restreint: Enlève et insère un élément seulement à un bout de la liste. Notation:
Chapitre 9 Les sous-programmes.
Cours 11 Threads. Chapitre X threads threadPOO-L3 H. Fauconnier3 Threads threads: plusieurs activités qui coexistent et partagent des données exemples:
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI1502 Principes fondamentaux en conception des logiciels Chapter 8: Gestion des exceptions.
Java, les objets : tout de suite ! Rassembler, grouper les objets
BlueJ_I_II 1 Java, les objets : tout de suite ! Notes de cours associées a ces deux chapitres
Proxy et plus Cnam Paris jean-michel Douin, douin au cnam point fr
Structures de données IFT-10541
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Différencier: NOMBRE PREMIER vs. NOMBRE COMPOSÉ
Branche Développement Le présent document contient des informations qui sont la propriété de France Télécom. L'acceptation de ce document par son destinataire.
27/02/2006L3 MIAGE - GLO ADA1 Les Paquetages Permettent d’encapsuler un groupe d’entités logiquement reliées. Comme toute unité de programme, le paquetage.
Objectifs À la fin de ce cours, vous serez capables de :
AOP dans .Net avec PostSharp
Ch. PAUL - Piles et Files à l'aide de listes chainées
Implémentation Ada Gestion de la mémoire. Put 20 L'affectation de Comptes (σ-modèle) La sémantique intuitive des comptes ne laisse guère de place à l'affectation.
LES PILES ET FILES.
Packages et Types De la Spécification Formelle A l'implémentation Ada.
Types Abstraits.
Cours 7 Classes locales Clonage Divers: tableaux.
Héritage Conception par Objet et programmation Java
BlueJ_VII 1 Java, les objets : tout de suite ! Conception de classes (1) Notes de cours associées au chapitre 7 tutorial BlueJ
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
Transcription de la présentation:

BlueJ_VI 1 Java, les objets : tout de suite ! Test, assertions, « vérification statique » Notes de cours associées au chapitre 6 Avec des assertions, utilisation de Jass et ESC/Java tutorial BlueJ Cnam Paris jean-michel Douin, Version du 13 février 2003 Ce support accompagne, référence le livre de David J. Barnes & Michael Kölling Objects First with Java A Practical Introduction using BlueJ Pearson Education, 2003 ISBN

BlueJ_VI 2 Sommaire Test lesquels ? tests unitaires avec Bluej Evite le Débogage ? Complémentaire Règles de conception des tests, non régression ou comment faciliter les évolutions du logiciel Assertions en java depuis Les extras JASS : ESC/Java : une présentation :

BlueJ_VI 3 Selon M.Grand, Patterns in Java Vol 2, ISBN Wiley Tests lesquels ? Black Box Testing White Box Testing Unit Testing Integration Testing System Testing Regression Testing Acceptance Testing Clean Room Testing

BlueJ_VI 4 Black Box Testing S assurer que le logiciel respecte les spécifications annoncées. Ces spécifications sont souvent décrites comme des commentaires associés aux sources. Les tests ne portent pas sur les choix d implantation, ne concernent que les méthodes publiques

BlueJ_VI 5 White Box Testing La conception de tests d un logiciel en ayant la connaissance de son implémentation Tests des cas limites en fonction des types de données utilisés Numérique : nombre min, zéro, nombre max Dépassement de capacité d une structure de données État d une instance

BlueJ_VI 6 Unit Testing Tests individuels d une classe Consignés, mais comment ? Facilités avec BlueJ Fenêtre(s) Inspector, mais éphémère, pas de traces des différents tests (BlueJ 1.4 ?) Quelles situations critiques ? Quel enchaînement des méthodes ?

BlueJ_VI 7 Integration et System Testing Intégration Tests individuels de plusieurs classes effectués séparément System Test du programme dans son environnement, au sein d un système d exploitation

BlueJ_VI 8 Regression Testing Conserver les tests d un logiciel. Une modification du logiciel engendre de nouveau l application des tests et permet de vérifier l absence d une nouvelle erreur Chaque modification doit au moins respecter les tests de la version précédente Comment éviter qu un logiciel se dégrade...

BlueJ_VI 9 Acceptance et Clean Room Testing Tests effectués par le client...

BlueJ_VI 10 Un exemple : une calculette à pile

BlueJ_VI 11 L interface Calculator /** Code 6.4 page 155 */ public interface Calculator{ public int getDisplayValue(); public void numberPressed(int number); public void plus(); public void minus(); public void equals(); public void clear(); }

BlueJ_VI 12 La calculette post fixée utilise une pile devient 3 empiler(3) 2empiler(2) +empiler( dépiler() + dépiler()) Le résultat est au sommet de pile

BlueJ_VI 13 Une pile d entiers La pile est bornée alors Que se passe t-il lorsque l on tente d empiler sur une pile pleine ? Et dans tous les cas Que se passe t-il lorsque l on tente de dépiler une pile vide ?

BlueJ_VI 14 Documentation utilisateur de la Pile public class Pile{ /** empile un entier au sommet de la pile * si la est pile pleine, cette méthode n a aucun effet public void empiler(int i); /** dépile un entier * si la pile est vide, cette méthode retourne -1 */ public int dépiler(); /** cette méthode n a aucun effet ?, /** cette méthode retourne -1, si le dernier entier empilé était -1 ??? Une première solution les assertions

BlueJ_VI 15 Une première solution : les assertions En attendant les exceptions usage de assert (1.4, BlueJ (Tools -> Preferences)) assert ExpressionBooléenne; assert ExpressionBooléenne : " Message à la console " ; L expression booléenne doit être vraie, sinon le programme s arrête et le message est affiché public int dépiler(){ assert !EstVide(): " dépiler sur une pile vide!!! " ; // le code ici

BlueJ_VI 16 La classe Pile public class Pile{ public final static int TAILLE_MIN =1; public final static int TAILLE_MAX = 1000; private int[] zone; private int ptr; /** requires !estPleine(); */ public void empiler(int i){ assert !estPleine(); zone[ptr] = i; ptr++; } /** requires !estVide(); */ public int dépiler(){ assert !estVide(); ptr--; return zone[ptr]; }

BlueJ_VI 17 La classe Pile le constructeur /** Création d une pile. * requires taille >= TAILLE_MIN && taille taille un nombre compris entre TAILLE_MIN et TAILLE_MAX */ public Pile(int taille){ assert taille >= TAILLE_MIN && taille <= TAILLE_MAX; ptr = 0; zone = new int[taille]; }

BlueJ_VI 18 La classe Pile, suite public int sommet(){ assert !estVide(); return zone[ptr-1]; } public boolean estVide(){return ptr==0; } public boolean estPleine(){return ptr==zone.length;} public boolean taille(){return ptr;} public boolean equals(Object o){... public String toString(){...

BlueJ_VI 19 Test de la classe Pile avec BlueJ

BlueJ_VI 20 Pile : WhiteBox Testing ? 1) Ajout de la méthode whiteBoxTesting à la classe Pile selon ce schéma private final static boolean TESTING_ON = true; public final static boolean whiteBoxTesting(){ if(TESTING_ON){ // compilation conditionnelle // ici les tests pertinents … return true; }else{ return false; } ce schéma pourquoi ? si le booléen TESTING_ON est false, le code n est pas généré cette méthode retourne false ( compilation conditionnelle en java (assert fonctionne de la même façon))

BlueJ_VI 21 la méthode de classe whiteBoxTesting, assert public static boolean whiteBoxTesting(){ if(TESTING_ON){ // compilation conditionnelle Pile p = new Pile(10); assert p.ptr==0; assert p.zone!=null && p.zone.length==10; int indice = p.ptr; p.empiler(3); assert indice+1 == p.ptr && p.zone[indice] == 3; assert p.ptr == 1; indice = p.ptr; int res = p.dépiler(); assert indice-1 == p.ptr; assert res == p.zone[p.ptr]; boolean état = p.estVide(); assert p.ptr == 0; while(!p.estPleine()) p.empiler(res++); assert p.ptr==p.zone.length; return true; }else{ return false; }

BlueJ_VI 22 whiteBoxTesting avec BlueJ

BlueJ_VI 23 Traces d exécution avec BlueJ assertError : un exemple, l élément en p.zone[indice] est différent de 3 Le test est passé Avec éventuellement un Message

BlueJ_VI 24 whiteBoxTesting, &=, Code 6.3 page 154 public static boolean whiteBoxTesting(){// sans assert, avec &= if(TESTING_ON){ boolean passed = true; Pile p = new Pile(10); passed &= p.ptr==0; passed &= p.zone!=null && p.zone.length==10; int indice = p.ptr; p.empiler(3); passed &= indice+1 == p.ptr && p.zone[indice] == 3; passed &= p.ptr == 1; indice = p.ptr; int res = p.dépiler(); passed &= indice-1 == p.ptr; passed &= res == p.zone[p.ptr]; boolean état = p.estVide(); passed &= p.ptr == 0; while(!p.estPleine()) p.empiler(res++); passed &= p.ptr==p.zone.length; return passed; }else{ return false; }

BlueJ_VI 25 Discussion &= ou assert

BlueJ_VI 26 BlackBox Testing ? Uniquement les méthodes publiques de la classe Pile public static boolean blackBoxTesting(){ if(TESTING_ON){ Pile p = new Pile(3); assert p.estVide() && p.taille()==0; Pile p1 = new Pile(20); assert p1.estVide() && p1.taille() == 0; Pile p4 = new Pile(Pile.TAILLE_MIN); assert p4.estVide(); Pile p5 = new Pile(Pile.TAILLE_MAX); //Pile p6 = new Pile(0); // déjà dans le contrat de Pile

BlueJ_VI 27 blackBoxTesting suite // méthodes empiler, dépiler, sommet, estVide et estPleine p.empiler(5); assert p.sommet()==5 :"erreur sommet() ou empiler()"; assert p.taille() == 1 :"erreur taille()"; assert !p.estVide() :"erreur estVide()"; assert !p.estPleine() :"erreur estPleine()"; int res = p.dépiler(); assert res == 5 :"erreur dépiler"; assert p.estVide() && !p.estPleine(); int donnée = 0; assert p.estVide(); p.empiler(donnée++); assert !p.estVide() && !p.estPleine(); p.empiler(donnée++); assert !p.estVide() && p.estPleine(); assert p.sommet() == donnée-1;

BlueJ_VI 28 blackBoxTesting suite assert p.toString().equals("[4,3,2,1,0]") : "erreur toString()"; p1 = new Pile(10); Pile p2 = new Pile(10); while(!p.estVide()){ int i = p.dépiler(); p1.empiler(i); p2.empiler(i); } assert p.toString().equals("[]") : "erreur toString()"; assert !p1.estVide() && !p1.estPleine(); assert !p2.estVide() && !p2.estPleine(); assert p1.equals(p2); p1.dépiler(); assert !p1.equals(p2); p1.empiler(10); assert !p1.equals(p2); p1.dépiler();p2.dépiler(); assert p1.equals(p2); assert p1.toString().equals(p2.toString()); assert !p1.equals(new String("une pile")); /* … */

BlueJ_VI 29 Test Exhaustif ? Non, dans la plupart des cas Imaginer un compilateur Java, les tests sont infinis !! Quelles méthodes ? Couverture de tests, noter ce que les tests utilisent comme code Les tests sont insuffisants, ils permettent d augmenter la confiance en ce logiciel, c est tout

BlueJ_VI 30 Unit Testing et BlueJ p.empiler(5); (BlackBox) 2 inspecteurs : whiteBox

BlueJ_VI 31 Unit Testing et BlueJ p.empiler(6);

BlueJ_VI 32 La calculette post fixée utilise une pile public class CalculettePostFixée implements Calculator private Pile pile; /* le code ici */ public final static boolean whiteBoxTesting(){ if(TESTING_ON){ CalculettePostFixée calc = new CalculettePostFixée(); assert calc.pile != null && calc.pile.taille() == 0; calc.numberPressed(15); assert calc.pile.sommet()==15; calc.numberPressed(-20); assert calc.pile.sommet()==-20; calc.plus(); assert calc.pile.sommet()==-5; /*... à compléter */ return true; }else{ return false; }

BlueJ_VI 33 Calculette PostFixée public final static boolean blackBoxTesting(){ if(TESTING_ON){ Calculator calc = new CalculettePostFixée(); // , calc.numberPressed(23); calc.numberPressed(17); calc.plus(); calc.equals(); assert calc.getDisplayValue() == 40; // 7 - à compléter return true; }else{ return false; } }

BlueJ_VI 34 Integration testing Toutes les classes peuvent être réunies, par une séquence analogue à, La classe Pile assert Pile.whiteBoxTesting(); assert Pile.blackBoxTesting(); La classe CalculettePostFixée assert CalculettePostFixée.whiteBoxTesting(); assert CalculettePostFixée.blackBoxTesting(); La classe...

BlueJ_VI 35 Test de non-régression à Chaque modification du source nous devons avoir : assert Pile.whiteBoxTesting(); assert Pile.blackBoxTesting(); assert CalculettePostFixée.whiteBoxTesting(); assert CalculettePostFixée.blackBoxTesting(); les test unitaires peuvent être consignés...

BlueJ_VI 36 Les extras Les extras ne sont pas dans le livre, mais ils méritent le détour ! JASS ESC/Java une présentation : Assertions et Jass : Vérification de propriétés, à l exécution ESC/Java Vérification des propriétés à l analyse du source

BlueJ_VI 37 Jass Oldenburg Assertions vérifiées à l exécution installées dans le source Java sous forme de commentaires /** require une expression à valeur booléenne **/ /** ensure **/ invariant de classe /** invariant

BlueJ_VI 38 TicketMachine page 35, code 2.8 public class TicketMachine implements Cloneable{ … /** * Create a machine that issues tickets of the given price. */ public TicketMachine(int ticketCost){ /** require ticketCost >0; **/ price = ticketCost; balance = 0; total = 0; /** ensure balance == 0 && total == 0 && price == ticketCost; **/ } /** * Return The price of a ticket. */ public int getPrice(){ return price; /** ensure Result == price; changeonly{}; **/ } /** * Return The amount of money already inserted for the next ticket. */ public int getBalance(){ return balance; /** ensure Result == balance; changeonly{}; **/ }

BlueJ_VI 39 ESC/Java Compaq Analyse du Source Aide à la détection d erreurs Sources Java / requires, ensures, invariant Deux exemples TicketMachine page 35 code 2.8 La Pile d entiers

BlueJ_VI 40 TicketMachine page 35, code 2.8 public class TicketMachine{ …… invariant balance >= 0 && price > 0 && total >= 0; /** * Create a machine that issues tickets of the given price. */ requires ticketCost >0 ensures balance == 0 && total == 0 && price == ticketCost public TicketMachine(int ticketCost){ … /** The price of a ticket. */ ensures \result == price; public int getPrice(){…

BlueJ_VI 41 TicketMachine page 35, code 2.8 /** * Return The amount of money already inserted for the * next ticket. */ ensures \result == balance; public int getBalance() /** * Receive an amount of money in cents from a customer. * Check that the amount is sensible. */ modifies balance; ensures (amount>0 && balance == \old(balance) + amount) || (amount <=0 && balance == \old(balance)); */ public void insertMoney(int amount)

BlueJ_VI 42 TicketMachine page 35, code 2.8 /** * Print a ticket if enough money has been inserted, and * reduce the current balance by the ticket price. Print * an error message if more money is required. */ modifies total, balance; ensures balance>=price && total == \old(total)+price && balance == \old(balance)-price || balance<price; */ public void printTicket(){ } /** * Return the money in the balance. * The balance is cleared. */ modifies balance; ensures \result == \old(balance) && balance ==0; public int refundBalance()

BlueJ_VI 43 Analyse statique du source passed d:/esc/escjava TicketMachine.java ESC/Java version 1.2.4, 27 September 2001 TicketMachine... TicketMachine: TicketMachine(int)... [0.161 s] passed TicketMachine: getPrice()... [0.04 s] passed TicketMachine: getBalance()... [0.13 s] passed TicketMachine: insertMoney(int)... [0.06 s] passed TicketMachine: printTicket()... [0.11 s] passed TicketMachine: refundBalance()... [0.02 s] passed

BlueJ_VI 44 La Pile d entiers en ESC public class Pile{ public final static int TAILLE_MIN =1; public final static int TAILLE_MAX = 1000; private spec_public */ int[] zone; private spec_public */ int ptr; invariant ptr >= 0 && ptr <= zone.length; invariant zone != null; requires taille >= TAILLE_MIN && taille <= TAILLE_MAX; ensures ptr == 0 && zone.length == taille; public Pile(int taille){ ptr = 0; zone = new int[taille]; }

BlueJ_VI 45 Pile et ESC/Java, empiler, depiler, estVide, estPleine requires ptr < zone.length; modifies ptr, zone[ptr-1]; ensures \old(ptr) + 1 == ptr && zone[\old(ptr)] == i; public void empiler(int i){ zone[ptr] = i; ptr++; } requires ptr > 0; modifies ptr; ensures \old(ptr)-1==ptr && \result ==zone[ptr]; public int depiler(){ ptr--; return zone[ptr]; } ensures \result == (ptr==0); public boolean estVide(){ return ptr==0; } ensures \result == (ptr==zone.length); public boolean estPleine(){ return ptr==zone.length; }

BlueJ_VI 46 Pile et ESC/Java, taille,equals, toString // pas de requires ni also_requires ici, … à voir... public boolean equals(Object o){ if(o instanceof Pile){ assume o!=null && \typeof(o) == \type(Pile); Pile p = (Pile) o; return this.zone.length == p.zone.length && this.ptr == p.ptr && this.memeContenu(p); }else{ return false; } } requires p != null && p.zone != null; requires p.ptr == ptr; ensures \result == (\forall int i;(i>=0 && i zone[i] == p.zone[i]);*/ private boolean memeContenu(Pile p){

BlueJ_VI 47 ESC/Java whiteBox Testing TESTING_ON == true; private final static boolean TESTING_ON = true; public static boolean whiteBoxTesting(){ if(TESTING_ON){ // compilation conditionnelle Pile p = new Pile(10); p.ptr==0 && p.zone != null; p.zone.length == 10; int indice = p.ptr; p.empiler(3); indice+1 == p.ptr && p.zone[indice] == 4; p.ptr == 1; indice = p.ptr; int res = p.depiler(); indice-1 == p.ptr && res == p.zone[p.ptr]; boolean etat = p.estVide(); p.ptr == 0; while(!p.estPleine()) p.empiler(res++); p.ptr==p.zone.length; return true; }else{ return false; }

BlueJ_VI 48 whiteBox Testing une trace ESC Pile: whiteBoxTesting() Pile.java:99: Warning: Possible assertion failure (Assert) p.empiler(3); indice+1 == p.ptr && p.zon... ^ Execution trace information: Executed then branch in "Pile.java", line 96, col 18. Analyse statique et erreur détectée voir le transparent 23

BlueJ_VI 49 BlackBox Testing Les expressions ESC/Java ne peuvent comporter des appels de méthodes

BlueJ_VI 50 Résumé, synthèse Tests unitaires : voir Voir JML + JUnit La nouvelle version de BlueJ ? De nouveaux abordés au chapitre 12 JASS ( avec héritage) Programmation par contrat Comparaison entre Pile et java.util.Stack ? Comment ? Conception des tests à l aide de Pattern (Décorateur) …

BlueJ_VI 51 Documentation, avec JML jmldoc Pile.java