Nous sommes nominés pour le prix Embedded Award 2026 dans la catégorie Outils et nous serions ravis de recevoir votre soutien ! Votez pour C/C++test CT >>
En savoir plus sur le test Parasoft C/C++.
Rejoignez notre démo de produit mensuelle de 30 minutes.
Inscrivez-vousWEBINAIRE
La couverture structurelle est l'identification du code qui a été exécuté et enregistré. Il existe plusieurs raisons pour lesquelles il est important d'effectuer cette activité pour les systèmes embarqués critiques pour la sûreté et la sécurité. La première consiste à déterminer si le logiciel a été testé de manière adéquate. Une autre consiste à satisfaire aux exigences de conformité et de certification. Vous voudrez peut-être également vous assurer qu'il n'y a pas de code mort dans votre logiciel.
Cette présentation plonge en profondeur dans couverture de code structurelle pour le développement C et C++, en mettant l'accent sur son importance pour les systèmes critiques pour la sécurité et en explorant divers critères de mesure tels que la couverture des instructions, des branches et des MC/DC. Nous aborderons également des méthodes pratiques pour obtenir et automatiser la couverture du code.
Nous vous montrerons la couverture structurelle du code pour les instructions, les succursales et les MC/DC, ainsi que des rapports et des mesures automatisés pour la couverture et la complexité du code.
La couverture de code consiste à identifier les parties de votre code qui ont été réellement exécutées lors des tests. C'est un indicateur clé pour déterminer si votre logiciel a été testé de manière suffisamment approfondie. Pour les systèmes embarqués critiques pour la sécurité, c'est essentiel pour la conformité et la certification. De plus, elle vous aide à identifier et à éliminer le code mort, c'est-à-dire le code qui n'a jamais été exécuté.
Fondamentalement, la couverture du code répond à la question : « Ai-je suffisamment testé ? » Elle permet également de détecter les bugs cachés dans les sections non testées. La grande question est : voulez-vous risquer ces zones non testées ? Dans de nombreux secteurs réglementés, vous n'avez peut-être pas le choix : vous devrez peut-être atteindre une couverture de 100 %.
Au cours de la démonstration, les fonctionnalités clés sont présentées :
Le moyen le plus courant de obtenir une couverture de code L'instrumentation du code consiste à ajouter de petits morceaux de code à votre code source d'origine. Ces ajouts permettent de suivre l'exécution d'une instruction, d'une décision ou d'une branche. L'instrumentation enregistre ensuite ces informations, permettant aux outils de calculer un pourcentage de couverture et de visualiser les parties du code concernées.
Votre code peut être surligné en vert (testé) avec quelques parties en rouge (non testé). Certains outils affichent du code partiellement couvert, souvent en jaune. Cela peut se produire avec un if énoncé comportant plusieurs conditions, où tous les résultats possibles de ces conditions n'ont pas été testés.
Lorsque nous parlons de couverture structurelle, nous examinons différentes manières de mesurer la rigueur des tests de la structure du code. Bien que les termes puissent parfois être surchargés ou interprétés différemment selon les secteurs, les principaux types pour les applications C et C++ critiques pour la sécurité sont :
true et false résultats d'une if (instruction) a été exécutée.(A && B), MC/DC nécessite des tests qui montrent A changer le résultat tout en B est fixe, et B changer le résultat tout en A est corrigé, en plus de tester toutes les branches.D'autres types existent, comme la couverture conditionnelle (test de conditions individuelles) et la couverture de ligne (garantie de l'exécution de chaque ligne, qui peut différer de la couverture d'instruction si plusieurs instructions sont sur une même ligne). Cependant, les instructions, les branches et les MC/DC sont les plus fréquemment citées dans les normes de sécurité.
Déterminer manuellement les cas de test exacts nécessaires pour atteindre des objectifs de couverture spécifiques peut être extrêmement chronophage. Heureusement, les outils peuvent apporter une aide précieuse.
Conseiller en couverture Les fonctionnalités peuvent analyser votre code et suggérer des valeurs de paramètres ou des conditions préalables spécifiques pour vos tests unitaires, afin d'atteindre des lignes ou des branches spécifiques. Cela peut considérablement accélérer la création des cas de test.
Génération automatisée de cas de test unitaire est une autre fonctionnalité puissante. Les outils peuvent générer automatiquement une suite de tests unitaires conçus non seulement pour vérifier les fonctionnalités, mais aussi pour répondre à vos exigences de couverture structurelle. Ces tests générés incluent souvent différents types de vérifications, comme des tests de pointeur nul, des tests de valeurs limites et des tests mid-max, afin de détecter d'éventuels bugs et d'améliorer la couverture.
Il est rare qu'une seule méthode de test permette d'atteindre une couverture de 100 %, surtout si votre objectif est élevé. Voici comment combiner différentes méthodes :
Les outils modernes permettent de fusionner les résultats de couverture issus de ces différentes méthodes de test. Vous obtenez ainsi une vue consolidée de la couverture totale de votre code, répondant ainsi aux exigences de conformité qui autorisent la combinaison des métriques.
Pour un développement moderne, l'intégration de la couverture de code à votre pipeline d'intégration continue/livraison continue (CI/CD) est essentielle. Des outils peuvent instrumenter votre application lors du processus de build, collecter des données de couverture brutes lors de tests automatisés, puis générer des rapports sur ces données dans votre IDE ou un tableau de bord central (comme la plateforme de tests de développement (DTP) de Parasoft).
Cela permet un retour continu sur la qualité et les risques du code, favorisant ainsi une meilleure prise de décision tout au long du cycle de développement. Les intégrations avec des outils CI/CD populaires comme Jenkins, GitLab et Azure DevOps sont courantes.
La couverture structurelle du code est une pratique essentielle pour garantir la qualité, la sécurité et la fiabilité des logiciels, en particulier dans les secteurs réglementés. En comprenant les différents types de couverture, en tirant parti de l'automatisation et en intégrant l'analyse de couverture à votre workflow de développement, vous pouvez répondre efficacement aux exigences de conformité et créer des logiciels plus robustes.