Logo Parasoft

Découvrez GoogleTest certifié TÜV avec Agentic AI pour les tests C/C++ !
Plus de détails »

Fond géométrique avec des touches de bleu et de vert
Image de couverture du livre blanc sur l'importance d'utiliser une solution de test C/C++ unifiée

Livre blanc

L'intérêt d'utiliser une solution de test unifiée C/C++

Avant de vous lancer, consultez l'aperçu ci-dessous.

Marché

Les efforts de vérification et de validation des logiciels dépendent des objectifs de sécurité fonctionnelle, du niveau de risque de l'entreprise et de la culture qualité de l'organisation. Produire des logiciels sûrs, sécurisés et de haute qualité exige plus que de la détermination : cela requiert de solides connaissances et une combinaison appropriée de techniques et d'outils de test.

Cet article explique comment les équipes de développement peuvent améliorer l'assurance qualité en combinant des techniques de test automatisées, notamment :

Les concepts abordés s'appliquent à tous les langages de programmation, avec des exemples tirés du développement en C/C++. Parasoft C / C ++test .

Il n'existe pas de solution miracle.

Lorsqu'on envisage d'éventuels dysfonctionnements logiciels de haut niveau, on peut distinguer plusieurs classes d'erreurs logicielles :

  • Erreurs résultant d'exigences manquantes
  • Erreurs dues à des exigences mal spécifiées
  • Erreurs dues à un codage incorrect des exigences

Les deux premières catégories relèvent de la gestion des exigences. Cet article se concentre sur la troisième catégorie, qui englobe un large éventail de problèmes logiciels potentiels.

Que signifie « une exigence a été codée incorrectement » ? Cela peut avoir plusieurs significations.

Prenons l'exemple d'un module logiciel conçu pour traiter deux mille échantillons par seconde.

  • Le résultat peut être parfaitement correct en termes de valeurs, mais invalide car la réponse n'a pas été fournie dans les délais impartis.
  • L'algorithme peut calculer incorrectement le nombre d'échantillons dans la mémoire tampon en lisant des valeurs aléatoires en dehors de celle-ci.
  • Ou bien l'état initial des variables peut ne pas être correctement défini, ce qui entraîne des erreurs transitoires.
  • Enfin, la logique des points de branchement peut être mal codée, ce qui entraîne la production de code mort qui ne sera jamais exécuté.

Aucune technologie ne permet d'éliminer efficacement tous les types d'erreurs. La mémoire non initialisée peut être détectée par une analyse statique basée sur des modèles, tandis que la détection d'un dépassement de tampon nécessite une analyse statique avancée basée sur les flux ou une surveillance de la mémoire en temps réel. Le code qui ne s'exécute jamais peut être identifié par analyse de la couverture du codeLes exigences de bas niveau doivent avoir des tests unitaires correspondants, incluant des contrôles de performance et des liens de traçabilité vers les exigences qu'elles vérifient et valident.

Tous les projets logiciels n'ont pas besoin de toutes les technologies de test disponibles, et les organisations sont confrontées au dilemme de trouver un équilibre entre budget et qualité. Les projets liés à la sécurité fonctionnelle sélectionneront très probablement toutes les technologies disponibles afin de garantir une qualité irréprochable et la conformité aux normes de sécurité logicielle, telles que : ISO 26262, DO-178C, IEC 62304.

Les équipes optent généralement pour l'analyse statique, les tests unitaires, les tests d'intégration, les tests système et la couverture de code, car ces méthodes semblent couvrir une part importante des défauts logiciels. Quoi qu'il en soit, les équipes chargées de concevoir les processus d'assurance qualité doivent connaître l'environnement et comprendre les conséquences du choix d'un sous-ensemble particulier des technologies de test disponibles.

La réticence à mettre en œuvre un large éventail de technologies de test découle souvent de la crainte que l'utilisation de plusieurs techniques n'impose des contraintes importantes au rythme de développement et n'ait un impact sur le budget.

