Découvrez comment la solution Parasoft Continuous Quality permet de contrôler et de gérer les environnements de test pour fournir des logiciels de haute qualité en toute confiance. Inscrivez-vous pour la démo >>

BLOG

Rationalisez les tests de logiciels intégrés avec un flux de travail CI / CD

Rationalisez les tests de logiciels intégrés avec un flux de travail CI / CD Temps de lecture : 7 minutes

La mise en œuvre d'un flux de travail d'intégration continue et de livraison continue (CI / CD) pour le développement de logiciels embarqués devient de plus en plus populaire. Les projets de logiciels embarqués sont souvent limités d'une manière que le développement d'applications ne l'est pas. Outre les contraintes physiques et informatiques de la plate-forme matérielle cible, il existe des contraintes sur le marché.

Le marché de l'embarqué a tendance à avoir des exigences uniques en matière de sûreté, de sécurité et de confidentialité ainsi que des cycles de vie extrêmement longs. Les produits peuvent rester sur le marché pendant des décennies.

Les défis des tests de logiciels embarqués

L'automatisation des tests pour les logiciels embarqués est un défi en raison de la nécessité et de la complexité de lancer et d'observer des tests sur des cibles embarquées. En outre, les équipes logicielles ont généralement un accès limité au matériel cible.

L'automatisation des tests logiciels est essentielle pour rendre les tests intégrés réalisables en continu du système de développement hôte au système cible. Le test des logiciels embarqués est particulièrement chronophage. L'automatisation de la suite de tests de régression permet de réaliser d'importantes économies de temps et d'argent.

Éléments essentiels pour tester les logiciels embarqués

Les résultats des tests et la collecte des données de couverture de code à partir du système cible sont essentiels pour la validation et la conformité aux normes, le cas échéant. Et la collecte de données est essentielle dans l'exécution des tests. Cela peut être accompli en enregistrant et en maintenant la traçabilité entre les cas de test, les résultats des tests, le code source et les exigences.

Les solutions de test intégrées, comme le test Parasoft C / C ++, offrent un harnais de test optimisé pour prendre un minimum de frais supplémentaires pour l'empreinte binaire et le fournir sous forme de code source, où il peut être personnalisé si des modifications spécifiques à la plate-forme sont nécessaires.

L'infographie montrant l'hôte (à gauche) est un test C / C ++ en tant qu'agent d'écoute. Le matériel cible (à droite) est la bibliothèque d'exécution en tant que module de communication pointant vers le canal de communication vers l'agent d'écoute, puis se déploie vers l'exécutable de test (en haut à droite sous Matériel cible).

Automatisez les tests de logiciels intégrés

Il existe des solutions qui fournissent des intégrations dédiées avec des IDE et des débogueurs intégrés pour rendre le processus d'exécution des cas de test fluide et automatisé. La solution de test de Parasoft pour le développement de logiciels c / c ++ prend en charge la création de lignes de base de test de régression sous la forme d'une collection organisée de tests et vérifie automatiquement tous les résultats. Ces tests s'exécutent automatiquement et régulièrement pour vérifier si les modifications de code changent ou interrompent la fonctionnalité capturée dans les tests de régression.

Si des modifications sont apportées, ces cas de test ne parviendront pas à alerter l'équipe du problème. Lors des tests ultérieurs, Test Parasoft C ++ signalera les tâches s'il détecte des changements dans le comportement capturé lors du test initial.

La parité des capacités d'exécution cible à distance avec les tests basés sur l'hôte signifie que les équipes de logiciels embarqués peuvent bénéficier des mêmes avantages de l'automatisation que tout autre type de développement d'applications.

L'automatisation est importante, mais elle doit faire plus que maintenir le statu quo. Pour améliorer la sécurité, la sûreté et la qualité des logiciels, des tests supplémentaires sont nécessaires dans le pipeline CI / CD sans ralentir davantage les progrès.

Améliorer l'automatisation des tests pour optimiser CI / CD pour les logiciels embarqués

La plus grande difficulté à laquelle sont confrontées les équipes est de savoir comment améliorer l'efficacité des tests tout en répondant aux besoins de sûreté, de sécurité et de qualité sans affecter les horaires et les coûts. Inévitablement, même avec une simple automatisation des tests (exécution et résultats des tests), des compromis sont nécessaires pour que le temps de test reste raisonnable.

La solution simple consiste à sélectionner, avec des conjectures, quelles parties du logiciel à tester en tant que suites de tests système complètes prennent trop de temps et coûtent trop cher. Les équipes de logiciels embarqués doivent augmenter leurs tests tout en concentrant les tests sur exactement ce qui est nécessaire. L'optimisation des tests à l'aide d'une automatisation plus intelligente des tests simplifie la création et l'exécution des tests.

Optimiser les tests avec la couverture de code

