web-dev-qa-db-fra.com

Test unitaire pour le code C++ - Outils et méthodologie

Je travaille sur un grand système c ++ en développement depuis quelques années maintenant. Dans le cadre de nos efforts pour améliorer la qualité du code existant, nous nous sommes engagés dans un vaste projet de refactoring à long terme.

Connaissez-vous un bon outil pouvant m'aider à écrire des tests unitaires en C++? Peut-être quelque chose de similaire à Junit ou Nunit?

Quelqu'un peut-il donner de bons conseils sur la méthodologie d'écriture des tests unitaires pour les modules écrits sans test unitaire à l'esprit?

134
Sakin

L'application de tests unitaires au code hérité était la raison trèsTravailler efficacement avec le code hérité a été écrit. Michael Feathers est l'auteur - comme mentionné dans d'autres réponses, il a participé à la création de CppUnit et CppUnitLite .

alt text

78
Joe Schneider

Google a récemment publié sa propre bibliothèque pour les applications de tests unitaires C++, appelée Google Test.

Projet sur Google Code

38
agnul

Découvrez une excellente comparaison entre plusieurs suites disponibles. L'auteur de cet article a développé plus tard UnitTest ++ .

Ce que j'aime particulièrement à ce sujet (mis à part le fait qu'il gère bien les exceptions, etc.), c'est qu'il y a très peu d '"administration" autour de la définition des cas de test et des fixtures de test. 

30
andreas buykx

Boost a une Testing library qui contient un support pour les tests unitaires Il pourrait être intéressant de vérifier.

24
Jonas

Noel Llopis de Games From Within est l'auteur de Exploration de la jungle du framework de tests unitaires C++ , une évaluation complète (mais désormais obsolète) des différents frameworks de tests unitaires C++, ainsi qu'un livre sur la programmation de jeux .

Il a utilisé CppUnitLite pendant un bon bout de temps, corrigeant divers problèmes, mais s’est éventuellement associé à un autre auteur de bibliothèques de tests unitaires et a produit UnitTest ++ . Nous utilisons UnitTest ++ ici, et j'aime beaucoup, jusqu'à présent. Il a (pour moi) le juste équilibre de puissance avec un faible encombrement. 

J'ai utilisé des solutions maison, CxxTest (qui nécessite Perl) et boost :: test. Lorsque j’ai implémenté les tests unitaires ici dans mon travail actuel, c’est presque devenu UnitTest ++ vs boost :: test. 

J'aime vraiment la plupart des librairies boost que j'ai utilisées, mais à mon humble avis, boost :: test est un peu trop lourd. Je n’ai surtout pas aimé le fait que cela vous oblige (AFAIK) à mettre en œuvre le programme principal du test harnais à l’aide d’une macro boost :: test. Je sais que ce n'est pas un TDD "pur", mais nous avons parfois besoin d'un moyen d'exécuter des tests avec une application graphique, par exemple lorsqu'un indicateur de test spécial est passé sur la ligne de commande et que boost :: test ne peut pas prendre en charge ce type de scénario. 

UnitTest ++ était le cadre de test le plus simple à configurer et à utiliser que j'ai rencontré dans mon expérience (limitée). 

21
Brian Stewart

J'utilise l'excellente bibliothèque Boost.Test en conjonction avec une bibliothèque beaucoup moins connue mais tellement impressionnante Turtle : une bibliothèque d'objets fantaisie basée sur boost.

Comme un exemple de code parle mieux que des mots, imaginez que vous souhaitez tester un objet calculator qui fonctionne sur une interface view (exemple introductif de Turtle):

// declares a 'mock_view' class implementing 'view'
MOCK_BASE_CLASS( mock_view, view )
{
    // implements the 'display' method from 'view' (taking 1 argument)
    MOCK_METHOD( display, 1 )                   
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero )
{
    mock_view v;
    calculator c( v );

    // expects the 'display' method to be called once with a parameter value equal to 0
    MOCK_EXPECT( v, display ).once().with( 0 ); 

    c.add( 0, 0 );
}

Vous voyez comme il est facile et bavard de déclarer l'attente sur l'objet fictif? De toute évidence, le test échoue si les attentes ne sont pas satisfaites.

17
icecrime

Je viens de pousser mon propre framework, CATCH , là-bas. Il est encore en développement, mais je crois qu'il dépasse déjà la plupart des autres cadres. Plusieurs personnes ont des critères différents, mais j'ai essayé de couvrir la plupart des terrains sans trop de compromis. un dégustateur. Mes cinq principales fonctionnalités sont:

  • En-tête seulement
  • Enregistrement automatique des tests basés sur la fonction et la méthode
  • 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
  • Test de nom en langage naturel - les noms de fonction/méthode sont générés

Il a également des liaisons Objective-C.

14
philsquared

CxxTest est un framework JUnit/CppUnit/xUnit similaire à C++, léger, facile à utiliser.

9
David Sykes
7
Jorge Ferreira

UnitTest ++ , petit et simple.

7
yrp

Je suis actuellement à la recherche d'un cadre de test unitaire et de simulation pouvant être utilisé dans notre entreprise pour une base de code à vie longue. Comme vous le savez, la liste des frameworks de tests unitaires pour c ++ est longue, j'ai donc appliqué quelques filtres pour le réduire à une liste complète pouvant être examinée de plus près. Le premier critère de filtrage était que cela devait être gratuit. Le deuxième critère était l'activité du projet. J'ai aussi cherché des frameworks moqueurs, car vous en avez besoin si vous voulez écrire des tests unitaires.

