Découvrez GoogleTest certifié TÜV avec Agentic AI pour les tests C/C++ !
Plus de détails »
Livre blanc
Avant de vous lancer, consultez l'aperçu ci-dessous.
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 .
Lorsqu'on envisage d'éventuels dysfonctionnements logiciels de haut niveau, on peut distinguer plusieurs classes d'erreurs logicielles :
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.
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é.
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 :
Les tests unifiés permettent d'éviter un certain nombre de problèmes, notamment :
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.
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é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 :
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.
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 :
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.
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.
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.
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.
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.
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.
Prêt à plonger plus profondément ?