Ortogonalidad de pruebas unitarias versus concisión de pruebas unitarias

14

Estoy escribiendo pruebas unitarias para un sistema de dirección para un videojuego. El sistema tiene varios comportamientos (evite esta área debido a la razón A, evite esta área debido a la razón B, cada una agregando un poco de contexto a un mapa de la región. Una función separada luego analiza el mapa y produce un movimiento deseado.

Estoy teniendo problemas para decidir cómo escribir las pruebas de unidad para los comportamientos. Como lo sugiere TDD, solo me interesa cómo los comportamientos afectan el movimiento deseado. Por ejemplo, evitar-por-la-razón-A debería resultar en un movimiento lejos de la posición incorrecta sugerida. No me importa en realidad cómo o por qué el comportamiento agrega contexto al mapa, solo que el movimiento deseado está lejos de la posición.

Así que mis pruebas para cada comportamiento configuran el comportamiento, lo hacen escribir en el mapa y luego ejecutan la función de análisis de mapa para calcular el movimiento deseado. Si ese movimiento satisface mis especificaciones, entonces estoy feliz.

Sin embargo, ahora mis pruebas dependen tanto de que los comportamientos funcionen correctamente como de que la función de análisis de mapas funcione correctamente. Si la función de análisis falla, obtendré cientos de pruebas fallidas en lugar de un par. Muchas guías de redacción de exámenes sugieren que esto es una mala idea.

Sin embargo, si pruebo directamente la salida de los comportamientos burlándome del mapa, entonces seguramente me estoy acoplando demasiado a la implementación. Si puedo obtener el mismo movimiento deseado del mapa utilizando un comportamiento ligeramente diferente, entonces las pruebas aún deberían pasar.

Así que ahora estoy sufriendo disonancia cognitiva. ¿Cuál es la mejor manera de estructurar estas pruebas?

    
pregunta tenpn 10.08.2011 - 12:55

3 respuestas

10

En el mundo ideal, de hecho, tendrías un conjunto de pruebas unitarias perfectamente ortogonales, todas en el mismo nivel de abstracción.

En el mundo real, normalmente tiene pruebas en muchos niveles diferentes de la aplicación, por lo que a menudo las pruebas de nivel superior ejercitan la funcionalidad que ya ha sido probada por pruebas de nivel inferior dedicadas también. (Muchas personas prefieren llamar a subsistemas de pruebas de nivel superior / pruebas de integración en lugar de pruebas unitarias; sin embargo, aún pueden ejecutarse en el mismo marco de pruebas unitarias, por lo que desde el punto de vista técnico no hay mucha diferencia)

No creo que esto sea algo malo. El punto es que su código sea probado de la mejor manera que se adapte a su proyecto y su situación, no a que se adhiera a "la forma ideal".

    
respondido por el Péter Török 10.08.2011 - 13:35
1

Este tipo de prueba es la razón por la que se inventaron los simulacros. La idea principal: escribe un simulacro para su objeto (mapa, comportamiento, carácter, ...), luego escribe pruebas utilizando ese simulacro en lugar del objeto real. La gente a veces llama simulacros de recibos, y creo que hay otras palabras para ambos.

En su caso, escribiría un simulacro para el mapa siempre que necesite probar los comportamientos, y otros simulacros de comportamientos cuando quiera probar el mapa. Lo ideal sería que sus simulaciones fueran mucho más simples que los comportamientos reales de los que se está burlando, solo incorporando los métodos o variables que realmente necesita para esa prueba. Es posible que tenga que escribir un simulacro diferente para cada prueba, o puede reutilizar algunos simulacros. En cualquier caso, deben ser adecuados para la prueba y no deben tratar de ser lo más parecido posible al comportamiento real.

Si incluyes algunos ejemplos de mapas o comportamientos, tal vez alguien podría proporcionar ejemplos de los simulacros que podrías escribir. No yo, ya que nunca he programado un videojuego más avanzado que Pong, e incluso entonces estaba siguiendo un libro, pero tal vez alguien bien versado en pruebas de unidad y desarrollo de juegos.

    
respondido por el trysis 13.10.2014 - 19:27
0

Creo que intentas probar cosas que son mucho más altos que una unidad.

La mayoría de las pruebas de comportamiento requerirían algo de inteligencia detrás de él, para saber si se comportó correctamente. Esto no se puede hacer fácilmente mediante pruebas automatizadas.

    
respondido por el oenone 10.08.2011 - 13:12

Lea otras preguntas en las etiquetas