Le coût de plusieurs outils distincts, la courbe d'apprentissage et la nécessité de jongler entre différents modèles d'utilisation et interfaces peuvent s'avérer problématiques. De ce fait, les développeurs auront tendance à éviter l'utilisation d'outils et l'automatisation, car cela détourne leur attention de l'écriture de code vers l'utilisation de ces outils, ce qui diminue leur productivité.

Panorama des défauts logiciels et des stratégies de détection.
Panorama des défauts logiciels et des stratégies de détection.

L'intérêt de disposer d'un outil de test unifié

Il est important de préciser les attentes vis-à-vis d'un outil de test unifié avant d'en discuter la valeur. Cet outil doit :

  • Prise en charge de plusieurs technologies de test
  • Soyez facile à utiliser
  • Détection des bugs, des vulnérabilités et des régressions
  • Assurer la traçabilité des exigences aux tests
  • Mesurer la complexité, la portabilité et la maintenabilité du code
  • Éduquez les développeurs en leur fournissant des commentaires instantanés lorsqu'ils écrivent le code
  • Fournir des informations sur la progression du développement
  • Combinez les résultats de différentes techniques pour des analyses avancées
  • Réduire les délais de mise sur le marché, par exemple grâce à l'IA agentive

Les tests unifiés permettent d'éviter un certain nombre de problèmes, notamment :

  • Courbes d'apprentissage multiples
  • Intégration des outils de déchaumage avec différentes interfaces
  • Empêcher l'échange d'informations entre différents éléments d'une chaîne d'outils

Détecter le plus grand nombre de défauts possible

Comme indiqué dans l'introduction, les défauts logiciels se répartissent en différentes catégories ; il est donc impossible de tous les identifier avec une seule technique de test. Pour illustrer cela par un exemple concret, prenons l'extrait de code suivant :

Exemple de code source.

Exemple de code source.

Ces quelques lignes de code présentent plusieurs problèmes. Plus précisément, à la ligne 13, le développeur tente d'initialiser un tampon global à l'aide de la valeur d'index calculée par la fonction `calculateIdx()`, sans vérifier si cette valeur se situe dans la plage autorisée. Même des dizaines de tests manuels ne permettraient pas de déceler ce problème, car l'écriture d'une valeur entière à un emplacement mémoire aléatoire produit rarement un effet spectaculaire immédiat.

Mais un jour, probablement après la publication, l'organisation de la mémoire pourrait changer, et l'opération de la ligne 13 provoquerait le plantage de l'application. Curieusement, l'analyse statique pourrait également ne pas détecter ce problème à cause de la boucle utilisée pour calculer l'index.

À l'inverse, un outil de surveillance de la mémoire, qui instrumente le code source en injectant des contrôles spécifiques et en signalant les opérations mémoire incorrectes, ne détecte les problèmes logiciels que sur les chemins d'exécution. Cette approche ne repose sur aucune supposition, ce qui constitue un avantage considérable par rapport à l'analyse statique, car la précision des problèmes signalés est très élevée. Dans cet exemple, le logiciel de détection d'erreurs de mémoire Parasoft a facilement identifié le problème.

Détection des problèmes fonctionnels et des régressions

Détecter les écarts entre les résultats attendus et les résultats obtenus nécessite de comparer les résultats aux spécifications prédéfinies. Bien que le cœur analyse statique et dynamique Les outils de détection de défauts tels que les erreurs de mémoire ou les failles de sécurité permettent de valider le bon fonctionnement du système, tandis que la validation repose généralement sur d'autres pratiques. Les méthodes les plus courantes incluent les tests système manuels, les tests d'intégration et les tests unitaires.

Tests unitairesL'utilisation de tests unitaires, qui exige des développeurs qu'ils créent des cas de test avec des assertions de vérification, est une méthode essentielle pour détecter les régressions fonctionnelles. (Les aspects techniques fondamentaux des tests unitaires ne sont pas abordés ici.) Cet article se concentre plutôt sur la manière dont un outil de test unifié peut améliorer le processus de tests unitaires afin d'accroître la productivité et l'efficacité sans entraver le travail des développeurs.

