logo

Couverture des conditions/décisions modifiées (Modified condition/decision coverage - MC/DC - MCDC)




Exemple simple

Considérons l'extrait de code suivant :

    if ( (A || B) && C )
{
/* instructions */
}
else
{
/* instructions */
}

où A, B et C représentent des expressions booléennes atomiques (i.e. non redivisibles en d'autres sous-expressions booléennes).

Pour que les critères de la couverture des conditions soient vérifiés sur cet exemple, il faut que A, B et C aient été évalués au moins une fois "true" et une fois "false" lors des tests, ce qui serait le cas avec 2 tests aboutissants aux évaluations respectives de A, B et C suivantes :

          A = true  / B = true  / C = true
          A = false / B = false / C = false

Pour que les critères de la couverture des décisions soient en outre satisfaits, il faut que la décision ( (A ou B) et C ) soit elle aussi au moins une fois évaluée à "true" et une fois à "false". Or pour nos tests précédents :

          A = true  / B = true  / C = true   --->  la décision est évaluée à "true"
          A = false / B = false / C = false  --->  la décision est évaluée à "false"

et donc la couverture des décisions est elle-aussi réalisée.

Cependant, ces deux tests ne permettent une couverture des conditions/décisions modifiées qui exige que chaque variable booléenne soit évaluée une fois à "true" et une fois à "false" tout en ayant une influence sur le résultat final. C'est-à-dire que d'un cas de test à l'autre, le changement d'une seule condition atomique changera aussi la décision ; or avec les deux seuls tests précédents, il est impossible de savoir quel booléen influence l'évaluation de la décision...

En pratique, pour n opérandes booléens, il faut trouver au minimum n+1 tests pour pouvoir assurer la couverture des conditions/décisions modifiées. Ayant 3 opérandes booléens (A, B et C), on pourra (par exemple) choisir le lot de tests suivant :

          A = false / B = false / C = true   --->  la décision est évaluée à "false"
          A = false / B = true  / C = true   --->  la décision est évaluée à "true"
          A = false / B = true  / C = false  --->  la décision est évaluée à "false"
          A = true  / B = false / C = true   --->  la décision est évaluée à "true"

En effet dans ce cas :

  • du 1 er au 4 e scénarios de test, seul A change de valeur, et ce changement a pour effet de changer la valeur de la décision ("false" dans le 1 er cas, "true" dans le 2 e) ;
  • de même, du 1 er au 2 e, seul B change de valeur, et la valeur de la décision change également (passant de "false" à "true") ;
  • enfin, du 2 e au 3 e, seul C change de valeur et la valeur de la décision change également (passant de "true" à "false").

De plus, les critères de couverture de décisions et de conditions sont toujours respectés (chaque variable booléenne prend au moins une fois les valeurs "true" et "false", de même que la décision globale). La couverture des conditions/décisions modifiées est alors assurée.


Exemple plus conséquent

Remplaçons la condition ( (A || B) && C )
par : ( ((u == 0) ou (x>5)) && ((y<6) || (z == 0)) )

Une couverture de test intégrale consisterait à construire la table de vérité suivante et tester chaque cas :

Cas de test n° A : (u == 0) B : (x>5) C : (y<6) D : (z == 0) ( (A || B) && (C || D) )
1 F F F F F
2 F F F V F
3 F F V _ F
4 F V F F F
5 F V F V V
6 F V V _ V
7 V _ F F F
8 V _ F V V
9 V _ V _ V

En revanche, dans le cadre d'une couverture des conditions/décisions modifiées, il nous suffirait (par exemple) de tester uniquement les cinq combinaisons ci-dessus surlignées en jaune.

Revoir les différents niveaux de couverture de test

Memento :

Condition (ou Opérande booléen ou Sous-décision) : une formule logique insécable (atomique). On parle souvent de variable booléenne, elle est représentée par une lettre majuscule (A, B, C, etc.), peut avoir pour valeur "true" ou "false", mais ne peut pas être redivisée en d´autres "sous-conditions" plus simples.

Décision : une formule logique pouvant être composée de plusieurs conditions séparées par des connecteurs logiques tels "ou", "et", "ou exclusif", etc.

L´outil d´analyse de couverture du code Testwell CTC++ englobe toutes les catégories de couvertures de test, y compris les niveaux les plus élevés : la couverture des conditions / décisions modifiées (MC/DC) et surtout celle des conditions multiples (MCC). Il peut ainsi être utilisé pour obtenir des certifications comme DO-178C, EN 50128, EN 61508 ou ISO 26262.