vivo tutorial programacion play online mexico examples español comedy central unit-testing mocking

unit testing - tutorial - ¿Cómo se usan los Mocks?



sapui5 examples (9)

En una escala, sí, los simulacros están destinados a simular fuentes de datos externas, como una base de datos o un servicio web. En una escala más fina, sin embargo, si diseñas un código débilmente acoplado, entonces puedes dibujar líneas en todo tu código de forma casi arbitraria en cuanto a lo que en algún momento podría ser un "sistema externo". Toma un proyecto en el que estoy trabajando actualmente:

Cuando alguien intenta registrarse, CheckInUi envía un objeto CheckInInfo a un objeto CheckInMediator que lo valida usando CheckInValidator , luego, si está bien, rellena un objeto de dominio llamado Transaction con CheckInInfo usando CheckInInfoAdapter luego pasa la transacción a una instancia de ITransactionDao .SaveTransaction () para persistencia.

Ahora mismo estoy escribiendo algunas pruebas de integración automática y, obviamente, CheckInUi e ITransactionDao son ventanas para sistemas externos y son los que deberían burlarse. Sin embargo, ¿a quién decir que en algún momento CheckInValidator no hará una llamada a un servicio web? Es por eso que cuando escribe pruebas unitarias , asume que todo lo que no sea la funcionalidad específica de su clase es un sistema externo. Por lo tanto, en mi prueba unitaria de CheckInMediator , simulé todos los objetos con los que habla.

EDITAR: Gishu es técnicamente correcto, no todo se debe burlar, no me burlo, por ejemplo, de CheckInInfo, ya que es simplemente un contenedor de datos. Sin embargo, cualquier cosa que puedas ver como un servicio externo (y es casi cualquier cosa que transforme datos o tenga efectos secundarios) debería ser burlada.

Una analogía que me gusta es pensar en un diseño apropiadamente acoplado como un campo en el que las personas que lo rodean jueguen un juego de atrapar. Cuando alguien pasa la pelota, puede arrojar una pelota completamente diferente a la siguiente persona, incluso puede tirar varias bolas en sucesión a diferentes personas o lanzar una pelota y esperar a recibirla de nuevo antes de tirarla a otra persona. Es un juego extraño.

Ahora, como entrenador y mánager, por supuesto, quieres comprobar cómo funciona tu equipo en general, así tienes práctica de equipo (pruebas de integración) pero también tienes a cada jugador practicando solo contra backstops y máquinas lanzadoras de bolas (pruebas unitarias con se burla). La única pieza que falta en esta imagen son las expectativas falsas, por lo que tenemos nuestras bolas manchadas con alquitrán negro para que manchen el respaldo cuando lo golpeen. Cada tope tiene un "área objetivo" a la que apunta la persona y si al final de una carrera práctica no hay una marca negra dentro del área objetivo, usted sabe que algo anda mal y la persona necesita que su técnica esté sintonizada.

Realmente me tomé el tiempo para aprenderlo correctamente, el día que entendí que Mocks era un gran momento de a-ha. Combínelo con un contenedor de inversión de control y nunca más volveré.

En resumen, una de nuestras personas de TI acaba de entrar y me dio una computadora portátil gratis.

Cuando originalmente me presentaron a Mocks, sentí que el propósito principal era simular objetos que provienen de fuentes externas de datos. De esta forma no tuve que mantener una base de datos de prueba de pruebas automatizada de unidades, solo pude fingir.

Pero ahora estoy empezando a pensar de otra manera. Me pregunto si los Mocks son más eficaces para aislar por completo el método probado de cualquier cosa fuera de él. La imagen que sigue viniendo a la mente es el fondo que usas cuando pintas. Usted quiere evitar que la pintura lo cubra todo. Solo estoy probando ese método, y solo quiero saber cómo reacciona a estos factores externos falsificados.

Parece increíblemente tedioso hacerlo de esta manera, pero la ventaja que estoy viendo es que cuando la prueba falla es porque está jodida y no tiene 16 capas hacia abajo. Pero ahora tengo que tener 16 pruebas para obtener la misma cobertura de prueba porque cada pieza se probará aisladamente. Además, cada prueba se vuelve más complicada y más vinculada al método que está probando.

Se siente bien para mí, pero también parece brutal, así que quiero saber qué piensan los demás.


Mi filosofía es que debes escribir un código comprobable para las pruebas,
no escribir pruebas para ajustarse al código.

En cuanto a la complejidad, mi opinión es que las pruebas deberían ser simples de escribir, simplemente porque usted escribe más pruebas si lo son.

Puedo estar de acuerdo en que podría ser una buena idea si las clases de las que te estás burlando no tienen un conjunto de pruebas, porque si tuvieran un conjunto de pruebas adecuado, sabrías dónde está el problema sin aislamiento.

La mayoría de las veces que he tenido uso para objetos falsos es cuando el código que estoy escribiendo prueba está tan estrechamente acoplado (léase: mal diseño), que tengo que escribir objetos simulados cuando las clases de las que dependen no están disponibles. Seguro que hay usos válidos para objetos falsos, pero si su código requiere su uso, volvería a mirar el diseño.