En général, la couverture du code mesure la quantité de code de production exécutée pendant l'exécution de vos tests automatisés. En exécutant une suite de tests et en examinant les données de couverture de code, on a une idée générale de la quantité de l'application testée.

Il existe plusieurs types de couverture de code. Pour les systèmes embarqués, vous devez être familiarisé avec les instructions, les branches et les MC / DC. Pour les exigences les plus strictes, telles que les logiciels critiques pour la sécurité, la vérification du code objet ou la couverture du code en langage assembleur peuvent être nécessaires.

Collecter et analyser les métriques de couverture du code

La collecte et l'analyse des métriques de couverture de code est un aspect important du développement de logiciels embarqués critiques pour la sécurité. La couverture de code mesure l'achèvement des cas de test et des tests exécutés. Il fournit la preuve que la validation est complète, au moins comme spécifié par la conception du logiciel.

Cela démontre également l'absence de comportement involontaire - le code qui n'est couvert par aucun test est une responsabilité puisque son comportement et ses fonctionnalités sont inconnus. La quantité et l'étendue de la couverture du code dépendent du niveau d'intégrité de la sécurité. Comme prévu, plus le niveau d'intégrité est élevé, plus la rigueur utilisée est élevée et, inévitablement, le nombre et la complexité des cas de test.

Voici des exemples de types de couverture de code recommandés.

  • Couverture du relevé exige que chaque instruction de programme soit exécutée au moins une fois (la couverture des succursales et des MC / DC englobe la couverture des instructions).
  • Couverture des succursales garantit que chaque branche de décision possible (constructions if-then-else) est exécutée.
  • Couverture de condition / décision modifiée (MC / DC) nécessite la couverture de code la plus complète pour garantir que les cas de test exécutent chaque branche de décision et toutes les combinaisons possibles d'entrées qui affectent le résultat de la logique de décision. Pour la logique complexe, le nombre de cas de test peut exploser. Les restrictions de condition modifiées sont donc utilisées pour limiter les cas de test à ceux qui entraînent la modification d'expressions logiques autonomes. Regarde ça tutoriel de la NASA.

Les outils avancés d'automatisation des tests unitaires, comme le test Parasoft C / ++, fournissent toutes ces métriques de couverture de code et plus encore. Le test C / C ++ automatise cette collecte de données sur les tests de l'hôte et de la cible et accumule l'historique de la couverture des tests au fil du temps. Cet historique de couverture de code peut couvrir les tests unitaires, d'intégration et de système pour garantir que la couverture est complète et traçable à tous les niveaux de test.

Augmentez la couverture du code grâce à la création automatisée de cas de test unitaires

La création de tests unitaires productifs a toujours été un défi. La conformité aux normes de sécurité fonctionnelle exige des logiciels de haute qualité, ce qui entraîne le besoin de suites de tests qui affectent et produisent des statistiques de couverture de code élevée.

Les équipes ont besoin de cas de test unitaires qui les aident à atteindre leurs objectifs de couverture, qui sont importants même en dehors du domaine des logiciels critiques pour la sécurité. Tout code non couvert par au moins un test est expédié non testé!

L'augmentation de la couverture du code peut être difficile. Analyser les branches du code et essayer de trouver les raisons pour lesquelles certaines sections de code ne sont pas couvertes continue de voler des cycles aux équipes de développement.

Comment obtenir une couverture à 100% du code structurel des systèmes critiques pour la sécurité

Résoudre les écarts de couverture

Les équipes peuvent résoudre les lacunes de couverture dans les suites de tests à l'aide d'un conseiller en couverture. Parasoft a découvert comment utiliser l'analyse de code statique avancée (analyse de flux de données et de contrôle) pour trouver des valeurs pour les paramètres d'entrée requis pour exécuter des lignes spécifiques de code non couvert.

Cette analyse calcule les conditions préalables pour les paramètres de fonction, les variables globales et les appels de fonction externes nécessaires pour exécuter une ligne de code spécifique. Le conseiller en couverture présente une collection de solutions pour les lignes de code sélectionnées par l'utilisateur. Les valeurs présentées sont utilisées pour créer de nouveaux cas de test unitaires. Cette fonctionnalité augmente la productivité des développeurs travaillant sur des cas de test unitaires pour améliorer la couverture du code.

Capture d'écran du test Parasoft C / C ++ montrant l'onglet Coverage Advisor avec les dépendances requises, les conditions préalables, la couverture attendue.

Chaque solution de couverture comprend:

  • Dépendances requises. Dépendances qui doivent être personnalisées pour couvrir la ligne sélectionnée. Ceux-ci peuvent inclure des paramètres de fonction, des appels de fonction externes, des variables globales, des variables locales et des membres de classe.
  • Conditions préalables. Conditions qui doivent être satisfaites par les dépendances requises pour couvrir la ligne sélectionnée. Cliquez sur une condition préalable pour accéder à la ligne de code associée.
  • Couverture attendue. Lignes de code qui seront couvertes si toutes les conditions préalables sont satisfaites.

