Génie Logiciel
Tests Logiciels
A M I NA TA ZERBO/SA BA NE
Plan
üIntroduction
üTests Boite Blanche
üTests Boite Noire
3 3
Tests Logiciels : Tests Boite Blanche
4 4
Tests Boite Blanche
Tests boite blanche ou tests structurels
Tests basés sur la structure interne du code
◦ Nécessitent de connaître le code
◦ détectent principalement les erreurs commises
Plusieurs techniques
◦ Couverture du flot de contrôle
◦ Couverture du flot des données
◦ Test par mutation
5 5
Couverture
du Flot de Contrôle
Graphe de Flot de Contrôle
Un graphe de flot de contrôle
(Control Flow Graph –CFG) est une
représentation sous forme de
x≠y graphe orienté de tous les chemins
possibles dans un programme
x<=y x>y x=y
Les nœuds sont des blocs
d’instructions séquentielles
7 7
Graphe de Flot de Contrôle
Les arêtes (encore appelées arcs ou
branches) sont des transferts de
contrôle
x≠y
Les arêtes peuvent être étiquetées
x<=y x>y x=y avec un attribut représentant la
condition du transfert de contrôle
Chaque graphe comporte un nœud
« entrée » et un nœud « sortie »
8 8
Graphe de Flot de Contrôle
Public int computeGCD(int x, int y){
Int gcd
while (x!=y){
if (x>y){ x!=y
x= x – y;
}else{ x<=y x>y x=y
y = y – x;
}
}
gcd = x;
return gcd;
}
9 9
Principes du CFG
Séquence Si-Alors-Sinon Boucle tant que Commutateur
(If-Then-Else) (While loop) (Switch)
10 10
Principes du CFG
Ammann & Offutt
11 11
Principes du CFG
Ammann & Offutt
12 12
Principes du CFG
Ammann & Offutt
13 13
Principes du CFG
Ammann & Offutt
14 14
Principes du CFG
Ammann & Offutt
15 15
Principes du CFG
Ammann & Offutt
16 16
Principes du CFG
Ammann & Offutt
17 17
Principes du CFG
Ammann & Offutt
18 18
Principes du CFG
Construire le graphe de contrôle
de la fonction suivante
[Link] int factorial(int n){
2. int i, result = 1;
3. for (i=2; i<=n; i++) {
4. result = result * i;
5. }
6. return result;
7.}
19 19
Principes du CFG
Construire le graphe de contrôle de la fonction suivante
[Link] int compute(int){
2. int sum, i;
3. sum=0;
4. i=inf;
5. while (i<=sup) {
6. sum=sum+a[i];
7. i=i+1
8. }
9. return sum;
10.}
20 20
Chemin de Contrôle
Chemin qui part de l’entrée à la sortie du graphe
Chaque exécution correspond à un chemin de contrôle
dans le graphe de contrôle
If (y <= 0){
x=y+1;
}
If (y>0){
x=y-1;
}
21 21
Chemin de Contrôle
a Chaque exécution correspond
y<=0 If (y <= 0){ à un chemin de contrôle dans
y>0
x=y+1; le graphe de contrôle
b
}
If (y>0){
c
x=y-1; Lister tous les chemins de
} contrôle du graphe
d
y>0
y<=0 e
22 22
Chemin de Contrôle
Chaque exécution correspond à un chemin
a de contrôle dans le graphe de contrôle
y<=0 If (y <= 0){
x=y+1;
y>0
b
} ◦ Attention, tout chemin n'est pas
If (y>0){ exécutable
c
x=y-1; 1. Pour chaque chemin dire s’il est
exécutable ou non
d }
y>0
2. Trouver des données de test
y<=0 e
permettant d’exécuter chaque
chemin de contrôle exécutable
f
23 23
Critère de Couverture
Un critère est un ensemble de règles définies sous certaines
hypothèses et qui décrivent les propriétés qu'un jeu de tests
doit satisfaire
La couverture de code est une mesure utilisée en génie
logiciel pour décrire le taux de code source testé d'un
programme
◦ Mesure la qualité des tests effectués
24 24
Critère de Couverture
Il existe de nombreux critères de couvertures
Exemples de critères de couverture
1. Couverture des fonctions (Function Coverage) - Chaque
fonction dans le programme a-t-elle été appelée ?
2. Couverture des instructions (Statement Coverage) -
Chaque ligne du code a-t-elle été exécutée et vérifiée ?
25 25
Critère de Couverture
Il existe de nombreux critères de couvertures
Exemples de critères de couverture
3. Couverture des points de tests (Condition Coverage) -
Chaque point de décision a-t-il été exécuté et vérifié ? (Le
point de test teste-t-il ce qu'il faut ?)
4. Couverture des chemins d'exécution (Path Coverage) -
Chaque chemin d’excution possible a-t-il été exécuté et
vérifié ?
26 26
Couverture des Nœuds
Exige de couvrir tous les nœuds dans le CFG (toutes les
instructions du code)
Important car il est impossible de découvrir des anomalies si
les instructions les contenant ne sont pas exécutées
Taux de couverture=|{nœuds couverts}| /|{nœuds}|
27 27
Couverture des Nœuds
En pratique, plusieurs entrées (données de test) exécutent
les mêmes instructions
Pouvons-nous minimiser les cas de test à utiliser pour
couvrir tous les nœuds?
Incomplétude : Un taux de couverture de 100% des nœuds
ne signifie pas la couverture de tous les cas
28 28
Couverture des Nœuds
La couverture des instructions peut mener à l’incomplétude
if (x < 0){
x = -x;
} Un cas x < 0 couvre toutes les instructions.
z = 1/x;
--------------- Mais le cas x >= 0 n’est pas pris en compte.
if (x < 0){ Le code implicite (en italique et rouge) n’est
x = -x; pas couvert
}else
null; Ne rien faire pour le cas x >= 0 peut s’avérer
z = 1/x; faux, voire dangereux et devrait être testé
29 29
Couverture des Arêtes
Exige de visiter au moins une fois toutes les arêtes du
graphe de flot de contrôle
◦ Exercer toutes les conditions qui gouvernent le flot de
contrôle du programme avec des valeurs vraies et fausses
Taux de couverture=|{Arêtes couvertes}| /|{Arêtes}|
30 30
Exercice
int puissance(int X, int N) {
int S = 1; • Construire le graphe de
int P = N; contrôle de la fonction ci-
while(P >= 1) { contre
if(P mod 2 != 0) {
P = P - 1; • Donner un jeu de test pour
S = S * X; couvrir tous les nœuds
}
S = S * S; • Donner un jeu de test pour
P = P/2; couvrir toutes les branches
} (arêtes ou arcs)
return S;
} 31 31
Références
Références
Ce cours est basé sur le cours Méthodes de test et
validation du Logiciel du Pr. Antoniol Giuliano de l’Ecole
Polytechnique de Montréal
INF4000-GL (UO1/SEA/DI/SITR) 33 A. Z. SABANE