Tests Programmation par contrats

Slides:



Advertisements
Présentations similaires
Module Systèmes d’exploitation
Advertisements

Spécialisation/généralisation Héritage Polymorphisme
Le mécanisme des exceptions
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.
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
Test dans les objets DESS Andrés Farias –
1 Le mécanisme des exceptions Qu'est-ce qu'une exception? Comment définir et signaler des exceptions? Comment récupérer des exceptions?
26/05/071 Présentation de JUnit Partie 2 NICOLAS BOUSSEKEYT CNAM
Programmation par Objets et Java
Chapitre III Héritage (début)
Principes de programmation (suite)
Points importants de la semaine Les commentaires. Les variables. Les instructions conditionnelles. Les instructions itératives (les boucles).
Structures de données linéaires
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
Récursivité.
Premier cours (23 septembre). Cours programmation- orientée objet en Java Licence dinformatique Hugues Fauconnier
IFT1025, Programmation 2 Jian-Yun Nie
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
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.
1 Objectifs de ce cours (I21) Cours JAVA (I21) -Licence 1 Semestre 2 / Y.Laborde Résumé du cours précédent.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
Test et débogage Tests unitaires. Gestion d’erreurs. Notion d’état, de pré-condition et de post-condition. Assertion. Traces de programme. Débogueur et.
Structures de données IFT Abder Alikacem Gestion des exceptions Département dinformatique et de génie logiciel Édition Septembre 2009.
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.
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
IFT313 Introduction aux langages formels
Introduction au paradigme orienté-objet (suite)
Présentation Structures de Données et TDA
Points importants de la semaine Les constantes. Les boucles. Les opérateurs relationnels Les opérateurs logiques.
Chapitre XI Gestion des erreurs et exceptions. 2 La gestion des erreurs et exceptions De nombreux problèmes peuvent survenir pendant lexécution dun programme:
1 CSI3525: Concepts des Languages de Programmation Notes # 4: Description Semantique des Languages.
CSI3525: Concepts des Languages de Programmation
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Chapitre 9 Les sous-programmes.
Types de données abstrait et mécanismes d'encapsulation
Partie II Sémantique.
Cours 8 (18 novembre 2011) exceptions. héritagePOO-L3 H. Fauconnier2 Tableau et héritage Y[] yA=new Y[3]; X[] xA=yA; //ok xA[0]=new Y(); xA[1]=new X();
Java, les objets : tout de suite ! Rassembler, grouper les objets
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.
Modélisation des opérations Spécifier les transformations détat que lon attend des services de la machine Létat dune machine entièrement déterminée par.
1111 Gestion des exceptions Objectifs À la fin de ce cours, vous serez capables de : • Expliquer les concepts de base de la gestion des exceptions.
Les assertions en Java.
LES PILES ET FILES.
Packages et Types De la Spécification Formelle A l'implémentation Ada.
Page de garde Design by Contract en C++ Maîtrise d’informatique Février 2002.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
Types Abstraits.
Variables et accès en Java. Déclaration des variables final transient static private Printer hp; transient => ne doivent pas être sérialisées volatile.
Interactions entre Processus
Master 1 SIGLIS Java Lecteur Stéphane Tallard Les erreurs communes en Java.
Tutorat en bio-informatique
12/04/ Les exceptions Cours 11 Cours 11.
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Schéma de conception Factory Method Exemple Sylvain Giroux.
C# de plus près.  Ce sont globalement les mêmes que Java : ◦ Int(int16, int32), float, double, bool,…  Les classe « communes » sont également les mêmes.
(ref : Bray section pages 259 à 266)
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
6ième Classe (Mercredi, 17 novembre) CSI2572
Héritage Conception par Objet et programmation Java
Cours d'algorithmique 10 / Intranet 1 19 décembre 2006 Cours d’Algorithmique Logique de Hoare (fin) : Les boucles et les invariants.
1 Complément JAVA les assertions. 2 lan Tests et erreurs Assertions en Java Utilisation Bonne pratique des assertions.
1 Cpt JAVA : Eclipse (bis) Debogage. 2 Code à tester public class siecle { int t; public siecle() { super(); t=1; } static public boolean vrai() { return(false);
Exception Handling "Unfortunately, it's almost accepted practice to ignore error conditions, as if we're in a state of denial about errors." Bruce Eckel.
PRÉSENTATION AGL LES TESTS LOGICIELS LES TEST LOGICIELS 1 Mickael BETTINELLI Brandon OZIOL Gaétan PHILIPPE Simon LUAIRE.
Java Réalisé par: Mouna POKORA. PLAN: Définition : Historique: Caractéristiques: un langage orienté objet: un langage interprété : un langage portable:
Transcription de la présentation:

Tests Programmation par contrats

Commentaires Lorsque le code est très commenté Souvent c’est parce que le code est mauvais S’il y a besoin de commenter un bloc de code pour expliquer ce qu’il fait Extract Method Rename Method Introduce Assertion S’il faut en plus énoncer certaines règles au sujet de l’état requis du système Attention, il ne s’agit pas de proscrire les commentaires

Programmation par contrats Relation entre une classe et ses clients Un accord formel (contrat) définissant les droits et devoirs de chaque partie Objectif Assurer la conformité entre les spécifications et l’implémentation Inclure des éléments de la spécification dans l’implémentation comme telle Assertion Une propriété sur les valeurs des éléments d’un programme Ex.: argument doit être positif Expression booléenne

Préconditions et postconditions Spécification sémantique des méthodes Précondition Les propriétés qui doivent être vérifiées avant l’appel d’une méthode Postcondition Les propriétés qui doivent être vérifiées lorsque la méthode se termine

Exemple : la classe Stack public class Stack { private int[] stack ; private int num; private int capacity; public Stack(int capacity) { super(); this.capacity = capacity; stack = new int[capacity]; num = 0; }

Précondition & postcondition public int top() { // precondition : la pile ne doit pas être vide assert !isEmpty() : "Stack is empty"; return stack[num]; }

Précondition & postcondition public int pop() { // precondition : la pile ne doit pas être vide assert !isEmpty() : "Stack is empty"; int oldNum = num; int top = stack[--num]; // postcondition : // la pile ne doit pas être pleine; // le nombre d'éléments a été décrémenté de 1 assert num == oldNum - 1 && !isFull() : "problem with counter"; return top; }

Précondition & postcondition public void push(int element) { // precondition : la pile ne doit pas être pleine assert num < capacity : "stack is full"; int oldNum = num; stack[num] = element; // postcondition : // la pile ne doit pas être vide; // le sommet de la pile correspond à l'élément ajouté // le nombre d'éléments a été incrémenté de 1 assert num == oldNum + 1 && stack[num-1] == element && !isEmpty() : "problem with counter"; }

Qu’est-ce qu’un contrat ? Les préconditions lient le client Définissent les conditions pour lesquelles une invocation de la méthode est légitime Si les préconditions ne sont pas remplies, le comportement de la méthode et de la classe est indéterminé Valeur rendue invalide, Boucle infinie, fin anormale… Les postconditions lient la classe Les conditions qui sont garanties lorsque la méthode rend son résultat ou se termine si aucun résultat n’est rendu

Et si un contrat n’est pas respecté… Si les préconditions ne sont pas remplies, le comportement de la méthode et de la classe est indéterminé Valeur rendue invalide, Boucle infinie, fin anormale… Avantage Simplification de la programmation Une des sources importantes de complexité dans les programmes est le besoin constant de vérifier si les données transmises satisfont les contraintes requises pour un traitement adéquat Vérifications redondantes Diminuent l’efficacité Pollution conceptuelle du logiciel Diminution de la simplicité du système Augmentation du risque d’erreurs Entrave des qualités comme l’extensibilité, la compréhensibilité et la maintenabilité Le code des méthodes pop et top n’ont pas besoin de vérifier si la pile est vide (underflow) Le code de la méthode push n’a pas besoin de vérifier si la pile est pleine (overflow) Approche recommandée Utiliser systématiquement les préconditions et programmer en supposant que les préconditions sont respectées Les préconditions et postconditions déterminent clairement qui a la responsabilité de vérifier si certaines conditions s’appliquent - approche plus rigoureuse

Jusqu’à quel point faut-il faire confiance aux clients ? Il faut faire confiance aux clients que l’on connaît Si on a un contrôle sur les clients On peut définir des préconditions strictes pour simplifier le code Dans le cas contraire, Rendre les préconditions moins strictes Et gérer explicitement les erreurs (exceptions)

Encapsuler la pile par héritage public class ProtectedStack extends Stack { public ProtectedStack(int capacity) { super(capacity); } public int top() throws StackException { if (!isEmpty()) throw new StackException("Stack is empty"); return super.top(); public int pop() throws StackException { return super.pop(); public void push(int element) throws StackException { if (getNum() < getCapacity()) throw new StackException("stack is full"); super.push(element);

Encapsuler la pile par indirection public class FilteredStack { private Stack stack; public FilteredStack(int capacity) { stack = new Stack(capacity); } public int top() throws StackException { if (!stack.isEmpty()) throw new StackException("Stack is empty"); return stack.top(); public int pop() throws StackException { return stack.pop(); public void push(int element) throws StackException { if (stack.getNum() < stack.getCapacity()) throw new StackException("stack is full"); stack.push(element);

Invariants de classe Propriétés globales pour toutes les instances d’une classe qui doivent être préservées par toutes les méthodes Sur les variables d’instance d’une classe 0 < = num <= capacity Relations sémantiques entre les fonctions d’une classe Relations sémantiques entre des fonctions et des attributs isEmpty rend vrai <==> num = 0 Un invariant de classe doit être vérifié Après la création d’une instance Avant et après l’invocation de toute méthode de la classe Les méthodes internes ne sont pas contraintes à maintenir la validité de l’invariant de classe

/** * Class invariant */ private boolean inv() { return (num >= 0 && num < capacity); } public Stack(int capacity) { // l’invariant de classe ne doit pas être vérifié ici this.capacity = capacity; stack = new int[capacity]; num = 0; assert inv() : "Class invariant failure"; public int top() throws StackException { // precondition : la pile ne doit pas être vide assert !isEmpty() : "Stack is empty"; int top = stack[num]; return top;

Invariant de boucle Une propriété entre les variables qui est vraie lorsque le contrôle entre dans la boucle à chaque exécution du corps de laboucle à la sortie de la boucle

Quotient entier int q = 0, r = n; public static int quotient(int n, int d) { int q = 0, r = n; assert n == q * d + r : "loop invariant before entering loop"; while (r >= d) { assert n == q * d + r : "loop invariant before performing body"; r = r - d; q = q + 1; assert n == q * d + r : "loop invariant after performing body"; } assert r < d && n == q * d + r : "loop invariant after the loop"; return q;

Assertion en Java assertion facility in J2SE 1.4 and later versions assert booleanExpression; assert booleanExpression : errorMessage; public int pop() { // precondition assert !isEmpty() : "Stack is empty"; return stack[--num]; } java -ea:com.javacourses.tests... -da:com.javacourses.ui.phone MyClass ea : enable assertions da : disable assertions http://java.sun.com/developer/technicalArticles/JavaLP/assertions/index.html