Tengo una buena comprensión de las pruebas unitarias, DI, simulacros y todas las virtudes principales del diseño requeridas para tener una cobertura del código lo más humanamente posible (principal de responsabilidad única, piense 'cómo voy a probar esto' a medida que codigo, etc ...).diseño de aplicaciones de tamaño medio cuando se hace TDD?
Mi aplicación más reciente, no codifiqué haciendo true TDD. Mantuve las pruebas unitarias en mente cuando codifiqué, y escribí mis pruebas después de escribir el código, refactorizar, etc. Hice TDD cuando era "fácil" de hacer ... sin embargo no tenía tan buena comprensión como Ahora sí ... Ese fue el primer proyecto en el que hice uso completo de DI, frameworks de burla, etc., y el primero que tenía una cobertura completa de código, y aprendí mucho de él a medida que avanzaba. Estoy ansioso por ser asignado a mi próximo proyecto, así que puedo codificarlo completamente haciendo TDD desde cero.
Sé que esta es una pregunta amplia, y ya he ordenado TDD con el ejemplo y XP Unleashed, pero espero obtener una breve descripción de cómo todos ustedes diseñan/escriben una aplicación grande que hace TDD.
¿Escribes toda la aplicación, usando solo el código apagó? (por ejemplo, escriba todas las firmas de funciones, interfaces, estructuras y escriba la aplicación completa pero sin escribir ninguna implementación real)? Podría imaginarlo trabajando en tamaño pequeño-medio, ¿pero esto es posible incluso en aplicaciones grandes?
Si no, ¿cómo diablos escribiría su primera prueba de unidad para la función de nivel más alto en su sistema? Digamos, por ejemplo, en un servicio web en el que tiene una función llamada DoSomethingComplicated (param1, ..., param6) expuesta al mundo. Obviamente, escribir la prueba primero para una función simple como AddNumbers() es trivial, pero cuando la función está en la parte superior de la pila de llamadas como esta?
¿Todavía tiene diseño frontal? Obviamente, todavía desea hacer un diseño de 'arquitectura', por ejemplo, un diagrama de flujo que muestra IE hablando con IIS que habla con un servicio de Windows vía WCF que habla con la base de datos SQL ... un ERD que muestra todas sus tablas SQL y sus campos. etc ... pero ¿y el diseño de clase? Interacciones entre las clases, etc. ¿Diseñas esto por adelantado, o simplemente sigues escribiendo código de código auxiliar, refactorizando las interacciones a medida que avanzas, hasta que todo se conecta y parece que funcionará?
Cualquier consejo es muy apreciada
Gracias por la excelente y detallada respuesta. Suena muy parecido a cómo codifiqué mi última aplicación ... (excepto que "engañé" al escribir las pruebas primero en la mayoría de los lugares) Tal vez la transición de las pruebas unitarias a TDD realmente no cambia la forma en que diseño y trabajo tanto como yo Pensé ... Así que tengo que preguntar: ¿eres muy estricto con las pruebas primero? ¿Alguna vez encontró eso simplemente, es más fácil escribir el código antes de la prueba? Si es así, ¿qué tan común sucede esto? Y en cualquier patrón/situación específica? – dferraro
Soy muy estricto en lo que respecta a la prueba, ya que considero que la fase * Roja * de Red/Green/Refactor es muy importante. A menudo he escrito una prueba que resultó verde inmediatamente, a pesar de la intención opuesta. Esto significa que la prueba no prueba lo que pensé que estaba probando, por lo que debe ser reescrito. Esto me pasa a mí aproximadamente. una vez al día, pero esta protección no está disponible cuando usted escribe las pruebas después. Muy pocas veces aumente sin pruebas, pero cuando eso sucede, borro el código de spike cuando termino, y luego la implementación correcta de TDD en base a mi experiencia de spike. –