Nombre cyclomatique
Le nombre total de chemins est généralement trop grand pour être, en pratique, représentatif
du nombre de tests à réaliser. On utilise plutôt une autre mesure, issue de la théorie des gra-
phes : le nombre cyclomatique.
Il mesure le nombre de chemins indépendants du graphe de contrôle. En eet, l'ensemble des
circuits d'un graphe forme un espace vectoriel, qui a donc une dimension : c'est le nombre
cyclomatique.
Il y a plusieurs manières de le calculer (pour un graphe connexe) :
I E ¡ N + 2 où E est le nombre d'arcs et N le nombre de n÷uds
I nombre de zones délimitées dans le plan (si le graphe est planaire)
I nombre de décision binaire + 1 (si uniquement des décisions binaires)
1
Exercice
Pour la fonction found dont le code est donné ci-dessous :
1. Donner le graphe de contrôle G(found) associé à la fonction f .
2. Calculer le nombre cyclomatique n de G(found).
3. Construire l'expression régulière représentant les chemins d'execution.
4. Exhiber les n chemins indépendants choisis et les n cas de test correspondants.
2
boolean found (int[] tab, int n){
int inf = 0;
int sup = [Link] ¡ 1;
int middle;
while (inf < sup) {
middle = (inf + sup) / 2;
if (n < tab[middle])
sup = middle;
else
inf = middle + 1;
}
return (n == tab[middle]);
}
3
Exercice
Pour la fonction f dont le code est donné ci-dessous :
1. Donner le graphe de contrôle G(f ) associé à la fonction f .
2. Donner l'expression des chemins du graphe de contrôle G(f ).
3. En déduire le nombre de chemins de contrôle du graphe G(f ).
4. Calculer le nombre cyclomatique de G(f ).
5. Donner des DT qui vont couvrir les instructions return de la fonction.
6. Donner un chemin de contrôle non exécutable de G(f ).
4
int f (int b, int c, int x) {
int a, y , d , e;
if (0 < b && b < c && c < 10) {
d = 2 * b;
f = 3 * c;
if (x >= 0) {
y = x;
e = c;
if (y = 0) {
a = f ¡ e;
if (d < a) {
return a;
} else {
return d;
}
}
}
}
return ¡1;
}
5
Couverture des conditions
Une condition est une formule atomique d'une décision (une formule qui n'est pas un opéra-
teur logique).
La couverture des conditions consiste à s'assurer que les tests exercent toutes les conditions
de chaque décision au moins une fois à true et une fois à false.
Attention, la couverture des conditions n'implique pas la couverture des décisions. En eet,
considérez les instructions suivantes :
bool f (bool e, bool f ) { return (e && f ) }
if (f (a,b)) ...
6
Couverture des conditions mutiples
La couverture des conditions multiples consiste à s'assurer que les test exercent toutes les
combinaisons de valeurs possibles pour les conditions.
Attention, la couverture des conditions n'implique toujours pas la couverture des décisions.
En eet, considérez les instructions suivantes :
bool f (bool e, bool f ) { return false; }
if (f (a,b)) ...
Ce genre de problème est détecté par la couverture des décisions.
Remarque. Le nombre de tests à réaliser pour une décision est exponentiel en le nombre de
conditions de cette décision.
7
Couverture des conditions/décisions modiée
La couverture des conditions/décisions modifiée (MC/DC) consiste à vérifier que chaque
condition d'une décision a un impact sur la décision [DO178] :
every condition in a decision in the program has taken all possible outcomes at least
once
every condition in a decision has been shown to independently aect that decision's
outcome
Autrement dit, pour chaque décision, pour chaque condition de cette décision, il faut au
moins deux tests qui dièrent uniquement sur la valeur de cette condition, et qui changent la
valeur de la décision.
Remarque. La couverture MC/DC est plus faible que la couverture des conditions multiples
mais elle est plus réaliste en pratique (elle permet d'éviter l'explosion combinatoire).
8
Exercice
Reprendre la fonction f dénie précédemment et fournir des données de test de manière à
atteindre les niveaux de couverture suivants :
1. couverture des décisions
2. couverture des conditions
3. couverture des conditions multiples
4. couverture des conditions/décisions modiée