2010-05-13 23 views
60

Soy pionero en los esfuerzos de pruebas unitarias en mi empresa, y necesito elegir un marco de burla para usar. Nunca he usado un marco de burla antes. Ya hemos elegido Google Test, por lo que usar Google Mock sería bueno. Sin embargo, mis impresiones iniciales después de mirar Google Mock's tutorial son:¿Es Google Mock un buen marco de burla?

  • La necesidad de volver a declarar cada método en la clase de burla con una macro MOCK_METHODn parece innecesario y parece ir en contra del principio DRY.
  • Sus matchers (por ejemplo, el '_' en EXPECT_CALL (tortuga, Reenviar (_));) y el orden de coincidencia parecen casi demasiado potentes. Al igual, sería fácil decir algo que no quieres decir, y extrañar errores de esa manera.

Tengo una gran confianza en los desarrolladores de Google, y poca confianza en mi propia capacidad para juzgar marcos burlones, nunca antes los había usado. Entonces mi pregunta es: ¿Son estas preocupaciones válidas?

¿O no hay una mejor manera de definir un objeto simulado, y los matchers son intuitivos en la práctica? Agradecería las respuestas de cualquier persona que haya usado Google Mock anteriormente, y las comparaciones con otros marcos C++ serían útiles.

+7

Para la parte "redeclar", tenga en cuenta que 'gmock_gen.py' por lo general puede escribir el simulacro para usted (dado el archivo de encabezado y la clase base como entrada). Dado que C++ es complejo, puede que se estropee, pero seguirá cubriendo la mayoría de las cajas de uso, por lo que acelera las cosas. –

+0

Gracias. Lamentablemente, dudo que la gente aquí lo use. Podría intentar, sin embargo. – des4maisons

Respuesta

43

Lo uso con frecuencia.

Es trivial hacer cosas relativamente fáciles, y es posible hacer cosas muy difíciles, eso es más o menos lo que quiero de un framework.

Lo más difícil de escribir Matchers personalizados (y otras cosas) con los simulacros de Google no son los simulacros de Google, son errores de plantilla de C++ ... son casi imposibles de analizar. A menudo escribo expresiones complejas construyendo incrementalmente una expresión de trabajo a partir de algunas expresiones menos complicadas. De esta forma, los errores de plantilla son más fáciles de identificar.

No he visto una mejor opción para burlarse de C++, y Google abarca mucho terreno, por lo que te sugiero que lo pruebes.

WRT el principio DRY, estoy de acuerdo en que declarar los métodos burlados es desafortunado, pero sin reflexionar, no estoy seguro de que C++ tenga mucha suerte de lo contrario. Estoy casi seguro si hubiera una manera, googlemock lo estaría usando;)

BTW: El googlemock cookbook es una buena referencia.

+0

Gracias por los comentarios, ¡definitivamente no habría obtenido eso del tutorial! – des4maisons

+0

con respecto a DRY, consulte mi respuesta a una pregunta sobre la gestión de generación de código repetitivo para los simulacros: http://stackoverflow.com/a/10260532/170521 – lurscher

+4

También decidí finalmente ir con Google Mocks. Originalmente, pensé que la mayor desventaja es que tienes que escribir explícitamente una clase falsa (con las macros DEFINE_METHODXXX). Sin embargo, descubrí que hay una secuencia de comandos python incluida con el paquete que puede generar la clase simulada para usted. – hopia

14

Descargo de responsabilidad: escribí HippoMocks.

Puedo recomendar mirar otros marcos burlones; hay una clase de ellos que no te hacen repetir. También eliminan una nueva sintaxis para emparejar lo que hace que su código sea mucho más parecido a C++ combinado con el inglés. ¡Darle una oportunidad!

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

+0

Gracias, lo echaré un vistazo. – des4maisons

+1

Entonces, ¿alguna conclusión? – Michael

+1

¡No es necesario crear una clase simulada diferente! –

19

Fake-It es un marco de burla simple para C++. FakeIt utiliza las últimas características de C++ 11 para crear una API expresiva (aunque muy simple). Con FakeIt no hay necesidad de volver a declarar métodos ni crear una clase derivada para cada simulacro. Aquí es cómo falso-It:

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); 

Hay muchas más características para explorar. Adelante y give it a try.

6

He estado usando googletest + googlemock profesionalmente durante unos años, y definitivamente me gusta. Una cosa que no ha sido mencionada por otros es que si ya estás comprometido con el uso de googletest, entonces tiene mucho sentido usar también googlemock. Están bastante bien integrados y comparten un estilo de diseño y filosofía similar, lo cual es agradable.

Por ejemplo, googlemock proporciona ASSERT_THAT() macros que son muy útiles y coexisten muy bien con las afirmaciones de Googletests.

Sin embargo, le advierto sobre abusar del poder de googlemock. Puede ser extremadamente tentador para escribir & muy complejos que resultan totalmente ilegibles. Solo necesita ser disciplinado cuando lo usa.

Algunos otros pensamientos:

  • Googlemock puede tener una curva de aprendizaje un poco elevados; las complejidades de los participantes y las expectativas no son tan directas como cabría esperar.
  • La preocupación por la violación de DRY es válida; es molesto tener que definir manualmente los simulacros cuando parece que pueden ser autogenerados fácilmente. Es bastante común que los equipos escriban sus propios generadores de código que definen automáticamente googlemocks para sus interfaces.
Cuestiones relacionadas