62 votes

Google Mock est-il un bon cadre de simulation ?

Je suis à l'avant-garde des efforts de test unitaire dans mon entreprise, et j'ai besoin de choisir un framework mocking à utiliser. Je n'ai jamais utilisé de framework mocking auparavant. Nous avons déjà choisi Google Test, donc utiliser Google Mock serait bien. Cependant, mes premières impressions après avoir regardé Le tutoriel de Google Mock sont :

  • La nécessité de redéclarer chaque méthode dans la classe de mocking avec une macro MOCK_METHODn semble inutile et semble aller à l'encontre du principe DRY.
  • Leurs correspondances (par exemple, le '_' dans EXPECT_CALL(turtle, Forward(_)) ;) et l'ordre de correspondance semblent presque trop puissants. Il serait facile de dire quelque chose que l'on ne pense pas, et de rater des bogues de cette façon.

J'ai une grande confiance dans les développeurs de google, et une faible confiance dans ma propre capacité à juger les frameworks de mocking, ne les ayant jamais utilisés auparavant. Ma question est donc la suivante : Ces préoccupations sont-elles valables ?

Ou bien n'y a-t-il pas de meilleure façon de définir un objet fantaisie, et les appariements sont-ils intuitifs à utiliser en pratique ? J'apprécierais les réponses de toute personne ayant déjà utilisé Google Mock, et des comparaisons avec d'autres frameworks C++ seraient utiles.

44voto

Stephen Points 16714

Je l'utilise fréquemment.

Il est trivial de faire des choses relativement faciles, et possible de faire des choses très difficiles - c'est à peu près ce que j'attends d'un framework.

La partie la plus difficile de l'écriture de Matchers personnalisés (et d'autres choses) avec les mocks de Google n'est pas les mocks de Google, ce sont les erreurs de template C++... elles sont presque impossibles à analyser. J'écris souvent des expressions complexes en construisant de manière incrémentale une expression fonctionnelle à partir de quelques expressions moins compliquées. De cette façon, les erreurs de modèle sont plus faciles à repérer.

Je n'ai pas vu de meilleure option pour le mocking c++, et celle de Google couvre beaucoup de terrain, donc je vous suggère de l'essayer.

En ce qui concerne le principe DRY, je suis d'accord pour dire que la déclaration des méthodes fantaisie est malheureuse, mais sans réflexion, je ne suis pas sûr que c++ aurait beaucoup de chance autrement. Je suis presque certain que s'il y avait un moyen, googlemock l'utiliserait ;)

BTW : Le livre de recettes googlemock est une bonne référence.

22voto

Eran Pe'er Points 11

Fake-It est un simple framework de mocking pour C++. FakeIt utilise les dernières fonctionnalités de C++11 pour créer une API expressive (mais très simple). Avec FakeIt, il n'est pas nécessaire de redéclarer les méthodes ni de créer une classe dérivée pour chaque mock. Voici comment utiliser FakeIt :

struct SomeInterface {
  virtual int foo(int) = 0;
};

// That's all you have to do to create a mock.
Mock<SomeInterface> mock; 

// Stub method mock.foo(any argument) to return 1.
When(Method(mock,foo)).Return(1);

// Fetch the SomeInterface instance from the mock.
SomeInterface &i = mock.get();

// Will print "1"
cout << i.foo(10);

Il existe de nombreuses autres fonctionnalités à explorer. Allez-y et Essayez-le .

14voto

dascandy Points 2818

Disclaimer : J'ai écrit HippoMocks.

Je peux recommander de regarder d'autres frameworks de mocking ; il y en a une classe qui ne vous fait pas vous répéter. Ils se débarrassent également d'une nouvelle syntaxe pour l'appariement, ce qui fait que votre code se lit beaucoup plus comme du C++ combiné à de l'anglais. Essayez-le !

http://www.assembla.com/wiki/show/hippomocks

9voto

Ian Points 622

J'utilise googletest + googlemock à des fins professionnelles depuis quelques années, et je l'apprécie vraiment. Une chose qui n'a pas été mentionnée par d'autres est que si vous êtes déjà engagé dans l'utilisation de googletest, il est très logique d'utiliser également googlemock. Ils sont assez bien intégrés et partagent un style de conception et une philosophie similaires, ce qui est agréable.

Par exemple, googlemock fournit ASSERT_THAT() qui sont très utiles et coexistent agréablement avec les assertions de googletests.

Je vous mets cependant en garde contre l'abus de la puissance de googlemock. Il peut être extrêmement Il est tentant d'écrire des matchers très complexes et puissants qui finissent par être totalement illisibles. Il suffit d'être discipliné lors de son utilisation.

Quelques autres réflexions :

  • La courbe d'apprentissage de Googlemock peut être un peu raide ; les subtilités des correspondances et des attentes ne sont pas aussi simples que vous pourriez l'espérer.
  • La préoccupation concernant la violation de DRY est valide ; il est ennuyeux de devoir définir manuellement des mocks quand il semble qu'ils pourraient être facilement générés automatiquement. Il est assez courant pour les équipes d'écrire leurs propres générateurs de code qui définissent automatiquement des googlemocks pour leurs interfaces.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X