2008-11-18 9 views
38

Recientemente ha habido un poco de exageración alrededor de todos los diferentes frameworks burlones en el mundo .NET. Todavía no he entendido lo que es tan bueno acerca de ellos. No parece ser difícil escribir los objetos burlones que necesito. Especialmente con la ayuda de Visual Studio, puedo escribir rápidamente una clase que implementa la interfaz que quiero simular (genera automáticamente casi todo para mí) y luego escribo una implementación para el (los) método (es) que necesito para mi prueba. ¡Hecho! ¿Por qué pasar por la molestia de entender un marco de burla con el único propósito de guardar unas pocas líneas de código? ¿O es un marco de burla no solo de guardar líneas de código?¿Por qué necesito un marco de burla para mis pruebas de unidad?

+3

Solo una advertencia ... esta pregunta no es específica de .NET. Así que no dudes en leer si te encuentras aquí de alguna manera. – smp7d

Respuesta

32

Una vez que me he acostumbrado a los objetos falsos, me di cuenta de que son esenciales para las pruebas unitarias por la misma razón que los ensayos doble ciego o los grupos de control son esenciales para los ensayos científicos: aíslan lo que realmente está probando.

Si está probando una clase que tiene bastante interacción a través de otras interfaces, no solo guardará las líneas de código al tener que burlarse de todas y cada una de las interfaces, sino que también obtendrá la capacidad de hacer cosas como " lanzar una excepción si un método inesperado se llama "o" excepción si estos métodos se llaman fuera de servicio ". Puede hacerse notablemente sofisticado con frameworks simulados, y aunque admitiré rápidamente que hay una gran curva de aprendizaje, cuando se ponga al día ayudarán a que las pruebas de su unidad sean más completas sin estar hinchado.

+0

¿Cómo pueden llamarse los métodos desordenados? OMI es un olor a código. –

+1

Depende del flujo de trabajo de la clase en simulacro. Si algo tiene estado mantenido a través de un ciclo de vida conocido (por ejemplo, init(), run(), desmontaje()) entonces la clase bajo prueba necesita respetar ese estado. –

+1

¿No es eso retroceder un poco? ¿Hacer que una persona que llama sea responsable de garantizar el estado apropiado de otra persona? ¿No debería la clase que requiere un orden de llamada adecuado ser la que asegure que se llame/use correctamente? ¿Lanzando excepciones/aserciones cuando no lo es? ¿Y no deberían las pruebas para este "orden-requiriendo-clase" verificar que se lanzan cuando los métodos son llamados en un orden inapropiado? Me parece que esta sería una forma más efectiva de hacerlo que cambiar la responsabilidad del uso adecuado a todos los posibles usuarios de esa "clase que requiere orden". –

3

Bueno, ciertamente no creo que NECESITES un marco de burla. Es un marco como cualquier otro y, en última instancia, está diseñado para ahorrarle tiempo y esfuerzo. También puede hacer cosas como rodar sus propias estructuras de datos comunes, como pilas y colas, pero ¿no es generalmente más fácil simplemente usar las integradas en las bibliotecas de clases que se entregan con el compilador/IDE del idioma de su elección?

Estoy seguro de que hay otras razones convincentes para usar marcos de burla, aunque dejaría que los gurús de TDD y de pruebas unitarias respondan.

4

Roy Osherove tenía una encuesta sobre marcos falsos y hacia abajo en la sección de comentarios, hay una discusión (aunque breve) sobre si se necesita un marco de simulacro o no.

Personalmente, he estado haciendo manualmente lo que usted indicó y ha funcionado bastante bien, pero esto ha sido principalmente por hábito en lugar de una opinión estrechamente sostenida sobre marcos falsos en general.

8

preguntas anteriores que pueden ayudar:
What is a mock and when should you use it?
Mockist vs classical TDD

Me parece que el uso de un marco de burla me permite generar pruebas mucho más rápido y con mejor verificación de que lo que espero que suceda en la prueba en realidad es sucediendo En el pasado he implementado stubs o falsificaciones yo mismo. Descubrí que necesitaba generar stubs específicos para la prueba que quería y esto llevó mucho tiempo. Puedo crear la misma prueba mucho más rápido usando un marco de burla. Los buenos apoyan la generación de falsificaciones, stubs o burlas con sintaxis directa.

Me lleva un tiempo entenderlo, lo evité por un tiempo pero ahora no trataría de trabajar sin un marco burlón por las razones que dice @Chamelaeon.

+1

+1 Casi se podría decir que un marco de burla proporciona una DSL, y los beneficios de DSL se comprenden bien. –