Je suis arrivé avec la liste suivante (environ) triée par activité, la plus haute activité en haut:

  • GoogleTest/GoogleMock: Nombreux contributeurs et utilisés par Google lui-même. Ce sera probablement ici pendant un certain temps et recevoir des mises à jour. Pour ma base de code privée, je vais passer à cette combinaison dans l’espoir de prendre le train le plus rapide.

  • BoostTest + Turtle: Pas mis à jour si souvent, mais le framework de test fait partie de boost, il doit donc être maintenu. Turtle, d’autre part, est principalement entretenu par un type, mais il a une activité regrettée et n’est donc pas mort… j’ai fait presque toute mon expérience de test avec cette combinaison car nous avions déjà utilisé la bibliothèque boost dans mon travail précédent et utilisez-le pour mon code privé.

  • CppUTest: Fournit des tests et des moqueries. Ce projet a été actif de 2008 à 2015 et a pas mal d'activité récente. Cette découverte a été un peu surprenante, car beaucoup de projets moins actifs apparaissent souvent lors de recherches sur le Web (comme CppUnit, dont la dernière mise à jour a eu lieu en 2013). Je n'ai pas approfondi cette question et je ne peux donc rien en dire sur les détails .Edit (16.12.2015): J'ai récemment essayé ceci et découvert que ce cadre était un peu maladroit et "C- "stylé", surtout lors de l’utilisation des cours simulés. En outre, il semblait avoir une plus petite variété d'affirmations que d'autres cadres. Je pense que son principal atout est qu’il peut être utilisé avec des projets C purs.

  • QTest: La bibliothèque de tests fournie avec le framework Qt. La maintenance devrait être garantie pendant un certain temps, mais je l'utilise plutôt comme une bibliothèque de support, car l'enregistrement de test est plus maladroit à l'OMI que dans d'autres cadres. Autant que je sache, cela vous oblige à avoir un test exe par appareil de test. Mais les fonctions d’aide au test peuvent être très utiles lors du test du code Qt-Gui. Il ne se moque pas.

  • Catch: Il a une activité récente mais est principalement développé par un gars. La bonne chose à propos de ce cadre est l’approche alternative qui permet d’écrire du code d’appareil réutilisable dans le test lui-même. Il vous permet également de définir des noms de test en tant que chaînes, ce qui est pratique lorsque vous avez tendance à écrire des phrases entières en tant que noms de test. Je souhaite que ce style soit déchiré et mis dans googleTest ;-)

Mock Frameworks

Le nombre de frameworks factices est beaucoup plus petit que le nombre de frameworks de test, mais voici ceux que j'ai trouvés avoir une activité récente.

  • Hippomock: Actif à partir de 2008, mais de faible intensité.

  • FakeIt: Actif à partir de 2013 mais maintenant plus ou moins développé par un gars.

Conclusion

Si votre base de code est à long terme, choisissez entre BoostTest + Turtle et GoogleTest + GoogleMock. Je pense que ces deux auront un entretien à long terme. Si vous avez seulement une base de code de courte durée, vous pouvez essayer Catch qui a une syntaxe de Nice. Ensuite, vous devrez également choisir un cadre moqueur. Si vous travaillez avec Visual Studio, vous pouvez télécharger des adaptateurs d'exécution de test pour BoostTest et GoogleTest, qui vous permettront d'exécuter les tests avec l'interface graphique de testeur intégrée à VS.

5
Knitschi

Voir également les réponses à la question étroitement liée "choisir un outil/framework de test unitaire c ++", ici

3
TonJ

Il existe également TUT , Template-Unit-Test, un framework basé sur des modèles. Sa syntaxe est maladroite (certains l'appellent abusant des modèles), mais son principal avantage est que tout est contenu dans un fichier d'en-tête single

Vous trouverez un exemple de test unitaire écrit avec TUT ici. 

3
philant

CppUTest est un excellent framework léger pour les tests unitaires C et C++.

2
ratkok

J'ai essayé CPPunit et ce n'est pas très convivial.

La seule alternative que je connaisse consiste à utiliser C++. NET pour envelopper vos classes C++ et écrire des tests unitaires avec l'un des frameworks de tests unitaires .NET (NUnit, MBUnit, etc.)

2
Dror Helper

Si vous utilisez Visual Studio 2008 SP1, je vous recommande vivement d'utiliser MSTest pour écrire les tests unitaires. J'utilise ensuite Google mock pour écrire les mocks. L'intégration avec IDE est idéale et permet et ne supporte pas les frais généraux de CPPunit en termes d'édition de trois emplacements pour l'ajout d'un test.

1
Jared

Cfix ( http://www.cfix-testing.org ) est spécialisé dans le développement Windows C/C++ et prend en charge les tests en mode utilisateur et en mode noyau.

1
Johannes Passing

Michael Feathers de ObjectMentor a joué un rôle déterminant dans le développement de CppUnit et de CppUnitLite.

Il recommande maintenant CppUnitLite

1
Seb Rose

Je pense que VisualAssert fait un excellent travail en intégration VS. Il vous permet d'exécuter et de déboguer les tests à partir de VS et vous n'avez pas besoin de créer un exécutable pour pouvoir exécuter les tests.

1
Ohad Horesh

Regardez CUnitWin32 . Il est écrit pour MS Visual C. Il comprend un exemple.

1
Dushara

Découvrez le fructose: http://sourceforge.net/projects/fructose/

C'est un framework très simple, ne contenant que des fichiers d'en-tête et donc facile à transporter.

0
rik

J'utilise MS Test avec Typemock Isolator ++ . Essaie!

0
Sam