web-dev-qa-db-fra.com

Google Mock est-il un bon cadre de simulation?

Je suis un pionnier des efforts de tests unitaires dans mon entreprise et j'ai besoin de choisir un cadre de simulation à utiliser. Je n'ai jamais utilisé de framework moqueur auparavant. Nous avons déjà choisi Google Test, donc utiliser Google Mock serait bien. Cependant, mes premières impressions après avoir consulté tutoriel de Google Mock sont:

  • La nécessité de re-déclarer chaque méthode dans la classe de simulation avec une macro MOCK_METHODn semble inutile et semble aller à l'encontre du principe DRY.
  • Leurs correspondants (par exemple, le "_" dans EXPECT_CALL (tortue, Forward (_));) et l'ordre de correspondance semblent presque trop puissants. Par exemple, il serait facile de dire quelque chose que vous ne voulez pas dire et de manquer 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 fictifs, sans les avoir utilisés auparavant. Donc ma question est: Ces préoccupations sont-elles valables?

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

61
des4maisons

Je l'utilise fréquemment.

C'est trivial de faire des choses relativement faciles, et possible de faire des choses très difficiles - c'est à peu près ce que je veux d'un cadre.

La partie la plus difficile à écrire des Matchers personnalisés (et d'autres choses) avec les simulations de Google n'est pas les simulations de Google, ce sont les erreurs de modèle de C++ ... elles sont presque impossibles à analyser. J'écris souvent des expressions complexes en construisant progressivement une expression de travail à partir de quelques expressions moins compliquées. De cette façon, les erreurs de modèle sont plus faciles à identifier.

Je n'ai pas vu de meilleure option pour se moquer de C++, et Google couvre beaucoup de terrain, donc je vous suggère de lui donner un coup de feu.

WRT le principe DRY, je suis d'accord que déclarer les méthodes simulées est malheureux, mais sans réflexion, je ne suis pas sûr que c ++ aurait beaucoup de chance sinon. Je suis presque certain s'il y avait un moyen , googlemock l'utiliserait;)

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

43
Stephen

Fake-It est un cadre de simulation simple pour C++. FakeIt utilise les dernières fonctionnalités 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 maquette. Voici comment vous fausses:

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 .

20
Eran Pe'er

Avertissement: j'ai écrit HippoMocks.

Je peux recommander de regarder d'autres cadres moqueurs; il y en a une classe qui ne vous fait pas vous répéter. Ils suppriment également une nouvelle syntaxe pour faire correspondre votre code à beaucoup plus comme C++ combiné avec l'anglais. Essaie!

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

14
dascandy

J'utilise googletest + googlemock professionnellement depuis quelques années, et j'aime vraiment ça. Une chose qui n'a pas été mentionnée par d'autres, c'est que si vous êtes déjà déterminé à utiliser googletest, il est très logique d'utiliser également googlemock. Ils sont assez bien intégrés et partagent un style et une philosophie de conception similaires, ce qui est agréable.

Par exemple, googlemock fournit des macros ASSERT_THAT() qui sont super utiles et coexistent bien avec les assertions de googletests.

Je voudrais toutefois vous mettre en garde contre l'abus du pouvoir de googlemock. Il peut être extrêmement tentant d'écrire des matchers très complexes et puissants qui finissent par être totalement illisibles. Vous avez juste besoin d'être discipliné lors de son utilisation.

Quelques autres réflexions:

  • Googlemock peut avoir une courbe d'apprentissage quelque peu abrupte; les subtilités des matchers et des attentes ne sont pas aussi simples que vous pourriez l'espérer.
  • Le souci de violer DRY est valide; il est ennuyeux de devoir définir manuellement les 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 automatiquement définir des googlemocks pour leurs interfaces.
6
Ian