vérification et validation
Transcription
vérification et validation
VÉRIFICATION ET VALIDATION mardi 12 février 2008 Vérification et Validation Validation : Faisons-nous le bon produit ? Le logiciel répond-il aux besoins des utilisateurs ? Vérification : Faisons-nous le produit correctement ? Le logiciel est-il conforme à ses spécifications ? Tests (nécessite exécutable) ≠ Preuve Tests unitaires Tests d'intégration Tests de non régression “Testing can prove the presence of bugs, but never their absence” (Dijkstra) mardi 12 février 2008 Tests : techniques utilisées Inspection du logiciel (analyse des documents, fichiers, diagrammes...), logiciel non exécuté Test du logiciel : exécution du logiciel (données bien choisies, examen des résultats) Tests des défauts : trouver des inconsistances vis-à-vis des spécifications Tests statistique : performances et fiabilité sur données «habituelles» Tests de robustesse : sur données invalides Impossibilité de tester de façon exhaustive, choix des tests primordial Nécessité d'un “Oracle” mardi 12 février 2008 Test (def IEE) IEEE-STD 610.12-1990 Le test est l'exécution ou l'évaluation d'un système ou d'un composant par des moyens automatiques ou manuels, pour vérifier qu'il répond à ses spécifications ou identifier les différences entre les résultats attendus et les résultats observés" mardi 12 février 2008 Inspection Technique efficace de détection des erreurs (jusqu'à 60%) Relecteurs spécialistes (connaissent langage et erreurs les plus fréquentes) Avant les tests Doit exister une spécification précise A base de check list Existence d'analyseur statiques Démarche : Détection des défauts, anomalies, non respect des standards... par inspecteur Correction par auteur Modérateur décide si oui ou non on ré-inspecte mardi 12 février 2008 Test Fonctionnels (ou boîte noire) Composant considéré comme boîte noire Tests choisis en fonction des spécifications Principe : prévoir les résultats de sortie en fonction des valeurs en entrée. Si les sorties ne sont pas celles prévues alors le test a, avec succès, détecté un problème. Problème : choisir les entrées (impossible d’être exhaustif) Choisir Valeurs limites Partitionner les entrées en classes d'équivalence (pour le programme), choisir un représentant par classe. mardi 12 février 2008 Tests Fonctionnels : Exemple Recherche dichotomique Reçoit en entrée : un tableau classé par ordre croissant et un élément si l’élément est présent, renvoie sa position sinon renvoie -1 Jeux de tests Valeurs limites Tableau Vide ?? (précondition sur tableau vide ?) Tableau avec un élément Premier/Dernier élément 2 classes : élément présent, élément absent Tableaux de tailles différentes dans des tests différents mardi 12 février 2008 Exemple : recherche dichoromique Tableau Elément Tableau Elément Sortie Vide pas présent () 123 -1 1 elt présent 17 17 1 1 elt pas présent 2 12 -1 plus d’1 elt présent, premie 5 12 18 123 345 5 1 plus d’1 elt présent, dernier 123456789 9 9 plus d’1 elt présent, elt qcq 234 567 890 1515 567 2 plus d’1 elt pas présent 345 567 789 1515 -1 mardi 12 février 2008 Exemple : ajouteMonome Méthode ajouteMonome(int coef, int degre) dans la classe polynome Jeux de tests Valeurs limites ??? Classes d'équivalence ??? mardi 12 février 2008 Tests structurels (ou boîte blanche) Tests dérivés de la connaissance du code Noeud d’entrée unique E et de sortie unique S Plutôt pour des méthodes, petits composants Principe : exécuter chaque instruction et chaque chemin (attention) au moins une fois Méthode : construction du graphe de contrôle Noeuds : instructions Arcs : branchements mardi 12 février 2008 IF WHILE Complexité Cyclomatique (CG) CG = Nombre de chemins indépendants CG = Nombre de régions du graphe CG = Arêtes - Noeuds +2 = Point de décision +1 Borne supérieure pour que toutes les instructions soient exécutées au moins 1 fois mardi 12 février 2008 Recherche dichotomique public static int recherche(int clef, int[] tableau) { int debut = 0; int fin = tableau.length - 1; int resultat = -1; (1) ; (1) while (debut <= fin) { int milieu = (debut + fin) / 2; (2) if (tableau[milieu] == clef) { resultat = milieu; (3) break; } (4) else if (tableau[milieu] < clef) { (5) debut = milieu + 1;} else { (6) fin = milieu - 1;} (7) } (8) return resultat; mardi 12 février 2008 Recherche dichotomique Calcul de CG : Nbre de régions du graphe = 4 A - N +2 = 10 -8 +2 = 4 Point de décision +1= 3 +1 = 4 Chemins indépendants 1, 8 1, 2, 3, 8 1, 2 , 4, 5, 7, 1, 8 1, 2 , 4, 6, 7, 1, 8 mardi 12 février 2008 1 2 3 8 4 5 6 7 Principes de test Un programmeur ne doit pas tester ses propres programmes. Ne pas effectuer des tests avec l’hypothèse de base qu’aucune erreur ne va être trouvée. Définir soigneusement les résultats attendus AVANT l’exécution d’un test. Inspecter minutieusement les traces de chaque test. Penser à tester des entrées invalides. mardi 12 février 2008 Tests et Java Assertions Invariants, pré et post conditions assert expression; assert expression 1 : expression 2; java -ea junit (www.junit.org) mardi 12 février 2008 // Polynome.java public void ajouteMonome(double coef, int degre){ Monome courant liste_; Monome precedent = null; while (courant != null){ if (courant.degre() == degre) { courant.ajoute(coef); if (courant.coef() == 0) { if (precedent != null) { precedent.set_suivant(courant.suivant()); } else { liste_ = courant.suivant(); } } return; } if (courant.degre() > degre) { Monome m = new Monome(coef, degre, courant); if (precedent != null) { precedent.set_suivant(m); } else { else { liste_ = m; } return; } precedent = courant; courant = courant.suivant(); } if (precedent == null) { liste_ = new Monome(coef, degre, null); else { precedent.set_suivant(new Monome(coef, degre, null)); } return; } mardi 12 février 2008 // // // // // // // // I1a I1b T2 T3 I3 T4 T5 I5i // I5e // FIN // // // // T6 I6 T7 I7i // I7e // FIN // I8a // I8b // T9 // I9i // I9e // FIN 1 T2 2 T9 3 5 I9i 18 9 T3 I9e 4 T6 6 8 17 T4 19 12 22 14 I5i I5e 15 13 16 FIN mardi 12 février 2008 I7e 20 T5 11 21 I7i 10 7 T7 23