9
votes

Tests unitaires C ++, objets moqueurs

Je regarde actuellement des bibliothèques de test de l'unité en C ++ et avez quelques questions:

  1. Il semble n'y avoir aucune installation moqueuse à Boost.Test mais je ne peux guère penser à faire des tests d'unité sans créer des objets / fonctions simulées. Comment feriez-vous cela à Boost.test, le faisiez-vous manuellement (comment? Je veux dire, il y a plusieurs façons que je puisse penser, rien de tout cela ne semble bien) ou faites-vous simplement en train de faire sans objets masculins? < / li>

  2. Googletest et GoogleMemock ressemble à de belles bibliothèques avec moquent cependant, cela nécessite chaque objet qui doit être moqué d'être virtuel. Je n'aime pas vraiment ça, ce n'est pas que je ne me soucie pas de la performance (je pourrais définir une macro pour la sortir du code de production de toute façon) mais je trouve cette très intrusive. Je me demande s'il y a une autre solution qui n'exige pas tant de changement au code existant? (Love Clojure là-bas)


1 commentaires

Écrivez vos simulacres à la main. Vous découvrirez ce que vous pouvez et que vous ne pouvez pas faire dans la langue.


3 Réponses :


6
votes
  1. boost :: test n'a pas de cadre ou de bibliothèque moqueur. Si vous voulez des simultes, vous devez le faire vous-même ou utiliser quelque chose comme Gmock. Bien sûr, vous pouvez utiliser Google Mock avec Boost :: Test sans problèmes.
  2. Comment voudriez-vous que quelque chose soit moqueur? C'est comme ça que cela fonctionne dans tous les autres langages de programmation! (D'accord, pas avec le taper du canard, mais cela porte plus de frais généraux que les méthodes virtuelles) si vous êtes préoccupé par la performance:

    1. Implémentez tout en termes de virtules comme spécifié dans le général Google Mock Docs.
    2. Profil Votre code pour des endroits où cela n'est pas suffisant
    3. Remplacez ces sections profilées (ou plutôt, le segment de votre code qui indique la performance est un problème) avec Injection de dépendance élevée à la place.
    4. Ne remplacez pas tout avec High-PerfI, car cela enverrait des moments de compilation à travers le toit.

      En toute gravité, je ne pense pas que les appels virtuels vont faire de vastes différences de performance. Le seul cas où les virtuelles sont mauvais sont des mauvaises apparences à l'intérieur des boucles intérieures (telles que dans la bibliothèque iostream où ils sont appelés éventuellement pour chaque caractère d'entrée ou de sortie), et même alors seulement en code sensible à la performance.

      edit: J'ai manqué le mot très important pas dans la question ci-dessus # 2 - que vous êtes pas inquiet pour la performance. Si c'est le cas, ma réponse est que vous êtes effectivement vissé. Une fonction simple ou un appel de méthode en C ++ génère un appel de méthode uni, et il n'y a pas d'opprotunité pour que vous puissiez changer où ces points d'appel. Dans la plupart des cas, cela ne nécessite pas trop beaucoup de changement de code, car le code C ++ correct utilise des références dans la mesure du possible, qui ne devront pas être modifiées malgré le fait que les virtuelles sont utilisées. Vous devrez toutefois surveiller toute personne utilisant la sémantique de la valeur, car elles seront soumises au problème de la coupe.


3 commentaires

>> Comment voudriez-vous que quelque chose soit moqueur? C'est comme ça que cela fonctionne dans tous les autres langages de programmation! En clojure, par exemple, vous pouvez reculer de manière dynamique et temporairement une fonction à une autre fonction à l'aide du formulaire de liaison (liaison [FOO Mock-FOO] ...)


@DAVINCI: Vous pouvez faire la même chose dans les terres C / C ++ à l'aide d'une macro ou d'une couture de liaison, bien que cela soit beaucoup plus difficile bien sûr.


Je pourrais comprendre si l'OP avait des contraintes de performance que quelque chose pourrait ne pas être réalisable dans ces contraintes, mais je ne comprends pas comment pas soin de la performance pourrait éventuellement dire que l'OP est "efficacement vissé".



6
votes

Tortue a été conçu explicitement pour une utilisation avec Boost.Test et a l'air très gentil avec moi.


0 commentaires

4
votes

Disclaimer Je travaille à Typemock.

Typemock Isolator ++ peut se moquer de quoi que ce soit !! Vous n'avez pas besoin de virtuel - tout est moqueur

voir Explication ici

Pour que vous puissiez simuler des faux publics, privés, abstraits (sans créer réellement une classe de béton), des arguments non virtuels, des arguments, une instance en direct, etc. Et... Il façonne tout de manière récursive xxx

Nous utiliserons le code suivant xxx


1 commentaires

Le lien vers Typemock.com/... est cassé. Et après avoir navigué au travail introduction page , j'ai trouvé un autre Lien brisé ( Typemock.com/isolatorpp ) et une erreur de terminologie ( localTime Méthode ). J'espère que le produit fonctionne mieux que ce qu'il est présenté ...