Optimiser les tests avec une exécution intelligente des tests

Pour accélérer les tests dans un pipeline continu, une exécution intelligente des tests sur une base par build est nécessaire pour réduire l'ensemble de tests requis pour être exécutés pour faire face au risque que chaque nouvelle itération a introduit. Les analyses fournies par l'analyse d'impact des tests sont essentielles pour que les tests se concentrent uniquement sur ce qui doit absolument être testé plutôt que sur l'approche du fusil de chasse utilisée autrement.

Seule une prise de décision intelligente peut permettre des tests continus. Centrer l'équipe de développement sur l'ensemble minimum de tests pour garantir une couverture adéquate à chaque itération est la clé pour ramener l'agilité aux méthodes de développement Agile.

Remettez l'agilité dans le développement agile avec des tests basés sur le changement

L'exécution intelligente des tests dans le test Parasoft C / C ++ est étendue avec des plugins pour les systèmes CI (Jenkins, TeamCity, Bamboo, etc.) pour des fonctionnalités avancées permettant aux organisations de développement de logiciels de réduire les goulots d'étranglement associés à l'exécution de builds continus. Les mêmes capacités sont disponibles dans les environnements IDE avec des plugins dédiés qui accèdent à une image de couverture centralisée via une API REST et déterminent les tests qui doivent être exécutés localement dans l'EDI pour vérifier tout le code modifié.

Du côté du développement, les développeurs expérimentés peuvent appliquer la structure appropriée pour organiser leurs tests et n'en exécuter qu'un sous-ensemble manuellement, mais ils peuvent toujours ne pas savoir quels tests doivent être exécutés pour vérifier TOUTES les modifications.

Les équipes utilisant CI peuvent s'appuyer sur des builds nocturnes pour exécuter tous les tests automatiquement pendant la nuit et obtenir des commentaires le lendemain, mais uniquement s'il est possible d'exécuter le nombre total de tests en moins de 12 heures.

Malheureusement, la plupart des équipes de développement de logiciels exécutent leurs opérations quotidiennes en acceptant ces pratiques de test non évolutives. La situation devient encore plus difficile lorsqu'il s'agit de tests manuels. Les organisations de développement de logiciels traditionnelles suivent toujours des pratiques de test représentées par une pyramide inversée, qui met l'accent sur l'exécution de tests manuels plutôt que de tests automatisés pour une raison ou une autre.

Capture d'écran du test Parasoft C / C ++ montrant les tests impactés par le changement de camembert - montrant quatre parties inégales dans le camembert: réussite, échec, incomplet, retester.

L'exécution de test intelligente utilise l'analyse d'impact des tests pour suivre l'exécution des tests manuels par rapport aux applications et aux informations de couverture de code capturées associées à ces tests. Une technologie similaire est utilisée pour les tests automatisés. Cette analyse détermine quels tests manuels doivent être exécutés pour accéder aux fonctionnalités modifiées fournies avec chaque nouvelle version. Ainsi, l'exécution de tests intelligents est essentielle au niveau des développeurs et des testeurs dans leurs IDE locaux. Cela leur permet de concentrer les tests là où c'est nécessaire, en supprimant les conjectures et le travail supplémentaire «au cas où».

Capture d'écran du test Parasoft C / C ++ montrant les fichiers de changement impacté - quatre colonnes indiquant Réussite, Échec, Incomplet, Retest.

Résumé

L'intégration continue et la livraison continue sont monnaie courante dans le développement embarqué. La migration d'un processus en cascade vers le développement CI / CD et Agile est rentable en termes de réduction des risques et d'amélioration de la qualité et de la sécurité. Cependant, les tests restent un obstacle à l'adoption du flux de travail CI / CD pour les systèmes embarqués en raison des défis uniques liés à l'automatisation des tests pour eux. L'élimination de ces obstacles grâce à une exécution intelligente des tests et à l'optimisation des tests tout en améliorant la couverture du code est la clé d'une adoption réussie des CI / CD.

Texte blanc sur fond bleu marine: Intégration continue et livraison continue pour les systèmes embarqués avec le bouton rouge ci-dessous indiquant Télécharger le livre blanc.

Écrit par

Ricardo Camacho

Responsable principal du marketing produit technique pour les solutions de test embarquées de Parasoft, Ricardo possède une expertise dans le SDLC et l'automatisation des tests des applications embarquées en temps réel, critiques de sécurité et de sécurité, ainsi que la conformité des logiciels aux normes de l'industrie.

Recevez les dernières nouvelles et ressources sur les tests de logiciels dans votre boîte de réception.