Un outil de test unifié peut faciliter le processus de tests unitaires dans de nombreux domaines. Voici quelques avantages :

  • Accroître la productivité des développeurs lors de la création de cas de test, par exemple en fournissant des assistants graphiques pour la création, la modification et la configuration de ces cas de test.
  • L'intégration avec les frameworks de stubbing/mocking permet de simuler facilement des scénarios de test complexes, sans nécessiter de vastes bases de code.
  • Corréler les cas de test avec les rapports de couverture de code pour évaluer l'exhaustivité des tests
  • Optimisation des sessions de test par le calcul automatique de l'ensemble minimal de cas de test requis pour vérifier les modifications du code.
  • Fusionner les rapports de couverture de code provenant d'autres techniques de test, telles que les tests manuels/système ou les tests d'intégration, afin d'identifier le code non testé.
  • Traduire les résultats en fonction des exigences pour mieux comprendre l'impact des tests non concluants

La création de tests à l'aide d'assistants ou d'éditeurs graphiques peut accroître la productivité de toute une organisation en impliquant les équipes d'assurance qualité dans la rédaction des tests unitaires, les faisant ainsi contribuer activement au processus de développement. Il est plus facile pour les membres de l'équipe d'assurance qualité d'utiliser des assistants graphiques que d'écrire du code de test approprié dans des éditeurs de code, car la configuration des valeurs à l'aide de formulaires de saisie ne requiert pas de compétences avancées en programmation et est moins chronophage, surtout si les membres de l'équipe manquent d'expérience. Cependant, Parasoft a franchi une nouvelle étape et intègre un serveur MCP et des agents d'IA pour effectuer des tests de manière autonome.

Traçabilité des exigences

Les rapports de couverture des tests unitaires et système fournissent des données précieuses, surtout lorsqu'ils sont combinés. Cependant, sans traçabilité aux exigences, les équipes manquent du contexte nécessaire pour répondre à des questions essentielles, telles que :

  • Toutes les exigences sont-elles mises en œuvre ?
  • Toutes les exigences de bas niveau sont-elles satisfaites ?
  • Qu’en est-il des 2 % de tests qui ont échoué ?
  • Quel est leur impact sur la qualité globale du système ?
  • Bloquent-ils la sortie ?
  • Peut-être n'affectent-elles que des fonctionnalités obsolètes, sans impact sur les cas d'utilisation importants ?

En jetant un coup d'œil à un rapport de traçabilité des tests aux exigences répond à toutes ces questions.

La possibilité de corréler les exigences avec les résultats de différents types de tests constitue un avantage majeur de l'utilisation d'un outil de test unifié. Les résultats des tests unitaires, des tests système, des tests d'intégration, ainsi que les résultats des normes de codage et des métriques de code peuvent être corrélés afin de fournir un retour d'information sur la conformité aux exigences critiques et non critiques.

Évaluation de la complexité, de la portabilité et de la maintenabilité du code

La validation complète de toutes les exigences et la couverture de code quasi totale témoignent de la bonne progression d'un projet. Toutefois, ces données ne fournissent aucune information sur les coûts futurs liés au développement, au déploiement et à la maintenance du produit final.

  • La vitesse restera-t-elle la même jusqu'à la fin du projet ?
  • Quel sera le coût de la maintenance du code ?
  • Et le coût d'une éventuelle refactorisation du code ?

Il est quasiment impossible de répondre à ces questions sans s'appuyer sur des indicateurs de code, tels que la complexité cyclomatique, la profondeur moyenne d'héritage, le nombre moyen de paramètres de fonction et, surtout, la quantité de code dupliqué. Tous ces indicateurs fournissent des informations précieuses qui aident les chefs de projet à évaluer l'état du code du projet et les coûts futurs liés à sa maintenance et à ses modifications.

Graphique analytique abstrait

Former les développeurs en leur fournissant un retour d'information instantané

