web-dev-qa-db-fra.com

Cadre de test unitaire C ++

J'utilise le cadre de test Boost pour mon code C++ mais il y a deux problèmes qui sont probablement communs à tous les cadres de test C++:

  • Il n'y a aucun moyen de créer des talons de test automatiques (en extrayant des fonctions publiques des classes sélectionnées par exemple).
  • Vous ne pouvez pas exécuter un seul test - vous devez exécuter l'ensemble de la "suite" de tests (sauf si vous créez de nombreux projets de test différents, je suppose).

Quelqu'un connaît-il un meilleur cadre de test ou suis-je toujours jaloux des outils de test disponibles pour les développeurs Java/.NET?

61
Rob

Je viens de répondre à une question très similaire . J'ai fini par utiliser UnitTest ++ de Noel Llopis. Je l'aimais plus que boost :: test car il n'insistait pas sur l'implémentation du programme principal du harnais de test avec une macro - il peut se connecter à n'importe quel exécutable que vous créez. Il souffre de la même charge de boost :: test en ce qu'il nécessite une bibliothèque pour être lié. J'ai utilisé CxxTest, et il se rapproche plus que tout autre chose en C++ - permet de générer automatiquement des tests (bien qu'il nécessite Perl faire partie de votre système de construction pour ce faire). C++ ne fournit tout simplement pas les crochets de réflexion que les langages .NET et Java font. Les outils MsTest de Visual Studio Team System - Developer's Edition généreront automatiquement des talons de test de C++ non managé, mais les méthodes doivent être exportés à partir d'un DLL pour ce faire, donc cela ne fonctionne pas avec les bibliothèques statiques. D'autres cadres de test dans le monde .NET peuvent également avoir cette capacité, mais je ne suis pas familier avec Donc, en ce moment, nous utilisons UnitTest ++ pour C++ non managé et je suis en train de choisir entre MsTest et NUnit pour les bibliothèques gérées.

20
Brian Stewart

Je viens de pousser mon propre framework, CATCH , là-bas. Il est encore en cours de développement, mais je pense qu'il dépasse déjà la plupart des autres cadres. Différentes personnes ont des critères différents, mais j'ai essayé de couvrir la plupart des terrains sans trop de compromis. Jetez un oeil à mon entrée de blog liée pour un avant-goût. Mes cinq principales fonctionnalités sont:

  • En-tête uniquement
  • Enregistrement automatique des tests basés sur les fonctions et les méthodes
  • Décompose les expressions C++ standard en LHS et RHS (vous n'avez donc pas besoin de toute une famille de macros d'assertion).
  • Prise en charge des sections imbriquées dans un appareil basé sur une fonction
  • Tests de nom en langage naturel - des noms de fonction/méthode sont générés

Il ne fait pas la génération de stubs - mais c'est un domaine assez spécialisé. Je pense que Isolator ++ est le premier outil pour vraiment retirer cela. Notez que les frameworks Mocking/stubbing sont généralement indépendants des frameworks de tests unitaires. CATCH fonctionne particulièrement bien avec les objets fictifs car l'état de test n'est pas transmis par le contexte.

Il dispose également de liaisons Objective-C.

[mise à jour]

Je viens de revenir sur ma réponse d'il y a quelques années. Merci pour tous les super commentaires! De toute évidence, Catch a beaucoup évolué pendant cette période. Il prend désormais en charge les tests de style BDD (donnés/quand/alors), les balises, désormais dans un en-tête unique , et de nombreuses améliorations et raffinements internes ( (ligne de commande plus riche, sortie claire et expressive, etc.). n article de blog plus à jour est ici.

66
philsquared

Jetez un œil au framework de test Google C++.

Il est utilisé par Google pour tous leurs projets C++ internes, il doit donc être assez bon.

http://googletesting.blogspot.com/2008/07/announcing-new-google-c-testing.html

http://code.google.com/p/googletest

23
J Miller

Boost.Test permet d'exécuter le cas de test par nom. Ou suite de tests. Ou plusieurs d'entre eux.

Boost.Test n'insiste PAS sur l'implémentation de main, mais il est facile de le faire.

Boost.Test n'est PAS nécessaire pour l'utiliser comme bibliothèque. Il a une seule variante d'en-tête.

22
user49248

Je suis un grand fan de nitTest ++ , il est très léger, mais fait le travail. Vous pouvez y exécuter facilement des tests uniques.

8
yrp

Grande question! Il y a quelques années, j'ai cherché pour toujours quelque chose qui valait la peine d'être utilisé et j'ai échoué. Je cherchais quelque chose qui était très léger et qui ne m'obligeait pas à lier dans certaines bibliothèques ... vous savez quelque chose que je pourrais mettre en place et exécuter en quelques minutes.

