En mi último proyecto, teníamos pruebas unitarias con casi 100% de cc, y como resultado, casi no tuvimos ningún error. Sin embargo, dado que Unit Testing debe ser White Box (debe burlarse de las funciones internas para obtener el resultado que desea, entonces sus pruebas deben conocer la estructura interna de su código) cada vez que cambiamos la implementación de una función, teníamos para cambiar las pruebas también. Tenga en cuenta que no cambiamos la lógica de las funciones, solo la implementación. consumió mucho tiempo y parecía que estábamos trabajando de forma incorrecta. Como usamos todas las pautas de OOP adecuadas (específicamente Encapsulation), cada vez que cambiamos la implementación no tuvimos que cambiar el resto de nuestro código, sino que tuvimos que cambiar las pruebas de la unidad. Parecía que estamos sirviendo las pruebas, en lugar de que nos sirvan.Black Box Unit Testing
Para evitar esto, algunos de nosotros argumentamos que las pruebas unitarias deberían ser Black Box Testing. Eso sería posible si creamos un gran simulacro de todo nuestro Dominio y creamos un talón para cada función en cada clase en un solo lugar, y lo usamos en cada prueba unitaria. Por supuesto que si una prueba específica necesita una función interna específica para ser llamada (como para asegurarnos de escribir en la base de datos), podemos anular nuestro código auxiliar.
Por lo tanto, cada vez que cambiemos la implementación de una función (como agregar o reemplazar una llamada a una función de ayuda) solo tendremos que cambiar nuestra gran simulación principal. Incluso si necesitamos cambiar algunas pruebas unitarias, todavía será mucho menos que antes.
Otros argumentan que las pruebas unitarias deben ser White Box, ya que no solo quieres asegurarte de que tu aplicación escribe en el DB en un lugar específico, debes asegurarte de que tu aplicación no escriba en el DB en ningún otro lado a menos que específicamente espero que lo haga. Si bien este es un punto válido, no creo que valga la pena el tiempo de escribir pruebas de White Box en lugar de las pruebas de Black Box.
Así que en conclusión, 2 preguntas:
¿Qué opinas sobre el concepto de caja Negro Unidad de Pruebas?
¿Qué opinas sobre la forma en que queremos implementar ese concepto? ¿Tienes mejores ideas?
"si cambia los detalles de implementación del método probado, también debe cambiar los detalles de implementación de las pruebas" No lo pensé de esa manera, gracias. – user1392027
"si cambia los detalles de implementación del método probado, entonces debería cambiar los detalles de implementación de las pruebas" - ¿eh? ¿Has oído hablar de TDD, donde dicen que no deberías escribir ningún código hasta que haya una prueba fallida? – driushkin
@driushkin: estamos hablando de una situación donde la prueba y el código ya están escritos. Para citar OP, * "tenga en cuenta que no cambiamos la lógica de las funciones, solo la implementación" * - este tipo de cambio ** ** dará como resultado la necesidad de cambiar las pruebas, lo más probable. –