Test Structurel
Sami Taktak
sami.taktak@cnam.fr
2 méthodes utilisées :
PGCD(p, q) : Entrée
1: read(p, q)
2: while p 6= q do read
3: if p > q then
4: p =p−q p=q while
5: else p 6= q
6: q =q−p if
7: end if p>q p≤q
8: end while return then else
9: return p
Sortie end if
S. Taktak Test et Validation du Logiciel Test Structurel 6/114
Objectifs de Couverture
while
p=q
p 6= q
if
p>q p≤q
return then else
end if
Sortie
end if
Sortie
A : relation de N x N =
branchement possible du flot de contrôle
Qualification niveau C :
Un défaut peut provoquer un problème sérieux entraînant
un dysfonctionnement des équipements vitaux de
l’appareil
Entrée
sum (x , y : entier):
1: if x = 0 then
1
2: sum := x ;
x =0 x 6= 0
3: else
2 4
4: sum := x + y ;
5: end if
6
6: return sum ;
Sortie
1: read(x) ; Entrée
2: if x 6= 0 then
3: x := 1 ;
1
4: end if
5: y := 1/x ;
2
x 6= 0
3 x =0
Critère tous-les-nœuds satisfait par le
chemin (E , 1, 2, 3, 5, S) 5
Entrée
F (a, b : entier):
1
1: 6 0 ∨ a = b then
if a = a 6= 0 ∨ a = b a = 0 ∧ a 6= b
2: x := 1 / a ; 2 4
3: else
4: x := 0 ; 6
5: end if
6: return x ;
Sortie
Sortie
if ( A && (B || C ))
Exemple pour A :
A=0, B=1,C=1 – Dec=0
A=1, B=1,C=1 – Dec=1
if ( A && (B || C ))
pour A :
A=0, B=1,C=1 – Dec=0
A=1, B=1,C=1 – Dec=1
pour B :
A=1, B=1,C=0 – Dec=1
A=1, B=0,C=0 – Dec=0
pour C :
A=1, B=0,C=1 – Dec=1
A=1, B=0,C=0 – Dec=0 ⇐ déjà couvert
S. Taktak Test et Validation du Logiciel Test Structurel 20/114
Limites des Critères Toutes-les-Conditions –
Décisions
4: while i ≤ sup do 8
i > sup
4
5: sum := sum + a[i] ;
6: i := i+1 ; i ≤ sup
7: end while
Sortie 5-6
8: return 1/sum ;
4: while i ≤ sup do
5: sum := sum + a[i] ;
6: i := i+1 ; 2-3
7: end while
8: return 1/sum ;
i > sup
{a = [23, 45, 65], inf = 1, sup = 3} 8 4
i ≥ size(T) ∨ T[i] ≥ X 3
6
Sont-ils tous faisables ? x =0 x 6= 0
7 9 y := 10/x
11
Sortie
6
Sont-ils tous faisables ? x =0 x 6= 0
7 9 y := 10/x
Non :
(Entrée, 1, 2, 6, 9, 11, Sortie) n’est 11
pas faisable
Sortie
Garde :
associée à la valeur symbolique et composée de la
conjonction de toutes les conditions d’exécution du
chemin d’exécution
Entrée
1: if x ≤ 0 then
2: x := -x ;
1
3: else
x ≤0 x >0
4: x := 1 - x ;
x := −x 2 4 x := 1 − x
5: end if
6: if x = −1 then
6
7: x := 1 ;
x = −1 x 6= −1
8: else
x := 1 7 9 x := x + 1
9: x := x + 1 ;
10: end if 11
11: return x ;
Sortie
6
x = −1 x 6= −1
x := 1 7 9 x := x + 1
11
Sortie
6
x = −1 x 6= −1
x := 1 7 9 x := x + 1
11
Sortie
6
x = −1 x 6= −1
x := 1 7 9 x := x + 1
11
Sortie
11
Sortie
11
Sortie
Sortie
11
Sortie
Sortie
Sortie
Sortie
Entrée
Sortie
Entrée
(garde, n, i, s)
1–2 (true, (n0 , 0, 0)) 1-2 i := 0; s := 0
i <n
i ≥n 4-5 i := i + 1; s := s + i;
7 return s ;
Sortie
Entrée
(garde, n, i, s)
1–2 (true, (n0 , 0, 0)) 1-2 i := 0; s := 0
3 (true, (n0 , 0, 0)) 1er passage
3
i <n
i ≥n 4-5 i := i + 1; s := s + i;
7 return s ;
Sortie
Entrée
(garde, n, i, s)
1–2 (true, (n0 , 0, 0)) 1-2 i := 0; s := 0
3 (true, (n0 , 0, 0)) 1er passage
4–5 (0 < n0 , (n0 , 1, 1)) 1er passage 3
i <n
i ≥n 4-5 i := i + 1; s := s + i;
7 return s ;
Sortie
Entrée
(garde, n, i, s)
1–2 (true, (n0 , 0, 0)) 1-2 i := 0; s := 0
3 (true, (n0 , 0, 0)) 1er passage
4–5 (0 < n0 , (n0 , 1, 1)) 1er passage 3
7 return s ;
Sortie
Entrée
(garde, n, i, s)
1–2 (true, (n0 , 0, 0)) 1-2 i := 0; s := 0
3 (true, (n0 , 0, 0)) 1er passage
4–5 (0 < n0 , (n0 , 1, 1)) 1er passage 3
7 return s ;
Sortie
Entrée
(garde, n, i, s)
1–2 (true, (n0 , 0, 0)) 1-2 i := 0; s := 0
3 (true, (n0 , 0, 0)) 1er passage
4–5 (0 < n0 , (n0 , 1, 1)) 1er passage 3
..
.
7 return s ;
Sortie
1-2 i := 0; s := 0
i <n
i ≥n 4-5 i := i + 1; s := s + i;
7 return s ;
Sortie
i <n
i ≥n 4-5 i := i + 1; s := s + i;
7 return s ;
Sortie
i <n
i ≥n 4-5 i := i + 1; s := s + i;
7 return s ;
Sortie
i <n
i ≥n 4-5 i := i + 1; s := s + i;
7 return s ;
Sortie
7 return s ;
Sortie
Sortie
B A B A
AB A | B A* ou A+
Entrée
Ensemble de chemin sous forme
d’expression régulière pour ce graphe
de contrôle : 1-2 i := 0; s := 0
(Entrée.1-2.3.(4-5.3)*.7.Sortie)
3
Objectifs :
Vérifier le respect de certains standards de codage
(généraux, propres à l’industriel, issus de contraintes sur
le système, . . . ).
Remarque :
Si le relecteur connaît la spécification correspondant au code
source, il pourra également détecter des erreurs fonctionnelles
Par exemple :
Nombre suffisant de commentaires utiles
Code structuré (éviter l’utilisation de goto, exit,. . . )
Limiter l’utilisation de littéraux. Utiliser plutôt des
constante pour la compréhension et la maintenabilité
Taille de procédure et fonction acceptables
Décision exprimée de façon simple
Absence de boucles utilisant l’opérateur 6= dans la
condition de terminaison
utiliser while i < max
plutôt que while i 6= max
Conclusion :
La vérification de tous ces critères permet d’avoir une
bonne idée de la qualité du code source
I1 : X=1
..
.
I2 : If X = 1 then
Initialisation de variable
Variable référencée :
Dans le prédicat d’une instruction de décision (if, while,
. . . ) : il s’agit d’une p-utilisation
Dans les autres cas (par exemple dans un calcul), il s’agit
d’une c-utilisation
d : définie
u
c : c-utilisation
cp p : p-utilisation
k k : détruite (killed)
Utilisé dynamiquement :
Définition de critères de couverture liés à la vie des
variables
du c | u u* ou u+
PGCD(p, q) : Entrée kp
1: read(p, q) dp
2: while p 6= q do read
3: if p > q then pp
4: p =p−q while
p=q
5: else p 6= q
pp
6: q =q−p if
7: end if p>q p<q
cp
8: end while return then else
9: return p cp , dp
cp
kp
end if
Sortie
kd(pp(cd|c))*pck) pp
while
p=q
p 6= q
pp
if
p>q p<q
cp
return then else
cp
cp , dp
kp
end if
Sortie
Exemple :
« kdpck » correspond au chemin :
(Entrée,read,While,Return,Sortie)
« kdppcdpck » correspond au chemin :
(Entrée,read,While,If,Then,EndIf,Return,Sortie)
dd Double définition
du (dc, dp) Définition puis utilisation ; séquence normale
dk Définition puis destruction ; probablement
une erreur (variable inutilisée)
ud Utilisation avant définition ; si la variable a
été définie précédemment, cas normal, sinon
c’est une erreur
Séquence d’erreur « kp » :
⇒ utilisation d’une variable non initialisée
p
d
d c p
c
p
d
d c p
c
p
d
d c p
c
p
d
d c p
c
p
d
d c p
c
p
d
d c p
c
p
d
d c p
c
ADUP
AU
ACU+P APU+C
ACU AD APU
C1 (branches)
C0 (instructions)
S. Taktak Test et Validation du Logiciel Test Structurel 108/114
Test Mutationnel
Pour un programme P :
Soit M(P) l’ensemble de tous les mutants obtenus par le
modèle de faute
Certains mutants peuvent avoir le même comportement
que P, noter E(P)
Exécution des tests sur chacun des mutants de M(P). On
note DM(P) l’ensemble de ceux qui ne fournissent pas le
même résultat que P
Score de mutation MS(P, T ) :
DM(P)
MS(P, T ) =
M(P) − E (P)
Pour l’instruction :
if a > 0 then x := y ;
Conclusion :
Méthode permettant d’avoir une image précise de la
fiabilité des tests