Génération de tests pour la localisation automatique d`erreurs

publicité
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
Téléchargement