Webinaire en vedette : MISRA C++ 2023 : tout ce que vous devez savoir | Voir le séminaire

Utilisation du test Parasoft C / C ++ avec CMake pour les tests unitaires

Portrait de Miroslaw Zielinski, directeur de la gestion des produits chez Parasoft
5 mai 2020
6 min lire

Vous êtes-vous déjà demandé comment utiliser Parasoft C/C++test avec CMake pour les tests unitaires ? Consultez cet article pour savoir comment.

La version de C/C++test 2020.1 introduit la possibilité de intégrer le test C / C ++ avec CMake pour l'analyse statique et les tests unitaires. Cet article se concentre sur l'utilisation du test Parasoft C / C ++ avec des projets basés sur CMake pour les tests unitaires.

Les tests unitaires sont plus compliqués à intégrer dans le processus de développement que l'analyse statique. Au final, le fichier binaire exécutable doit être créé. Cela est particulièrement problématique pour les projets volumineux et complexes composés de plusieurs bibliothèques et exécutables.

Le fichier JSON compile-info, que nous utilisons pour l'analyse statique, ne suffit pas. Il ne fournit pas les informations importantes sur la structure du projet - quels fichiers sont inclus dans quels binaires et ce qui doit être testé ensemble.

Intégration des tests unitaires dans les projets basés sur CMake

Pour permettre une intégration facile des tests unitaires de test Parasoft C / C ++ dans les projets basés sur CMake, la version 2020.1 introduit une extension CMake, qui permet de définir des cibles de test unitaire pour le test C / C ++. Ces cibles génèrent automatiquement les fichiers de projet de test C / C ++ qui peuvent être utilisés pour créer, exécuter et gérer des tests unitaires.

L'intention de cette extension est de permettre aux utilisateurs de définir toute l'infrastructure requise pour les tests unitaires de test Parasoft C / C ++ avec leurs cibles habituelles dans les fichiers de configuration CMake.

Un exemple de test unitaire sur des projets basés sur CMake

Voyons comment cela fonctionne en utilisant un exemple de test unitaire à l'aide de l'outil C/C++test Professional – basé sur Eclipse, qui dispose d'une interface utilisateur riche. Téléchargez et installez la version 2020.1, si vous ne l'avez pas déjà fait.

Suivez ces étapes

Dans le répertoire d'installation principal de C / C ++ test Professional, vous pouvez trouver l'extension CMake avec l'exemple qui l'accompagne. Voir le répertoire suivant: intégration / cmake.

Pour nos expériences, je recommande de copier le dossier d'intégration / cmake de l'installation vers votre emplacement préféré. La structure de l'exemple est illustrée ci-dessous:

Le dossier de l'application contient la cible «exécutable». Le dossier modules avec ses trois sous-dossiers (mod1, mod2 et mod3) représente les bibliothèques statiques utilisées pour se lier à l'exécutable. En outre, le dossier cmake contient l'extension de test C / C ++ à CMake. Vous souhaiterez peut-être copier ce dossier dans votre projet réel afin d'utiliser cette extension.

Cette structure simplifiée dresse une image des défis typiques auxquels les équipes tentent de mettre en œuvre les tests unitaires: Comment diviser l'ensemble du projet en blocs testables, représentant des groupes de fichiers qui appartiennent logiquement ensemble.

Dans la plupart des cas, les développeurs ne voudront pas exécuter de tests unitaires sur un binaire blob créé par la compilation de tous les fichiers d'un projet entier. Les utilisateurs seront probablement intéressés par l'ajout des cas de test pour les mêmes cibles binaires (exécutables et bibliothèques) qu'ils ont définies dans le projet.

Comment ajouter des cas de test pour les mêmes cibles binaires définies dans le projet

Avant de discuter des détails de la syntaxe de configuration, voyons comment cela fonctionne à l'aide de l'exemple fourni.

1. Dans le répertoire de niveau supérieur où se trouve le dossier de l'application, créez un répertoire de construction, cd dedans et appelez une génération de scripts de construction, comme ci-dessous:

2. Une fois que CMake a terminé la génération des scripts de construction (makefiles), appelez make pour générer l'exemple de projet:

3. Démarrez C / C ++ test professional (l'exécutable cpptest dans le dossier d'installation). Sélectionnez un espace de travail vide, utilisez «Menu Fichier -> Importer… -> Projets existants dans l'espace de travail» et sélectionnez «répertoire racine» pour être le dossier principal dans lequel vous avez copié l'exemple. L'assistant analysera de manière récursive le dossier sélectionné et trouvera tous les projets générés automatiquement. Si vous voyez quelque chose comme ci-dessous, vous pouvez cliquer sur «Terminer».

Eclipse importera tous les projets et vous disposerez d'un nouvel espace de travail prêt pour vos tests unitaires. Vous n'avez rien d'autre à faire pour commencer à ajouter et exécuter les cas de test et à améliorer la couverture de votre code.

4. Dans le navigateur de projet, sélectionnez les trois projets, cliquez avec le bouton droit de la souris et utilisez la configuration de test «Parasoft -> Test utilisant -> Builtin -> Unit Testing -> Generate Unit Tests» pour générer automatiquement les cas de test. Une fois les tests générés, exécutez la configuration «Exécuter les tests unitaires» à partir du même emplacement.

Avec ces quatre étapes simples, vous avez préparé l'infrastructure du projet pour les tests unitaires. L'équipe est maintenant prête à commencer à analyser les cas de test.

Comment ça marche?

En plus des cibles de construction régulières, les fichiers CMakeLists.txt contiennent des cibles de test unitaire. Lors de la génération des scripts de construction avec cmake, les fichiers de projet de test C / C ++ sont également générés automatiquement. Plus tard, au cours du processus de construction, des fichiers de données de construction supplémentaires, requis par les projets de test C / C ++, sont automatiquement générés.