Cependant, j'ai persisté et j'ai fini par courir sur cxxtest .

Depuis le site Web:

  • Ne nécessite pas de RTTI
  • Ne nécessite pas de fonctions de modèle de membre
  • Ne nécessite pas de gestion des exceptions
  • Ne nécessite aucune bibliothèque externe (y compris la gestion de la mémoire, les E/S de fichier/console, les bibliothèques graphiques)
  • Est distribué entièrement comme un ensemble de fichiers d'en-tête (et un script python)).

Wow ... super simple! Incluez un fichier d'en-tête, dérivez de la classe Test et vous êtes en marche. Nous utilisons cela depuis quatre ans et je n'ai toujours pas trouvé quoi que ce soit qui me plaise davantage.

6
Scott Saad

Essayez WinUnit . Cela semble excellent et est recommandé par John Robbins .

4
Steve Duitsman

J'aime le cadre de test unitaire Boost, principalement parce qu'il est très léger.

  • Je n'ai jamais entendu parler d'un framework de test unitaire qui générerait des stubs. Je ne suis généralement pas convaincu par la génération de code, ne serait-ce que parce qu'elle devient obsolète très rapidement. Peut-être que cela devient utile lorsque vous avez un grand nombre de classes?

  • Un partisan du développement piloté par les tests dirait probablement qu'il est fondamental que vous exécutiez toute la suite de tests à chaque fois, afin de vous assurer que vous n'avez pas introduit de régression. Si l'exécution de tous les tests prend trop de temps, peut-être que vos tests sont trop importants ou que vous appelez trop de fonctions gourmandes en CPU qui devraient être simulées? Si cela reste un problème, une enveloppe mince autour des tests unitaires de boost devrait vous permettre de choisir vos tests, et serait probablement plus rapide que d'apprendre un autre framework et de porter tous vos tests.

3
small_duck

Aeryn est un autre framework qui mérite d'être étudié

2
David Sykes
2
Ray Tayek

Visual Studio a un framework de tests unitaires intégré, c'est un excellent lien pour configurer un projet de test pour l'application console win32:

http://codeketchup.blogspot.ie/2012/12/unit-test-for-unmanaged-c-in-visual.html

Si vous travaillez sur un projet DLL statique, il est beaucoup plus facile à configurer car d'autres ont souligné que les cadres de test externes comme GTest et Boost ont des fonctionnalités supplémentaires.

2
dvn

J'utilise tut-framework

2
gtjthm

CppUnit était l'hommage original à JUnit.

1
duffymo

Eclipse/JUnit est un package solide pour Java, et il existe des extensions/équivalents C++ pour les deux. Il peut faire ce dont vous parlez. Bien sûr, vous devez changer d'IDE ...

0
Aaron

J'imagine que la suppression automatique des fonctions de test serait davantage une fonction (de scripts pour le framework ou) l'environnement de développement en question. Les applications C++ Builder de CodeGear généreraient rapidement du code de test pour les fonctions utilisateur.

0
Kris Kumler

Je suis moi aussi fan de UnitTest ++.

Le hic, c'est que la distribution source contient près de 40 fichiers séparés. Ceci est absurde. La gestion du contrôle des sources et des tâches de génération pour un projet simple est dominée par la gestion de tous ces fichiers de tests unitaires.

J'ai modifié UnitTest ++ afin qu'il puisse être intégré à un projet en ajoutant un fichier .h et .cpp. C'est ce que j'ai surnommé "le plus mignon". Les détails sont à http://ravenspoint.com/blog/index.php?entry=entry080704-063557

Il ne génère pas automatiquement de talons de test, comme demandé dans la question d'origine. Je ne peux pas m'empêcher de penser qu'une telle fonctionnalité serait plus problématique qu'elle n'en vaut la peine, générant de grandes quantités de fonctions d'accesseur de "test" de code inutiles.

0
ravenspoint

J'essaie Igloo , également une suite de tests C++ d'en-tête uniquement, même ses deux dépendances incluses ne sont que des en-têtes.

Donc, c'est assez simple et simple. Outre l'exemple inclus sur github, il y a des exemples et plus de détails sur le site principal, igloo-testing.org . Je le mettrai à jour plus tard à mesure que j'aurai plus d'expérience avec lui et d'autres cadres.

0
leetNightshade

La bibliothèque Fructose d'Andrew Marlow vaut le détour ... http://fructose.sourceforge.net/

Je me souviens de ses documents contenant une analyse et une comparaison assez détaillées d'autres offres au moment où il a écrit Fructose, mais je ne trouve pas d'URL directement vers ce document.

0
Tony Delroy