Question

Je suis un développeur de logiciels assez nouveaux tests ajoutant travaille actuellement l'unité à un projet C ++ existant qui a commencé il y a quelques années. En raison d'une raison non technique, je ne suis pas autorisé à modifier le code existant. La classe de base de tous mes modules a un tas de méthodes pour la configuration / Obtenir des données et communiquer avec d'autres modules.

Depuis que je veux juste tester l'unité chaque module, je veux être en mesure d'utiliser des valeurs en conserve pour toutes mes méthodes de communication inter-modules. C'est à dire. pour une méthode Ping () qui vérifie si un autre module est actif, je veux avoir le retourner vrai ou faux en fonction de ce type de test que je fais. J'ai cherché dans Google et Google test Mock, et il ne supporte se moquant des méthodes non virtuelles. Cependant, l'approche décrite ( http://code.google.com/p/googlemock/ wiki / CookBook # Mocking_Nonvirtual_Methods ) me demande de « méthodes » créer des modèles à originaux pour prendre soit des objets réels ou simulés. Je ne peux pas aller dans mes méthodes créer des modèles à la classe de base en raison de l'exigence mentionnée plus haut, donc je besoin d'une autre façon de se moquer de ces méthodes virtuelles

En fait, les méthodes que je veux moquer sont dans une classe de base, les modules que je veux tester l'unité et de créer des simulacres sont des classes dérivées de cette classe de base. Il existe des modules intermédiaires entre ma classe de base du module et les modules que je veux tester.

Je serais reconnaissant de tout conseiller!

Merci,

JW

EDIT: A plus d'exemples concrets

Ma classe de base est permet de dire rootModule, le module que je veux tester est leafModule. Il y a un module intermédiaire qui hérite de rootModule, leafModule hérite de ce module intermédiaire.

Dans mon leafModule, je veux tester la méthode doStuff (), qui appelle la GetStatus non virtuelle (moduleName) défini dans la classe rootModule. Je dois faire en quelque sorte GetStatus () pour retourner une valeur choisie en boîte. Mocking est nouveau pour moi, donc utilise des objets fantaisie même la bonne approche?

Était-ce utile?

La solution

Je voudrais écrire un script Perl / Ruby / Python pour lire dans l'arborescence de source d'origine et d'écrire un arbre source moqué dans un répertoire différent. Vous ne devez pas analyser pleinement C ++ afin de remplacer une définition de fonction.

Autres conseils

Il y a des façons différentes de remplacer les fonctions non virtuelles. La première consiste à les re-déclarer et compiler un nouveau exécutable de test pour chaque ensemble différent de fonctions non virtuelles que vous souhaitez tester. C'est à peine échelonnable.

Une deuxième option consiste à les rendre virtuel pour le test. La plupart des compilateurs vous permettent de définir quelque chose sur la ligne de commande afin de compiler votre code avec -DTEST_VIRTUAL = virtuel ou -DTEST_VIRTUAL pour les rendre soit en fonction virtuelle ou normale si oui ou non il est en cours de test ou non.

Une troisième option qui peut être utile est d'utiliser un cadre moqueur qui vous permet de simulacres fonctions non virtuelles. Je suis l'auteur de HippoMocks (disclaimer en ce qui concerne la neutralité et ainsi de suite) et nous avons récemment ajouté la possibilité de se moquer de fonctions C en clair sur les plates-formes X86. Cela peut être étendu à des fonctions non membres virtuels avec un peu de travail et serait ce que vous cherchez. Gardez à l'esprit que, si votre compilateur peut voir à la fois l'utilisation et la définition d'une fonction à un moment donné qu'il peut inline et que le moqueur peut échouer. Cela vaut en particulier pour les fonctions qui sont définies dans les en-têtes.

Si moqueur régulier de la fonction C est suffisante pour vous, vous pouvez l'utiliser comme il est maintenant.

Une approche serait de préciser les différentes sources pour les tests. Supposons que votre objectif de production utilise rootModule.h et rootModule.cpp. Utilisez des sources différentes pour votre cible de test. Vous pouvez spécifier un en-tête en changeant le chemin d'inclusion, de sorte que #include « rootModule.h » charge en fait unittest / rootModule.h. Puis rootModule maquette au contenu de votre coeur.

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