En génie logiciel, la couverture de code est une mesure utilisée pour décrire le taux de code source exécuté d'un programme quand une suite de test est lancée. Un programme avec une haute couverture de code, mesurée en pourcentage, a davantage de code exécuté durant les tests ce qui laisse à penser qu'il a moins de chance de contenir de bugs logiciels non détectés, comparativement à un programme avec une faible couverture de code[1],[2]. Différentes métriques peuvent être utilisées pour calculer la couverture de code ; les plus basiques sont le pourcentage de sous routine et le pourcentage d'instructions appelées durant l'exécution de la suite de test.
La mesure de ce taux implique souvent l'utilisation de tests unitaires.
Il y a de nombreuses méthodes pour mesurer la couverture de code[3]. Les principales sont[4] :
Certaines méthodes sont liées, par exemple :
void foo(int bar)
{
printf("this is ");
if (bar < 1)
{
printf("not ");
}
printf("a positive integer");
}
Si la fonction foo est appelée avec l'argument bar = -1, alors on assure la couverture des instructions (elles sont toutes exécutées) ; par contre, la couverture des points de tests n'est pas assurée.
Une couverture complète des chemins est généralement très difficile à accomplir, voire impossible :
La couverture de chemins consiste plus à regrouper les chemins par ressemblance (par exemple, ne différant que par le nombre de parcours de boucles) et à tester ces chemins « de base ».
Pour faciliter les tests, on instrumente le code source de façon à tracer l'exécution au cours des tests. La « trace » résultante est ensuite analysée pour identifier les chemins et les zones de code qui n'ont pas été vérifiés, puis les tests sont mis à jour (si nécessaire) pour améliorer la couverture. Combinée à d'autres méthodes, il est possible d'aboutir à un ensemble abordable (réaliste) de tests de non-régression.
La couverture de code accomplie est exprimée sous forme de pourcentage du code total. La signification de ce pourcentage dépend des types de couvertures effectuées : tester « 67 % des chemins possibles » est plus utile que « 67 % des instructions ».
Également appelé « decision coverage », cette méthode est utilisée par la norme DO-178B[5] pour les logiciels soumis avec de très hauts critères de sécurité.
Pour valider le MC/DC, pendant le test, tous les points ci-dessous doivent être vrais au moins une fois[6] :
exemple :
if ((a || b) && c)
les critères de décision/condition sont validés, si :
Cependant dans ce cas, b dans le premier test et c dans le second n'influence pas le résultat, il faudrait donc tester, pour satisfaire la méthode MC/DC, avec :