No falta ningún principio, pero es un problema común. Creo que cada equipo lo resuelve (o no) a su manera.
Efectos secundarios
Usted seguirá teniendo este problema con cualquier función que tiene efectos secundarios. Me he encontrado para funciones de efectos secundarios que tienen que hacer las pruebas que aseguran algunos o todos de los siguientes:
- Que fue/no fue llamado
- El número de veces que se llamó
- ¿Qué argumentos eran pasado a él
- Orden de las llamadas.
Asegurar esto en la prueba generalmente significa violar la encapsulación (yo interactúo y sé con la implementación). Cada vez que haga esto, siempre vinculará implícitamente la prueba a la implementación. Esto hará que tenga que actualizar la prueba cada vez que actualice las porciones de implementación que está exponiendo/probando.
reutilizable Mocks
He usado burla reutilizables con gran efecto. El intercambio es su implementación más compleja porque necesita ser más completa. Usted mitiga el costo de actualización de pruebas para acomodar refactores.
Aceptación TDD
Otra opción es cambiar lo que su prueba para. Dado que esto se trata realmente de cambiar su estrategia de prueba, no es algo para entrar a la ligera. Es posible que desee hacer un pequeño análisis primero y ver si realmente sería adecuado para su situación.
Solía hacer TDD con pruebas unitarias. Me encontré con un problema que sentí que no debería haber tenido que enfrentar. Específicamente alrededor de los refactores noté que generalmente teníamos que actualizar muchas pruebas. Estos refactores no estaban dentro de una unidad de código, sino más bien la reestructuración de los componentes principales. Sé que mucha gente dirá que el problema fueron los grandes cambios frecuentes, no las pruebas unitarias. Probablemente hay algo de verdad en los grandes cambios que son parcialmente el resultado de nuestra planificación/arquitectura. Sin embargo, también influyeron las decisiones comerciales que causaron cambios en las direcciones. Estas y otras causas legítimas tuvieron el efecto de necesitar grandes cambios en el código. El resultado final fue que los refactores grandes se volvieron más lentos y dolorosos como resultado de todas las actualizaciones de prueba.
También tropezamos con errores debido a problemas de integración que las pruebas unitarias no cubrían. Hicimos algunas pruebas de aceptación manual. De hecho, hicimos bastante trabajo para que las pruebas de aceptación fueran lo más sencillas posibles. Seguían siendo manuales, y sentimos que había tantas diferencias entre las pruebas unitarias y la prueba de aceptación que debería haber una manera de mitigar el costo de implementar ambas.
Luego la empresa tuvo despidos. De repente, no teníamos la misma cantidad de recursos para invertir en programación y mantenimiento. Nos obligaron a obtener el mayor rendimiento por todo lo que hicimos, incluidas las pruebas. Comenzamos agregando lo que llamamos pruebas de pila parcial para cubrir los problemas de integración comunes que teníamos. Resultó ser tan efectivo que comenzamos a hacer menos pruebas unitarias clásicas. También nos deshicimos de las pruebas de aceptación manual (Selenium). Lentamente avanzamos hacia donde las pruebas comenzaron a probarse hasta que esencialmente estábamos haciendo pruebas de aceptación, pero sin el navegador. Simulamos un método GET, POST o PUT para un controlador en particular y verificamos los criterios de aceptación.
- La base de datos se actualiza correctamente
- El código de estado HTTP correcto se volvió
- Una página fue devuelto que:
- fue Valid HTML 4.01 estricto
- contenía la información que queríamos para enviar volver al usuario
Terminamos teniendo menos errores. Específicamente, casi todos los errores de integración y errores debido a refactores grandes desaparecieron casi por completo.
Hubo compensaciones. Resultó que los profesionales superan con creces los inconvenientes de la situación. Contras:
- La prueba fue generalmente más complicada, y casi todo el mundo prueba algunos efectos secundarios.
- Podemos decir cuando algo se rompe, pero no es tan específico como las pruebas de la unidad, por lo que tenemos que hacer más depuraciones para rastrear dónde está el problema.
Siempre que necesite burlarse de algo, primero piense si puede crear burlas a mano. A menudo encontrará que la simulación sobre la marcha suele dar un olor de complejidad manifiesta. Si ese es el caso, cree simulacros manuales, vaya a los simulacros sobre la marcha –
Algo a considerar: http://en.wikipedia.org/wiki/Interface_segregation_principle – TrueWill