Maintenir les indicateurs de qualité du code dans la plage optimale et prévenir le code à risque ne se fait pas automatiquement. Les développeurs ont besoin de retours sur leur code, et plus ils les reçoivent rapidement, plus ils peuvent les modifier rapidement après le développement. Ainsi, un retour immédiat réduit le coût des améliorations, tandis qu'un retour différé, jusqu'aux compilations nocturnes ou même aux sessions d'intégration continue, l'augmente.

La solution idéale intègre la conformité aux normes de codage directement dans l'environnement de développement intégré (IDE), en fournissant un retour d'information interactif pendant la saisie du code. Un outil de test unifié devrait permettre cela en offrant la flexibilité nécessaire aux équipes pour choisir leurs règles de codage et déployer les extensions IDE requises. En définitive, le moyen le plus efficace d'empêcher la réapparition de constructions de code problématiques est d'appliquer automatiquement les règles de codage, permettant ainsi aux développeurs d'apprendre et de s'adapter en temps réel.

Analyse avancée et analyse d'impact des tests

Les données issues des différentes techniques de test utilisées dans un projet, une fois combinées, offrent un potentiel considérable pour l'inférence de métriques de second niveau et l'analyse avancée. Un outil de test unifié permet aux équipes d'examiner le code sous un angle totalement nouveau. Un test unitaire ayant échoué revêt une signification différente pour un développeur, selon qu'il se produit dans du code classé à haut ou à faible risque par l'analyse des métriques de code. Si ces informations sont ensuite combinées aux statistiques du système de gestion de versions et corrélées aux exigences, les équipes peuvent prendre de meilleures décisions quant au moment et à la manière de corriger le code.

Un autre type d'analyse proposé par un outil de test unifié est l'analyse d'impact des tests, qui présente un fort potentiel pour améliorer la productivité des équipes. capacité d'analyse d'impact des tests Un outil de test unifié cherche à comprendre la relation entre le code source, les cas de test et les résultats de couverture de code afin de calculer l'ensemble optimal de cas de test pour la vérification et la validation des modifications de code. Ainsi, les équipes peuvent limiter leurs sessions de test en exécutant uniquement un petit sous-ensemble de tests au lieu de suites de régression complètes. Cette approche, qui consiste à tester uniquement ce qui est absolument nécessaire, se traduit par des économies substantielles pour les projets de moyenne et grande envergure.

Synthèse : Parasoft C/C++test avec une plateforme centralisée de reporting et d’analyse

Parasoft C/C++test est une solution de test unifiée et entièrement intégrée pour les projets de développement logiciel C/C++. Disponible sous forme d'extension pour les environnements de développement intégrés (IDE) les plus courants, tels qu'Eclipse, VS Code et Visual Studio, Parasoft C/C++test s'intègre parfaitement à l'IDE et permet d'éviter les problèmes mentionnés précédemment.

Les développeurs peuvent instantanément effectuer des vérifications de conformité aux normes de codage ou exécuter des tests unitaires dès la rédaction du code. Les membres de l'équipe QA peuvent réaliser des scénarios de tests manuels tandis que l'application est surveillée pour la couverture du code et les erreurs d'exécution. Des analyses hors ligne, telles que l'analyse de flux, peuvent être effectuées lors de la phase d'intégration continue. Les sessions serveur, dotées d'une interface en ligne de commande conviviale, transmettent les résultats d'analyse au tableau de bord centralisé de reporting et d'analyse, qui affiche les informations agrégées de l'environnement de développement.

Les fonctionnalités complètes de reporting de Parasoft, notamment l'intégration de données provenant d'outils tiers, l'envoi des résultats de tests aux environnements de développement intégrés (IDE) et le calcul d'analyses avancées, permettent aux utilisateurs d'identifier les actions à entreprendre au moment opportun. Le retour d'information continu fourni à chaque étape du flux de travail accélère le développement agile et réduit le coût de la mise en conformité avec les normes de sécurité.

L’approche en matière de processus et d’architecture d’assurance qualité présentée dans cet article ne se limite pas aux seuls projets C/C++. Parasoft propose des solutions similaires pour Java, C# et VB.NET.

Équipe de développeurs

Prêt à plonger plus profondément ?

Téléchargez le livre blanc complet