Tout ce qui est nécessaire pour définir la structure des projets de test unitaire est conservé dans les fichiers CMakeLists.txt. L'équipe n'a pas besoin de conserver de fichiers de configuration supplémentaires. Tout est beau et propre. Le projet peut être extrait, des scripts de construction et des projets de test C / C ++ peuvent être générés, des tests peuvent être ajoutés et archivés avec le code source, et des tests complets peuvent être effectués dans le CI.

Regarder de plus près

Examinons de plus près l'extension CMake de test C / C ++ et comment elle aide à définir l'infrastructure des projets de test. Ouvrez le fichier modules / mod1 / CMakeLists.txt. Vous devriez voir quelque chose comme ci-dessous:

Dans les six premières lignes, vous pouvez voir la définition de cible normale. Ici, nous définissons une cible de bibliothèque simple, avec un fichier source mod1.cpp, et un répertoire de fichiers d'inclusion. C'est ce que vous verrez généralement dans vos projets CMake.

Dans la ligne 11, cependant, nous avons une nouvelle fonction CMake qui est fournie avec l'extension de test C / C ++. Cette fonction vous permet de définir la cible de test unitaire, qui génère tous les fichiers de projet de test C / C ++ requis. Vous pouvez trouver la description complète de cette fonction dans les intégrations / cmake / README.md. Dans cet exemple spécifique, les opérations suivantes sont effectuées:

  • Ligne 11: Le nom de la cible est défini. Par défaut, il sera utilisé comme nom du projet eclipse
  • Ligne 12: La configuration du compilateur est spécifiée pour que le test C / C ++ puisse analyser et instrumenter le code.
  • Ligne 13: Les fichiers sources, qui doivent être inclus dans la cible de test unitaire, sont ajoutés
  • Ligne 14: L'emplacement des fichiers d'inclusion spécifiques à la cible est ajouté à la cible de test unitaire. C'est la même chose que vous faites pour vos objectifs habituels.

Cette simple définition de cible suffit à générer un projet de test unitaire pour le test Parasoft C / C ++. Les fichiers de projet seront générés à l'emplacement du fichier CMakeLists.txt, ce qui est probablement le plus pratique. Si vous préférez, vous pouvez générer les fichiers de projet en dehors de l'arborescence source et éviter tout problème de fusion. Ceci est montré dans app / CMakeLists.txt:

  • Ligne 11: Le nom de la cible est défini. Par défaut, il sera utilisé comme nom de projet eclipse.
  • Lignes 12, 13: L'emplacement du projet de test C / C ++ est spécifié. Ici, nous créons le projet en dehors de l'arborescence des sources.
  • Lignes 14, 15: Un dossier lié à une éclipse est créé. Vous devez spécifier le nom du dossier et l'emplacement qui sera lié.
  • Ligne 16, 17: Les fichiers sources, qui doivent être inclus dans la cible de test unitaire, sont ajoutés
  • Ligne 19: Trois bibliothèques sont ajoutées pour la cible de test unitaire. Le test C / C ++ utilisera ces bibliothèques lors de la construction de l'exécutable de test.

Pour plus de détails, consultez les fichiers suivants du / integrations / répertoire cmake:

  • LISEZMOI.mc
  • app / CMakeLists.txt
  • modules / mod1 / CMakeLists.txt
  • tests / cpptest_modules / CMakeLists.txt

Résumé

Voici les points importants concernant l'extension.

  • L'extension CMake se trouve dans l'installation C / C ++ test Professional dans le répertoire suivant: / intégrations / cmake / cmake. Vous devrez peut-être le copier dans la structure de votre projet.
  • Pour activer CMake avec la fonction d'extension liée au test C / C ++, vous devrez inclure l'extension dans votre structure de fichier CMakeLists.txt à l'aide d'une commande comme ci-dessous:
    • Inclure (cmake / cpptest.cmake)
    • Voir l'exemple dans integration / cmake / CMakeLists.txt.
  • Vous pouvez définir vos cibles de test unitaire (quels effets dans les projets de test C / C ++) comme vous le souhaitez. Vous pouvez ajouter un projet de test unitaire pour vos exécutables, bibliothèques, combinaison de bibliothèques ou toute collection arbitraire de fichiers.
  • Vous devez vous assurer que tous les fichiers d'en-tête et toutes les bibliothèques requis sont inclus dans votre définition cible. Les règles régulières de CMake s'appliquent ici. Si inclus, la bibliothèque ou l'option a été définie au niveau global. Il sera ensuite inclus dans votre cible de test unitaire. Si vous avez des paramètres spécifiques à la cible, vous devrez les ajouter.
  • Si vous ajoutez la cible de test unitaire pour la cible binaire existante (comme une bibliothèque ou un exécutable), la procédure recommandée consiste à répliquer tous les paramètres définis pour la cible d'origine. Remarque : Vous pouvez ajouter des cibles entières à la fonction cpptest_add_executable, qui copiera tous les fichiers source dans la nouvelle cible.
  • Si cela ne vous dérange pas de créer des fichiers de projet de test C / C ++ dans vos répertoires de fichiers source, il s'agit de la configuration la plus simple et recommandée. Si vous souhaitez que les fichiers de projet soient placés quelque part en dehors de votre arborescence source, vous pouvez le faire facilement.
  • Vous n'avez pas besoin d'archiver les fichiers de projet de test C / C ++ générés (.project et .parasoft). Ils seront recréés pour chaque nouvelle construction. Cependant, vous devez vérifier tous les scénarios de test et stubs.
Apprenez à utiliser Parasoft C/C++test avec des projets basés sur CMake pour les tests unitaires.