Sobre fake objects, stubs y mocks

Las pruebas unitarias son uno de los pilares centrales de los procesos de gestión de la calidad software modernos. Un desarrollador o un tester, escribe pruebas que intentan refutar que el código bajo prueba hace lo que se espera. Es decir, escribimos pruebas para intentar encontrar un “contraejemplo” a nuestro código, y mientras más pruebas escribimos más seguros estamos que dicho contraejemplo no existe.

En los lenguajes orientados a objetos, un programa se compone de distintos objetos que colaboran entre sí para llevar a cabo una funcionalidad determinada. Por esa razón, cuando probamos un método es normal que este llame a su vez a otros métodos de otros objetos o de sí mismo. Para que una prueba sea realmente unitaria, debemos aislar a nuestro código de este tipo de dependencias.

Para aislar nuestro código de las dependencias tomadas con los miembros de otras clases, desde Microsoft Research nos llega Moles. Moles es un framework de stubbing diseñado por Microsoft para facilitar a los desarrolladores y testers la creación de pruebas unitarias de su código.

Cuando desarrollamos pruebas y queremos hacer pruebas unitarias de nuestro código necesitamos en primer lugar seguir el principio de Inyección de dependencias, es decir, pasar cualquier objeto del que dependa el método que vamos a probar bien a través de los parámetros del constructor o bien a través de dar valor a sus propiedades. Como hemos dicho, para que estas pruebas sean unitarias tenemos que aislar las dependencias de nuestro código bajo prueba. Para aislar dichas dependencias tenemos tres opciones:

· Fake objects: Creamos una clase y una instancia para la prueba que devuelve los valores que esperamos que devuelva en nuestra prueba.

· Stubs: Creamos una clase “esqueleto” que podemos configurar fácilmente para que devuelva los valores que esperamos en nuestras pruebas. La diferencia con respecto a un fake object es que un stub es configurable y por tanto sirve para más pruebas.

· Mocks: Creamos mediante un framework un objeto que podemos configurar para que devuelva los valores que esperamos en nuestras pruebas y al cual además podemos preguntar después sobre cómo ha sido usado. (Que miembros han sido invocados, cuantas veces, con qué parámetros, etc).

Para dejar más clara la diferencia entre stub y mock podemos decir que los stubs sirven para hacer state based testing y los mocks permiten a su vez hacer behavior o interaction testing.

Dentro de la plataforma .NET disponemos de múltiples frameworks para realizar tanto stubbing como mocking. A continuación presentamos los principales:

  • Moq: Es un framework de mocking muy sencillo e intuitivo que se puede descargar desde http://code.google.com/p/moq/ y que aunque tiene una limitada potencia es muy sencillo de usar y más que suficiente para la mayoría de los casos.
  • Rhino Mocks: Es otro framework de mocking muy usado, muy potente aunque menos intuitivo que Moq, es muy flexible y está muy bien documentado. Se puede descargar desde http://www.ayende.com/projects/rhino-mocks.aspx.
  • Typemock Isolator: Es un framework de mocking de pago que se apoya en un profiler para ofrecernos más potencia que otros frameworks como moq o rhino mocks a la hora de crear mocks. Mientras que otros frameworks están limitados a hacer mocks de interfaces o miembros declarados virtual, typemock isolator nos permite reemplazar la lógica de cualquier método, propiedad, evento, etc. Ya sea en nuestro código o en código de terceros. Se puede encontrar en http://site.typemock.com/.
  • Moles: Moles es un framework desarrollado por Microsoft y que se puede descargar gratuitamente desde http://research.microsoft.com/en-us/projects/moles/. De la misma forma que Typemock Moles nos permite reemplazar cualquier método, propiedad, evento, etc. por el código de nuestra elección. Para ello, al igual que typemock hace uso de un profiler que modifica en tiempo de ejecución el código del método invocado y lo sustituye por el nuestro. Moles es muy sencillo de usar, simplemente añadimos a nuestra solución un fichero <Nombre-Ensamblado>.moles y la herramienta genera automáticamente una librería dll con todos los moles de los tipos del ensamblado.

Visto en una pequeña tabla comparativa estas son las distintas opciones que tenemos:

Framework

Ventajas

Inconvenientes

Gratis

Moq

Es muy sencillo e intuitivo.

Debido a su sencillez es difícil realizar algunos mocks.

Si

Rhino Mocks

Es muy potente y ofrece gran flexibilidad y muchas alternativas para realizar un mock.

Está limitado a interfaces y miembros virtuales de clases no selladas.

Si

Typemock Isolator

Es muy potente, permite mockear cualquier miembro de cualquier clase .NET y ofrece muchas facilidades extra a la hora de crear pruebas.

Es tan grande y tan potente que la curva de aprendizaje es más larga que con otros frameworks.

No

Moles

Es una herramienta muy potente y muy sencilla de usar ya que ha sido diseñada desde el principio con esos dos objetivos.

Es un framework de stubbing y no permite realizar comprobaciones sobre las llamadas de forma automática, aunque se puede implementar de forma sencilla manualmente.

Si

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *