.net - unitarias - ¿Por qué necesito un marco de burla para mis pruebas de unidad?
qué objeto nos provee de muchas de las funciones para hacer unittests (10)
Recientemente ha habido bastante publicidad en torno a todos los diferentes marcos de burla 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?
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.
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.
Una de las cosas buenas de un marco burlón es que permite establecer expectativas sobre los objetos que se burlan. Con las expectativas puedo establecer todo tipo de condiciones para ejercitar el código que está siendo probado.
Una vez que finalmente entendí el truco de los objetos simulados, 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ás 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.
Roy Osherove hizo una encuesta sobre Mock Frameworks y en la sección de comentarios, hay una discusión (aunque breve) sobre si se necesita o no un Framework de Mock.
Personalmente, he estado haciendo manualmente lo que dijo y ha funcionado bastante bien, pero esto ha sido principalmente por hábito en lugar de una opinión muy estrecha sobre marcos falsos en general.
Un marco de aislamiento o un marco burlón 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.
Una cosa que me preocupa acerca de un marco de burla es que "qué función debería tener O / P una i / p" vía
when (mock.someMethod ("some arg")). thenReturn ("algo");
La declaración se distribuye entre muchas clases de prueba unitaria.
Déjame 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 descubrir todas las clases que se burlan de esta función para poder 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 el simulacro no ha cambiado y, por lo tanto, continúa siendo verde. Idealmente, si tuviera que codificar una sola clase falsa y consumirla en todas partes, tendría un solo lugar para actualizar la versión más reciente 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.
Cualquier idea sobre mis puntos de vista ...
He usado rinocerontes 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%, por lo que las burlas nos ayudaron a lograrlo. Si nuestros requisitos de cobertura del código fueran menores, por ejemplo 40%, probablemente no hubiésemos usado un marco de burla y simplemente hubiéramos redactado nuestras propias clases simuladas, como otros mencionan que lo hacen.
De hecho, identificó 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 el desarrollador deba preocuparse. 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é haces si estás probando un ICustomerDAO, por ejemplo, y quieres 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 simulacros 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 manejarlo correctamente, etc. ...
Son una gran herramienta de prueba unitaria.
Preguntas anteriores que pueden ayudar:
¿Qué es un simulacro y cuándo deberías usarlo?
Mockist vs TDD clásico
Me parece que el uso de un marco de burla me permite generar pruebas mucho más rápido y con una mejor verificación de que lo que espero que suceda en la prueba en realidad está 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 tomó un tiempo entenderlo, lo evité por un tiempo, pero ahora no intentaría trabajar sin un marco burlón por las razones que dice @Chamelaeon.