12

De hecho, ha identificado uno de los puntos clave de un marco simulado en su pregunta. El hecho de que codifique los burla usted mismo no es algo que deba preocupar al desarrollador. Los marcos de burla te dan implementaciones de interfaces programáticamente, además de que son funcionales (en función de tu configuración del simulacro).

¿Qué hace si está probando un ICustomerDAO, por ejemplo, y quiere probar algún método 14 veces cada uno con diferentes resultados? Implementar 14 clases diferentes de forma manual? Dudo que alguien quiera hacer eso.

Los simuladores le dan la capacidad de definir lo que sucederá con partes de sus clases cuando no le preocupa si realmente funcionarán o no, como lanzar excepciones cuando lo desee, devolver cero resultados y asegurarse de que maneja que correctamente, etc ...

Son una excelente herramienta de prueba de unidades.

0

Una de las cosas buenas de un marco burlón es que permite establecer expectativas en los objetos que se burlan. Con las expectativas puedo establecer todo tipo de condiciones para ejercitar el código que está siendo probado.

2

Por la misma razón, no intentarás escribir pruebas unitarias sin NUnit. Un marco burlón lo ayudará a verificar el estado y el comportamiento en cientos de pruebas unitarias. Vale la pena las 2 semanas o más de dolor para ponerse al día y realmente te ayuda a concentrarte en lo que se debe probar.

0

Un marco de aislamiento o mocking framework le permite probar el código que desea, sin sus dependencias. Hace que las pruebas de ejecución sean cortas, le permite depurar rápidamente y construir fácilmente una red de seguridad de pruebas alrededor del código. Diferentes marcos tienen diferentes características, y como se dijo antes, es una herramienta, y debe seleccionar la herramienta adecuada para el trabajo.

2

Una cosa que me preocupa sobre un marco de burla es que "lo que es una función debe O/P dado una I/P" a través de

cuando (mock.someMethod ("algún arg")). ThenReturn ("alguna cosa");

declaración se extiende a través de muchas clases de prueba de unidad.

Déjenme elaborar con un ejemplo. Digamos que había una función DAO Interface getEmp (int EmpID) que devolvía un objeto Employee cuando pasaba un ID de empleado como parámetro. Suponga que esta función estaba siendo burlada por 10 diferentes clases de prueba de unidad. Ahora, si en el futuro, esta función se cambiara para devolver una versión más nueva del Objeto del empleado, uno debería ir a cada una de las 10 clases diferentes para actualizar este cambio.

Las desventajas son las siguientes ...

a) No sé cómo averiguar todas las clases que se burlan de esta función para que pueda ir a actualizar este cambio.

b) Mis casos de prueba existentes que consumen el objeto simulado DAO continúan siendo felizmente inconscientes de los cambios que le han sucedido a la interfaz DAO porque la simulación no ha cambiado y por lo tanto continúa siendo verde. Idealmente, si tuviera que codificar una sola clase de prueba y consumirla en todas partes, solo tendría un lugar para actualizar para la versión más nueva del objeto Employee. Además, una vez que actualizo en este lugar, todos mis casos de prueba existentes que consumen el simulacro se romperían y entonces sabría exactamente a qué lugares tengo que ir y hacer una actualización para el nuevo Objeto del empleado.

alguna idea sobre mis puntos de vista ..

0

he rinoceronte uso burla para un marco de burla. I y otros 5 desarrolladores lo usaron en una aplicación para grandes empresas que fue un proyecto de 8 meses. Usamos tdd en el proyecto. ¿Valió la pena? Supongo.¿Hubo un gran punto de venta masivo para usar burlas que tengo que usar en cada proyecto? En mi opinión, no. No es algo que es necesario, es solo una herramienta que puede usar si quiere probarlo. Algunos proyectos pueden implementar sus propias clases simuladas, como algunos dicen que prefieren: es más fácil. Otros proyectos son más grandes y pueden requerir un marco de burla. La palabra clave (en mi opinión) es PUEDE requerir ... ¿Cuánta cobertura de código necesita? Para mí, esa es otra consideración para usar simulacros. El proyecto que hice con tdd/rhino se burla de que se nos requiriera tener una cobertura de código del 80% para que los simulacros nos ayudaran a lograr eso. Si nuestros requisitos de cobertura del código fueran menores, por ejemplo 40%, probablemente no hubiésemos utilizado un marco de burla y simplemente hubiéramos redactado nuestras propias clases simuladas, como otros mencionan que lo hacen.

Cuestiones relacionadas