Cours Composant 5. Test Logiciel
Transcription
Cours Composant 5. Test Logiciel
Introduction Le test logiciel Utilisation de JUnit Conclusion UPMC Paris Universitas Master Informatique STL Cours Composant 5. Test Logiciel Hakim Belhaouari UPMC Paris Universitas 3 mai 2010 Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Contexte Conclusion Les bugs logiciel (I) Un bug coûte très cher : Télécommunication Panne pendant 24H du réseau téléphonique de Bouygues Telecom le 17 novembre 2005. Evalué à 8 millions d'euros. Ariane 5 en 1996 le vol inaugural raté en raison d'un dépassement des capacité dans les appareils d'avionique importé d'Ariane 4. Le bug le plus cher de l'histoire : environ 3 milliards de francs (≈ 457 millions d'euro). Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Contexte Conclusion Les bugs logiciel (I) Un bug coûte très cher : Télécommunication Panne pendant 24H du réseau téléphonique de Bouygues Telecom le 17 novembre 2005. Evalué à 8 millions d'euros. Ariane 5 en 1996 le vol inaugural raté en raison d'un dépassement des capacité dans les appareils d'avionique importé d'Ariane 4. Le bug le plus cher de l'histoire : environ 3 milliards de francs (≈ 457 millions d'euro). il faut donc s'assurer de la qualité des logiciels. Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Contexte Conclusion Les bugs logiciel (II) Méthodes de Validation et Vérication (V & V) : Vérication : est-ce que le logiciel fonctionne correctement ? Validation : est-ce que le logiciel réalise les fonctions attendues ? Concrètement : Test statique : relecture du code, spécication, etc. Test dynamique : exécuter le code pour s'assurer d'un fonctionnement correct Vérication symbolique : vérication à l'exécution, exécution symbolique, . . . Vérication formelle : preuve ou model-checking d'un modèle formel. Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Le test logiciel Le test logiciel est la méthode la plus populaire pour vérier un logiciel. Cette méthode représente environ 40-60% du prix nal. Denition 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érier qu'il répond à ses spécications ou identier les diérences entre les résultats attendus et les résultats obtenus IEEE Denition Tester, c'est exécuter le programme dans l'intention d'y trouver des anomalies ou des défauts G. Myers Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel En bref Ce que le test est : exécuter le programme connaître les résultats attendus (notion d'oracle) on échoue lorsqu'on ne trouve aucune erreur Ce que le test n'est pas : ne donne pas d'explication d'une erreur ce n'est pas une validation (pas d'erreur détecter ne signie pas que le programme soit correct) Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Exemple de spécication Le test est activité complexe : Spécication : PGCD Le calcul du PGCD de deux nombres entiers (x et y ) consiste à determiner le plus grand commun diviseur (z ). Ce nombre vérie l'existence de deux entiers (k et l ) tels que : k.x + l.y = z Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Familles de tests Les familles de tests sont utilisées simultanément dans l'industrie, car elles sont complémentaires : 1 Test structurel (boîte de verre) : les données de tests sont produites après une analyse de code (elle est soumise à diérent critère de test) =⇒ 2 détectent principalement les erreurs commises. Test fonctionnel(boîte noire) : test de conformité par rapport à la spécication. =⇒ détectent principalement les erreurs d'omission et de spécication. Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Complémentarité des familles de test (I) Les approches structurelles trouvent plus facilement les erreurs commises Les approches fonctionnelles trouvent plus facilement les erreurs d'omission et de spécication Exemple Spec : retourne la somme de deux entiers modulo 20000 Code : int somme(int x, int y) { if (x==600 && y==500) return x-y ; else return x+y ; } Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Complémentarité des familles de test (II) Exemple Spec : retourne la somme de deux entiers modulo 20000 Code : int somme(int x, int y) { if (x==600 && y==500) return x-y ; // Bug 1 else return x+y ; // Bug 2 } Le Bug 1 est trouvé très facilement par le test structurel. Le Bug 2 est trouvé plus facilement par le test fonctionnel. Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Types de test Désigne les caractéristiques de ce qu'on veut tester et le test dans le cycle de développement : Tests unitaires : test les procédures, interfaces, . . . Tests d'intégration : test la composition des interfaces, . . . Test de conformité : validation de l'adéquation aux spécications Test nominal : test le bon fonctionnement sur des données valide (test to pass). Test de robustesse : test avec des données invalide (test to fail). ... Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Test fonctionnel Denition Le test fonctionnel vise à examiner le comportement fonctionnel et sa conformité avec la spécication du logiciel. Méthode utilisées : Test aléatoire Analyse partitionnelle des domaines des données d'entrée Test combinatoire (pairwise) Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Test fonctionnel : analyse partitionnelle (I) Denition Une classe d'équivalence correspond à un ensemble de données de tests permettant de tester le même comportement du programme. Exemple : la classication de triangle Soit un programme prenant trois entiers positifs et indique si ces trois nombres représente un triangle (isocèle, scalène, équilatéral) ou ne peut représenter un triangle. Forme : Angle : isocèle aigu scalène obtus équilatéral droit Hakim Belhaouari Cas particulier : non-triangle Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Test fonctionnel : analyse partitionnelle (II) Exercice la racine carrée. Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Test fonctionnel : analyse partitionnelle (III) Les caractéristiques du test partitionnel permet de faire diérent type de test : test nominal : choisit une valeur valide de façon aléatoire dans l'intervalle (ex : 1, 25 , 100, . . . ). test aux limites : choisit une valeur limitrophe valide du 32 domaine (ex : 0, 2 test hors-limite − 1). : choisit une valeur invalide du domaine pour montrer un contre-exemple (ex : -2 Hakim Belhaouari 32 ,-1). Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Test fonctionnel : test combinatoire (I) Denition Le test combinatoire consiste à tester toutes les combinaisons possibles des valeurs en entrées. Exemple Considérons une fonction dont la signature est la suivante : void foo(int a, boolean b). 2 32 ∗ 2 = 233 ≈ 8.6milliards =⇒ explosion combinatoire des tests possibles Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Test fonctionnel : approche Pairwise But Réduire l'inconvénient du test combinatoire en sélectionnant un sous-ensemble de valeurs possibles. La technique du pairwise prend les combinaisons de 2 variables. Exemple : 3 variables booléennes Cas de test A B C 1 false false false 2 false true true 3 true false true 4 true true false Hakim Belhaouari Ici, réduction de 40%. MAIS : pas aisé à la main parfois redondance (4 var. bool.) extensible 3-ways, . . . Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Le test structurel (I) Denition Examine la structure du programme en testant des portions de programme. Un graphe de ot est utilisé pour extraire les chemins d'exécution possibles. Exemple : Code concrétisant la spécication du PGCD. int pgcd(int m,int n) { int a = m ; int b = n ; if (a <= 0 || b <= 0) return 1 ; while(a 6= b) { if (a > b) a = a - b; else } } Hakim Belhaouari b = b - a; return a ; Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Le test structurel (II) Denition (Graphe de ot de contrôle) La transformation du code en boîte repose sur un graphe représentant la suite des représentations. Une boîte rectangulaire pour une expression Un losange pour marquer un point de choix une boule pour une instruction abstraite Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Le test structurel (II) 2,3 1 2 3 4 5 6 7 8 9 10 11 12 : int pgcd(int m,int n) { : int a = m ; : int b = n ; : if (a <= 0 || b <= 0) : while(a 6= b) { : if (a > b) : a = a - b; : else : b = b - a; : } : return a ; :} 4 return 1 ; faux vrai 5 faux vrai 6 8 10 11 Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Le test structurel (III) =⇒ l'analyse du graphe permet d'identier les données de tests en fonction d'un chemin dans le graphe. Critère de couverture tous les sommets couvre l'intégralité des instructions. Passe au moins une fois sur chaque arc du graphe. tous les chemins simples couvre tous les chemins d'exécution sans itérer plus d'une fois dans les boucles. tous les arcs prend en comptes toutes les décisions du graphe. Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Conclusion Familles de tests Types de test Test fonctionnel Le test structurel Le test structurel (IV) Critère Chemins Jeux de test Forme des solu- tions tous les sommets tous les chemins simples [2,3,4,5,6,4,11] (2,1) [2,3,4,5,8,4,11] (7,14) [2,3,4,11] (5,5) [2,3,4,5,6,4,11] (2,1) [2,3,4,5,8,4,11] (7,14) tous les chemins ∞ − tous les arcs [2,3,4,5,6,4,5,8,4,11] (39,26) (2x , x ) (x , 2x ) ( x, x) (comme précédemm il y a une innité de solution Hakim Belhaouari Cours Composant (3x , 2x ) 5. Test Logiciel Introduction Le test logiciel JUnit 3 Utilisation de JUnit JUnit 4 Conclusion Utilisation de JUnit Actuellement deux versions sont utilisées : JUnit 3 =⇒ plus facile à comprendre JUnit 4 =⇒ plus facile à utiliser Les deux reposent sur un système d'assertion servant à décrire l'oracle : assertTrue(boolean b) assertFalse(boolean b) assertEquals(Object o, Object val) assertNull(Object o),assertNotNull(Object o) ... Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel JUnit 3 Utilisation de JUnit JUnit 4 Conclusion JUnit 3 (I) Conception d'une classe de test : hérite de junit.framework.TestCase contient des méthodes de test : publique et void en type de retour nom doit commencer par test pas de paramètre peut lever une exception méthode de préambule protected void setUp() méthode de postambule protected void tearDown() Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel JUnit 3 Utilisation de JUnit JUnit 4 Conclusion JUnit 3 (II) class TestStack extends TestCase { private Stack stack ; protected void setUp() { stack = new Stack() ; } public void testEmptySize() { } assertTrue(stack.isEmpty()) ; public void testTwoPush() { stack.push(new Integer(23)) ; stack.push(new Integer(22)) ; assertEquals(stack.pop() , new Integer(22)) ; assertEquals(stack.pop() , new Integer(23)) ; } } ... Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel JUnit 3 Utilisation de JUnit JUnit 4 Conclusion JUnit 4 Evolution de JUnit pour Java 5 (et supérieur) utilisation des annotations nouvelle architecture : ne consomme plus le lien d'héritage importation statique (import static org.junit.Assert.* ;) utilisation de la réexion API support des timeout meilleur gestion des exceptions Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel JUnit 3 Utilisation de JUnit JUnit 4 Conclusion JUnit 4 : Annotations Annotations @Test Description marque la méthode suivante comme une méthode de test. @Test(expected=Class) : attend exception Class @Test(timeout=X) : échoue au bout de X ms. @Before indique qu'une méthode est un préambule pour chaque méthode de test @After indique qu'une méthode est un postambule pour chaque méthode de test @BeforeClass exécute la méthode marquée une fois au tout début des tests @AfterClass @Ignore exécute la méthode en toute n des tests ignore la méthode de test suivante Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Le test pour les ADTs Généralités Conclusion test dans les ADTs A partir de maintenant il faut tester obligatoirement son code. Un contrat ou ADT doit compter au moins 2 tests : 1 un test hors-limite 2 au moins un test nominal pour chaque observation possible Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Le test pour les ADTs Généralités Conclusion Exemple Test d'un ADT Service : Tank Types : double, boolean Observators : quantity : [Tank] → double isEmpty : [Tank] → boolean Constructor : init : → [Tank] Operators : ll : [Tank] × double → [Tank] pre ll(T,q) require q >= 0 pump : [Tank] × double → [Tank] pre pump(T,q) require q >= 0 and quantity(T) >= q Observations : [invariants] def isEmpty = (quantity(T) == 0) quantity(T) >= 0 [init] quantity(init()) = 0 [ll] quantity(ll(S,q)) = quantity(S) + q [pump] Belhaouari Cours Composant 5. Test Logiciel quantity(pump(S,q))Hakim = quantity(S) - q or quantity(pump(S,q)) = quantity(S) Introduction Le test logiciel Utilisation de JUnit Le test pour les ADTs Généralités Conclusion Conclusion Le test logiciel est une activité obligatoire L'écriture des tests se fait avant de commencer à implémenter JUnit ne permet pas d'ordonnancer les tests exécutés Il serait intéressant d'automatiser certaines activités Hakim Belhaouari Cours Composant 5. Test Logiciel Introduction Le test logiciel Utilisation de JUnit Le test pour les ADTs Généralités Conclusion Fin Fin Hakim Belhaouari Cours Composant 5. Test Logiciel