No vayas por el camino oscuro Maestro Lucas. :) No te burles de todo. Podrías, pero no deberías ... aquí está el porqué.

  • Si continúas probando cada método de forma aislada, tienes sorpresas y trabajo recortado para ti cuando los reúnes todos juntos ala BIG BANG . Construimos objetos para que puedan trabajar juntos para resolver un problema mayor. Por sí mismos son insignificantes. Necesita saber si todos los colaboradores están funcionando como se esperaba .
  • Las burlas hacen que las pruebas se vuelvan frágiles al introducir la duplicación. Sí, sé que suena alarmante. Por cada simulación que espere que configure, hay n lugares donde existe la firma de su método. El código real y sus expectativas simuladas (en pruebas múltiples). Cambiar el código real es más fácil ... actualizar todas las expectativas falsas es tedioso.
  • Su prueba ahora está al tanto de la información de implementación interna . Entonces, tu prueba depende de cómo elijas implementar la solución ... mal. Las pruebas deben ser una especificación independiente que se puede cumplir con múltiples soluciones. Debería tener la libertad de presionar borrar en un bloque de código y volver a implementar sin tener que reescribir el banco de pruebas ... porque los requisitos siguen siendo los mismos.

Para cerrar, diré: "Si grazna como un pato, camina como un pato, entonces probablemente sea un pato" - Si se siente mal ... probablemente lo sea. * Use burlas para abstraer problemas de niños como operaciones IO, bases de datos, componentes de terceros y similares. Al igual que la sal, parte de ella es necesaria ... demasiado y: x *
Esta es la guerra santa del Estado basada en pruebas basadas en Iteraction. Google buscará una visión más profunda.

Aclaración: estoy haciendo algunas pruebas de integración de resistencia wrt aquí :) Así que para aclarar mi posición ...

  • Los simulacros no figuran en el campo ''Pruebas de aceptación'' / Integración. Solo los encontrarás en el mundo de Unit Testing ... y ese es mi enfoque aquí.
  • Las pruebas de aceptación son diferentes y son muy necesarias, sin menospreciarlas. Pero las pruebas unitarias y las pruebas de aceptación son diferentes y deben mantenerse diferentes.
  • Todos los colaboradores dentro de un componente o paquete no necesitan estar aislados el uno del otro. Como la micro-optimización que es Overkill. Existen para resolver juntos un problema ... cohesión.

Sí estoy de acuerdo. Veo la burla como a veces dolorosa, pero a menudo necesaria, para que tus pruebas se conviertan verdaderamente en pruebas unitarias , es decir, solo se prueba la unidad más pequeña con la que puedes hacer tu prueba. Esto le permite eliminar cualquier otro factor que pueda afectar el resultado de la prueba. Terminas con muchas pruebas más pequeñas, pero es mucho más fácil averiguar dónde está el problema con tu código.


Sí, esa es la desventaja de las pruebas con simulacros. Hay mucho trabajo que debes poner para que se sienta brutal. Pero esa es la esencia de las pruebas unitarias. ¿Cómo puedes probar algo de forma aislada si no te burlas de los recursos externos?

Por otro lado, se burla de la funcionalidad lenta (como bases de datos y operaciones de E / S). Si las pruebas se ejecutan más rápido, eso mantendrá contentos a los programadores. No hay nada más doloroso que esperar pruebas realmente lentas, que tardan más de 10 segundos en terminar de ejecutarse, mientras intentas implementar una función.

Si cada desarrollador de su proyecto dedica tiempo a escribir pruebas unitarias, esas 16 capas (de direccionamiento indirecto) no representarían un gran problema. Esperemos que debas tener esa cobertura de prueba desde el principio, ¿verdad? :)

Además, no olvide escribir una prueba de función / integración entre objetos en colaboración. O bien, es posible que te pierdas algo. Estas pruebas no necesitarán ejecutarse con frecuencia, pero siguen siendo importantes.


Te recomiendo que eches un vistazo al artículo de Martin Fowler, Mocks Are not Stubs, para un tratamiento más autoritario de Mocks de lo que puedo darte.

El propósito de los simulacros es probar su código de manera aislada de las dependencias para que pueda probar verdaderamente una parte del código en el nivel de "unidad". El código bajo prueba es el verdadero negocio, y cada otra pieza de código que confía (a través de parámetros o inyección de dependencia, etc.) es un "simulacro" (una implementación vacía que siempre devuelve los valores esperados cuando se llama a uno de sus métodos).

Las burlas pueden parecer tediosas al principio, pero hacen que las Pruebas unitarias sean mucho más fáciles y más robustas una vez que te acostumbras a usarlas. La mayoría de los lenguajes tienen bibliotecas de Mock que hacen que la burla sea relativamente trivial. Si está utilizando Java, recomendaré mi favorito: EasyMock.

Permítanme terminar con este pensamiento: también necesitan pruebas de integración, pero tener un buen volumen de pruebas unitarias lo ayuda a descubrir qué componente contiene un error, cuando existe.


Como alguien dijo antes, si se burla de todo para aislar más granular que la clase que está probando, abandona la aplicación de la cohesión en el código que está bajo prueba.

Tenga en cuenta que la burla tiene una ventaja fundamental, la verificación del comportamiento. Esto es algo que los stubs no proporcionan y es la otra razón que hace que la prueba sea más frágil (pero puede mejorar la cobertura del código).


Los simulacros se inventaron en parte para responder a la pregunta : ¿cómo probarías los objetos de la unidad si no tuvieran captadores o establecedores?

En estos días, la práctica recomendada es simular roles, no objetos. Use Mocks como una herramienta de diseño para hablar sobre colaboración y separación de responsabilidades, y no como "trozos inteligentes".