web-dev-qa-db-fra.com

Comment implémentez-vous les tests unitaires dans les projets C ++ à grande échelle?

Je crois fermement à l'utilisation de tests unitaires dans le cadre de la création de grandes applications multi-plateformes. Nous prévoyons actuellement d'avoir nos tests unitaires dans un projet distinct. Cela a l'avantage de garder notre base de code propre. Je pense cependant que cela séparerait le code de test de la mise en œuvre de l'unité. Que pensez-vous de cette approche et existe-t-il des outils comme JUnit pour les applications c ++?

41
Charles Beattie

Il existe de nombreuses fourches Frame Unit de test pour C++. CppUnit n'est certainement pas celui que je choisirais (au moins dans sa version stable 1.x, car il manque de nombreux tests et nécessite beaucoup de lignes de codes redondantes). Jusqu'à présent, mon framework préféré est CxxTest , et je prévois d'évaluer Fructose un jour.

Quoi qu'il en soit, il existe quelques "articles" qui évaluent les cadres C++ TU:

22
Luc Hermitte

C'est une approche raisonnable.

J'ai eu de très bons résultats avec nitTest ++ et Boost.Test

J'ai regardé CppUnit, mais pour moi, cela ressemblait plus à une traduction de JUnit qu'à quelque chose visant C++.

Mise à jour: Ces jours-ci, je préfère utiliser Catch . Je l'ai trouvé efficace et simple à utiliser.

11
Ferruccio

Vous devez séparer votre code de base dans une bibliothèque partagée (dynamique), puis écrire la majeure partie de vos tests unitaires pour cette bibliothèque.

Il y a deux ans (2008), j'ai été impliqué dans un grand projet d'infrastructure LSB déployé par The Linux Foundation. L'un des objectifs de ce projet était d'écrire des tests unitaires pour 40 000 fonctions des bibliothèques de base Linux. Dans le cadre de ce projet, nous avons créé technologie AZOV et l'outil de base nommé API Sanity Autotest afin de générer automatiquement tous les tests. Vous pouvez essayer d'utiliser cet outil pour générer des tests unitaires pour votre ou vos bibliothèques de base.

3
linuxbuild

J'utilise UnitTest ++. Les tests sont dans un projet distinct mais les tests réels sont entrelacés avec le code réel. Ils existent dans un dossier sous la section testée. c'est à dire:
MyProject\src\<- source de l'application réelle
MyProject\src\tests <- la source des tests
Si vous avez des dossiers imbriqués (et qui n'en ont pas), ils auront également leur propre sous-répertoire\tests.

2
graham.reeds

Cppunit est un équivalent direct de Junit pour les applications C++ http://cppunit.sourceforge.net/cppunit-wiki

Personnellement, j'ai créé les tests unitaires dans un projet différent et créé une configuration de build distincte qui a construit tous les tests unitaires et le code source dépendant. Dans certains cas, je voulais tester les fonctions de membre privé d'une classe, j'ai donc fait de la classe Test une classe amie de l'objet à tester, mais j'ai caché les déclarations d'amis lors de la création de configurations "non testées" via des déclarations de préprocesseur.

J'ai fini par faire de la gymnastique de codage alors que j'intégrais des tests dans le code hérité. Si vous commencez dans le but de tester les unités, une meilleure conception peut être simple.

1
NotJarvis

Vous pouvez créer un projet de test unitaire pour chaque bibliothèque de votre arborescence source dans un sous-répertoire de cette bibliothèque. Vous vous retrouvez avec une application de pilote de test pour chaque bibliothèque, ce qui facilite l'exécution d'une seule suite de tests. En les mettant dans un sous-répertoire, il garde votre base de code propre, mais garde également les tests proches du code.

Les scripts peuvent facilement être écrits pour exécuter toutes les suites de tests de votre arborescence source et collecter les résultats.

J'utilise une version personnalisée de la CppUnit originale depuis des années avec beaucoup de succès, mais il existe maintenant d'autres alternatives. GoogleTest semble intéressant.

1
Aaron Hinni

Je pense que vous êtes sur la bonne voie avec les tests unitaires et c'est un excellent plan pour améliorer la fiabilité de votre produit.

Bien que les tests unitaires ne résoudront pas tous vos problèmes lors de la conversion de votre application vers différentes plates-formes ou même différents systèmes d'exploitation. La raison en est que les tests d'unité de processus sont effectués pour découvrir des bogues dans votre application. Il jette simplement autant d'entrées imaginables dans votre système et attend un résultat à l'autre bout. C'est comme si un singe tapait constamment sur le clavier et observait les résultats (testeurs bêta).

Pour passer à l'étape suivante, avec de bons tests unitaires, vous devez vous concentrer sur la conception interne de votre application. La meilleure approche que j'ai trouvée était d'utiliser un modèle de conception ou un processus de conception appelé "programmation par contrat" ou "conception par contrat". L'autre livre qui est très utile pour intégrer la fiabilité dans votre conception de base était.

Débogage du processus de développement: stratégies pratiques pour rester concentré, atteindre les dates des navires et constituer des équipes solides.

Dans notre équipe de développement, nous avons examiné de très près ce que nous considérons comme une erreur de programmeur, une erreur de développeur, une erreur de conception et comment nous pourrions utiliser à la fois les tests unitaires et également renforcer la fiabilité de notre progiciel via DBC et en suivant les conseils de débogage du développement. processus.

1
Chad

CxxTest vaut également le coup d'oeil pour un framework JUnit/CppUnit/xUnit multiplateforme léger et facile à utiliser pour C++. Nous trouvons très simple d'ajouter et de développer des tests

Aeryn est un autre framework de test C++ qui mérite d'être étudié

1
David Sykes