Comment s'y prendre pour organiser un harnais de test unitaire pour l'héritage code Visual C ++?

StackOverflow https://stackoverflow.com/questions/1156816

Question

J'ai un Visual Studio 2005 C ++ projet, il est une application console.

Je veux commencer à obtenir bits du code sous un harnais de test, mais j'ai rencontré quelques problèmes que je ne sais pas comment mieux poignée.

Je ne veux pas la plupart de mon code de test pour mettre fin dans le .exe normal dans la production, donc je pensais que serait le mieux pour créer un projet distinct pour mes tests. Le premier numéro, comment est-ce nouveau projet va appeler dans le reste du code? Dois-je faire mon code hérité d'un .lib ou .dll avec un seul point d'entrée et de créer un projet distinct qui appelle le principal de mon code existant?

Dois-je aller pour le hack laid de mettre tous mes tests dans des fichiers qui sont entièrement #ifdef TESTING afin que le code ne se termine pas dans mon .exe de production? Si oui, comment dois-je charger mon conditionnellement cadre d'essai? Utilisez une configuration des propriétés distinctes pour les tests?

Je cherche essentiellement pour des suggestions sur la façon de s'y prendre pour obtenir un harnais de test sur un projet .exe existant dans Visual C ++

Était-ce utile?

La solution

D'abord, je vous recommande vivement le livre de Michael Feather "Travailler efficacement avec Legacy Code" . Il est tout au sujet de la façon d'ajouter des tests unitaires automatisés pour une application héritage qui n'a pas de tests. Si vous vous demandez « comment puis-je commencer même tester cette pile de code » alors ce livre est pour vous.

Michael est également l'auteur de CppUnit, un logiciel libre de framework de test NUnit comme pour le code C ++. Vous pouvez le trouver ici: http://sourceforge.net/projects/cppunit/ .

Une façon rapide et sale pour ajouter des tests est d'ajouter une configuration UnitTest à votre solution. Cette configuration compiler votre code, mais au lieu de le lier à votre MAIN.CPP, vous exclure votre main.cpp de la construction et comprennent UnitTestMain.cpp, où vous placeriez les appels à exécuter les tests unitaires. Nous avons commencé cette façon il y a longtemps, quand nous ne savions pas mieux. Vous finissez par passer beaucoup de temps en incluant et excluant tous les différents modules de testMyCode.cpp aux différentes configurations, cependant, et il devient fatiguant après un certain temps. Nous avons constaté que les développeurs n'aimaient pas cette approche trop.

Une approche beaucoup mieux est d'ajouter un projet de test unitaire à votre solution, avec une dépendance de construction sur votre projet immobilier. Si le projet est nommé Foo.vcproj, appelez Foo_test.vcproj. Ce projet ne contient que votre code de test, il #Includes vos en-têtes de Foo, et des liens vers vos modules fooCode.obj compilés. Ajouter un appel à exécuter Foo_test.exe comme une étape de post-construction de la construction Foo_test, et il exécute automatiquement les tests unitaires durant la construction. Si les tests unitaires échouent, la génération échoue. Si vous avez fermé-check-ins configurés sur votre serveur de build, personne ne peut vérifier des changements qui rompent les tests existants.

Autres conseils

Je pense avoir la plupart du code qui est testé dans une bibliothèque est le meilleur, mais pas nécessairement pratique dans tous les cas.

Une solution est d'avoir une configuration de projet (par exemple, Debug, Release et Test) et votre code de test dans des fichiers séparés qui sont marqués comme « Sont exclus de Build » sous la Debug et Release configurations. Vous pouvez avoir le code simple de lancer des tests dans un #ifdef ou une version tronquée du lanceur de test qui est inclus dans les versions non-test.

Une autre option (si elle est hack-ish plutôt) est d'avoir votre code execute de test à partir WinMain et tourner votre code de production de l'ancienne main régulière. Lorsque vous construisez en utilisant le sous-système « Windows » vos tests se dérouleront, et lors de la création du sous-système Console votre code de production se déroulera. Je ne sais pas hors part, si l'éditeur de liens baissera les fonctions de test non-appelé de la construction de la production, bien que.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top