Génération de tests pour la localisation automatique d’erreurs Yves Le Traon et Franck FLEUREY Le test de logiciel Moyen principal de validation/mise-au-point Intervient tout au long du processus de développemt Activité coûteuse Besoin de techniques pour assister le test et la mise-au-point 2 Principe général du test 3 Problématique : test et diagnostic Le diagnostic utilise les informations issues du test pour localiser les erreurs détectées Dépendance entre les données test et le diagnostic Hypothèse de la littérature : Plus il y a de cas de test et plus le diagnostic est facile Contraire aux pratiques du test qui minimisent le nombre de cas de test pour atteindre un critère de test donné Comment construire un ensemble de cas de tests pertinents pour le diagnostic ? 4 Plan Test et diagnostic Algorithme d’assistance au diagnostic Génération automatique de tests Test pour le diagnostic Conclusion et perspectives 5 Diagnostic par recoupement de traces d’exécution Objectif : Réduire l’espace de recherche de erreurs détectées Moyens : Exploiter les traces d’exécution des cas de tests Trace d’exécution : Ensemble d’instructions du programme sous test exécutées par le cas de test Différence B-A 6 Algorithme de Jones et al. Ordonner les instructions de la plus suspecte à la moins suspecte. Exemple : pow(x, y:integer) : float local i, p : integer i := 0; Result := 1; if y<0 then p := -x; else p := y; while i<p do Result := Result * x; i := i + 1; done if y<0 then Result := 1/Result; end {1} {2} {3} {4} {5} {6} Fonction puissance Une faute a été introduite en {3} (l’instruction correcte serait p:=-y) {7} 7 Algorithme de Jones et al. Ordonner les instructions de la plus suspecte à la moins suspecte. 4 cas de test Exemple : 1 2 3 4 x=2 x=-2 x=2 x=-3 y=4 y=0 y=-4 y=-3 pow(x, y:integer) : float local i, p : integer i := 0; {1} Result := 1; {2} if y<0 then p := -x; {3} else p := y; {4} while i<p do Result := Result * x; {5} i := i + 1; {6} done if y<0 then Result := 1/Result; {7} end Verdicts : 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 0 0 1 1 0 0 1 1 P P F P Matrice de diagnostic 8 Algorithme de Jones et al. Ordonner les instructions de la plus suspecte à la moins suspecte. Résultats du diagnostic Exemple : 1 2 3 4 x=2 x=-2 x=2 x=-3 y=4 y=0 y=-4 y=-3 pow(x, y:integer) : float local i, p : integer i := 0; {1} Result := 1; {2} if y<0 then p := -x; {3} else p := y; {4} while i<p do Result := Result * x; {5} i := i + 1; {6} done if y<0 then Result := 1/Result; {7} end Verdicts : %Passed %Failed Rang 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 100% 100% 33% 66% 100% 100% 100% 0% 3 4 1 5 1 1 0 0 0 0 1 1 66% 66% 0% 0% 6 7 0 0 1 1 33% 100% 2 P P F P 9 Précision du diagnostic Suite de test Exécution des tests Programme sous test (P) Mutant de P Mutation (JMutator) Matrice de diagnostic Algorithme de diagnostic Classement des instructions de P Rang de l’instruction erronée Précision du diagnostic 10 Génération automatique de tests et algorithmes bactériologiques Technique de génération de test présentée dans de précédents travaux. Inspiré du processus d’adaptation des bactéries Objectif : Trouver un ensemble de taille raisonnable de cas de test pour satisfaire un critère de test. 11 La boucle bactériologique 2 ensembles de bactéries Classer, Mémoriser, Filtrer, Muter Condition d’arrêt Arrêt Mémoriser 4 opérations Ensemble solution Bouillon (population courante) Solution (construite itérativement) Objectif atteint Nb de génération … Classer Bouillon bacteriologique Filtrer Muter 12 La boucle bactériologique 2 ensembles de bactéries Ensemble solution Bouillon (population courante) Solution (construite itérativement) Arrêt Mémoriser 4 opérations Classer, Mémoriser, Filtrer, Muter Condition d’arrêt Objectif atteint Nb de génération … Classer Bouillon bacteriologique Filtrer Muter 13 La boucle bactériologique 2 ensembles de bactéries Ensemble solution Bouillon (population courante) Solution (construite itérativement) Arrêt Mémoriser 4 opérations Classer, Mémoriser, Filtrer, Muter Classer Condition d’arrêt Objectif atteint Nb de génération … Bouillon bacteriologique Filtrer Muter 14 La boucle bactériologique 2 ensembles de bactéries Ensemble solution Bouillon (population courante) Solution (construite itérativement) Arrêt Mémoriser 4 opérations Classer, Mémoriser, Filtrer, Muter Classer Condition d’arrêt Objectif atteint Nb de génération … Bouillon bacteriologique Filtrer Muter 15 La boucle bactériologique 2 ensembles de bactéries Ensemble solution Bouillon (population courante) Solution (construite itérativement) Arrêt Mémoriser 4 opérations Classer, Mémoriser, Filtrer, Muter Classer Condition d’arrêt Objectif atteint Nb de génération … Bouillon bacteriologique Filtrer Muter 16 Bilan Algorithme de diagnostic fondé sur le recoupement de traces d’exécutions Implantation d’un outil : JTracor Implantation de l’algorithme de diagnostic Génération de tests et algorithmes bactériologiques Implantation d’un framework JAVA pour la génération de tests 17 Génération de test pour le diagnostic Dépendance entre des techniques de diagnostic et les cas de test utilisés Peu de travaux dans la littérature Hypothèse retenue pour le diagnostic contraire aux pratiques du test Besoin de critères de test pour le diagnostic 18 Deux critères de test pour le diagnostic (1) Couvrir le code du programme (2) Couvrir chaque instruction du programme avec plusieurs cas de test 19 Satisfaire automatiquement ces deux critères de test (1) Couvrir le code du programme : Algorithme bactériologique Fonction d’utilité : % code couvert (JTracor) (2) Couvrir chaque instruction avec plusieurs cas de tests différents : Union de plusieurs suites de test générées pour couvrir le code du programme. 20 Etudes de cas Deux systèmes JAVA Book : sous-système de gestion de livres 7 types de commandes 16 classes VirtualMeeting : serveur de réunion virtuelle 15 types de commandes 82 classes 21 Etudes de cas : Modélisation Cas de test = séquence de commandes (taille fixe) Opérateur de mutation Ecriture pour chaque étude de cas d’un générateur aléatoire de commandes. 22 Book : Génération de tests Une suite de test comportant 47 cas de tests et vérifiant les deux critères de test proposés 23 Book : Précision du diagnostic Etude sur 87 mutants de Book 45 40 35 % code à examiner 30 25 4,38% 24,76% 20 15 10 5 0 1 2 3 4 5 6 7 8 910 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 Mutants Résultat décevant pour une partie des mutants 24 Notion de blocs dynamiques Blocs d’instructions indicernables : Ensemble d’instructions exécutées par les mêmes cas de tests. Exemple pow(x, y:integer) : float local i, p : integer i := 0; Result := 1; if y<0 then p := -x; else p := y; while i<p do Result := Result * x; i := i + 1; done if y<0 then Result := 1/Result; end 1 2 x=2 x=-2 y=4 y=0 {1} {2} {3} {4} 1 1 0 1 1 1 0 1 {5} {6} 1 1 0 0 {7} 0 0 2 cas de test 2 blocs dynamiques Les instructions d’un même bloc dynamique sont toujours classées comme équi-suspectes par l’algorithme de diagnostic. 25 Blocs dynamiques Plus le bloc dynamique contenant l’erreur est petit et plus le diagnostic est précis Un troisième critère de test (3) Maximiser le nombre de blocs dynamiques Dans la pratique : utilisation de l’algorithme bactériologique Fonction d’utilité : nombre de blocs dynamiques isolés 26 Validation expérimentale Maximiser le nombre de blocs dynamiques Suite de test initiale couvrant le code et composée de 15 cas de test (isolant 113 blocs dynamiques) 200 Nombre de blocs dynamiques 190 180 170 Une suite de test de taille raisonnable isolant un maximun de blocs dynamiques (31 cas de test et 187 blocs dynamiques isolés) 160 150 140 130 120 110 100 0 25 50 75 100 125 150 175 200 Générations 27 Validation expérimentale (2) Qualité de la suite de test générée pour le diagnostic Nombre de cas de test Précision du Diagnostic 151 Avec les 2 premiers critères 292 473 634 Isoler un max. de blocs dynamiques 315 0 2 4 6 8 10 12 14 16 Nombre d'instructions Suite de test de taille raisonnable Bonne précision du diagnostic 28 Résultats La minimisation des blocs dynamiques permet d’obtenir un diagnostic précis avec un nombre raisonnable de cas de tests L’algorithme bactériologique permet d’adapter une suite de test au diagnostic Les premiers critères proposés ne sont pas déterminant pour le diagnostic 29 Méthodologie de test pour le diagnostic Programme sous test Suite de test initiale Exécution des tests Erreur détectée Algorithme bacteriologique non ARRÊT Correction d’erreur oui Algorithme de diagnostic Ajouter des cas de tests pour isoler un max. de blocs dyn. dans les zones de code suspectes non Diag. Précis oui 30 Conclusion Conciliation des pratiques de test et des besoins du diagnostic Un critère de test propre au diagnostic Méthodologie de génération automatique de test pour le diagnostic Généralisation et validation expérimentale du modèle bactériologique Implantation d’outils en JAVA Algorithme bactériologique, trace d’exécution, diagnostic. 31