Je suis un développeur de logiciels relativement nouveau qui travaille actuellement à ajouter des tests unitaires à un projet C++ existant qui a débuté il y a des années. Pour des raisons non techniques, je ne suis pas autorisé à modifier un code existant. La classe de base de tous mes modules a un tas de méthodes pour définir/obtenir des données et communiquer avec d'autres modules.Se moquer des méthodes non-virtuelles en C++ sans éditer le code de production?
Puisque je veux juste tester chaque module individuellement, je veux pouvoir utiliser des valeurs prédéfinies 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 qu'il retourne vrai ou faux selon le type de test que je fais. J'ai regardé dans Google Test et Google Mock, et il prend en charge les méthodes non-virtuelles moqueuses. Cependant l'approche décrite (http://code.google.com/p/googlemock/wiki/CookBook#Mocking_Nonvirtual_Methods) m'oblige à "templacer" les méthodes originales pour prendre des objets réels ou faux. Je ne peux pas aller créer des modèles à mes méthodes dans 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
Fondamentalement, les méthodes que je veux moquer sont dans une classe de base, la modules Je veux tester unitairement et créer des mocks de classes dérivées de cette classe de base. Il y a des modules intermédiaires entre ma classe de module de base et les modules que je veux tester.
J'apprécierais n'importe quel conseil!
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 le GetStatus non virtuel (moduleName) défini dans la classe rootModule. Je dois en quelque sorte faire GetStatus() pour retourner une valeur prédéfinie choisie. Mocking est nouveau pour moi, alors utiliser des objets simulés, même la bonne approche?
Pouvez-vous modifier localement le code juste pour vos tests? Vous n'auriez pas à enregistrer les modifications. –
Etes-vous obligé d'utiliser des tests unitaires? Il existe d'autres méthodes (automatisées) de test de régression. Les tests unitaires sont un outil, pas une religion - si cela ne convient pas, ne l'utilisez pas. Idéalement – ima
mon équipe souhaite utiliser les tests unitaires, car notre arbre module est assez grand, nous vraiment envie de découpler les tests de fonctionnalité inter-module de l'essai des méthodes locales d'un module. Il est regrettable que nos décisions de conception antérieures aient rendu les tests unitaires difficiles. À quelles autres méthodes de test de régression faites-vous référence? J'imagine que, en utilisant d'autres méthodologies de test, nous aurons toujours besoin d'un moyen d'avoir des méthodes non-virtuelles ou de retourner des valeurs prédéfinies, ce qui signifie que nous trouverons une solution ou garderons un autre arbre source. – wk1989