J'essaie de comprendre le but de google-mock
, framework de simulation C++ de Google .
J'ai déjà travaillé avec gtest
plus tôt, mais je ne comprends toujours pas ce qu'est gmock
. Pourquoi en avons-nous besoin?
gtest
est utilisé pour les tests unitaires. De quoi avons-nous besoin gmock
alors, si gmock
est requis pour unit testing
?
"Google Mock n'est pas un cadre de test lui-même. Au lieu de cela, il a besoin d'un cadre de test pour écrire des tests. Google Mock fonctionne de manière transparente avec Google Test. Il est fourni avec une copie de Google Test fournie. À partir de la version 1.1.0, vous pouvez également utiliser avec n'importe quel framework de test C++ de votre choix. "- Google Mock, Configuration requise
Les simulacres sont comme des objets, définis de manière à imiter la réalité en fournissant un comportement contrôlé. Par exemple, pour tester une application de cotation boursière, vous devez créer un fournisseur de données boursières factices qui a créé de fausses cotations boursières pour tester votre code. Pensez au mot simulé, signifie littéralement "imiter".
Les unités logicielles ne vivent pas dans des prairies vertes. Ils ont très souvent besoin de quelques homologues pour faire le travail. Dans le système réel, ces homologues appartiennent au système lui-même. Dans les tests unitaires, ils sont remplacés par des simulacres.
Gtest est un framework pour les tests unitaires. Gmock est un framework imitant le reste de votre système lors des tests unitaires.
Supposons que vous écrivez un morceau de code qui doit interagir avec un système externe imprévisible et coûteux (par exemple, un site Web, une grande base de données, un capteur physique, etc.) Votre code doit continuer à fonctionner lorsque le système externe arrive à expiration , ou vous donne des messages d'erreur, ou vous donne des données incohérentes. Comment pouvez-vous tester si votre code répond réellement à ces exigences?
Eh bien, vous pouvez l'exécuter contre un véritable site Web/base de données/capteur/peu importe, un tas de fois, et j'espère que vous aurez de la chance dans toutes les conditions d'erreur que votre code est censé gérer. De toute évidence, une stratégie de test assez coûteuse et peu fiable.
Donc, à la place, vous écrivez quelque chose qui satisfait la même interface que le site Web/la base de données/le capteur/peu importe, mais que vous avez programmé pour produire certaines réponses "prédéfinies" (erreurs, délais d'attente, données incohérentes, etc.) Vos tests vont maintenant s'exécutent beaucoup plus rapidement (car ils ne font pas face aux frais généraux d'un réel site Web/base de données/capteur/autre), et ils sont prévisibles. Malheureusement, il faut beaucoup de codage pour rédiger un site Web/base de données/capteur/autre "maquette" distinct pour chaque scénario que vous devez tester. Plus il y a de travail, moins vous avez de chances de le faire. Résultat: code mal testé.
Gmock et ses proches automatisent une grande partie de ces éléments, vous pouvez donc spécifier le comportement "en conserve" souhaité au milieu du test lui-même, au prix de quelques lignes de code seulement. Si les tests sont faciles à écrire, vous êtes susceptible d'en écrire plus, et donc plus susceptibles de découvrir des bugs avant d'envoyer le code :-)
BTW, cela implique que vous avez également besoin d'une "injection de dépendance": votre code doit prendre un paramètre du type d'interface, et vous devez pouvoir passer soit un objet factice (pour les tests unitaires), soit le "vrai" Site Web/base de données/capteur/autre (pour une utilisation dans le monde réel).
Disons que vous voulez écrire quelque chose dans un fichier.
Vous devez tester comme si la mémoire système est pleine ou non.
Allez-vous remplir la mémoire système pour tester cela? Non.
Votre ami Google simulé vous aidera ici.