He introducido pruebas unitarias para codificar bases que no lo tenían anteriormente. El último gran proyecto en el que estuve involucrado fue cuando el producto ya estaba en producción con pruebas de unidad cero cuando llegué al equipo. Cuando me fui, 2 años después, tuvimos más de 4500 pruebas que arrojaron aproximadamente un 33% de cobertura de código en una base de código con más de 230 000 LOC de producción (aplicación Win-Forms financiera en tiempo real). Eso puede sonar bajo, pero el resultado fue una mejora significativa en la calidad del código y la tasa de defectos, además de una mejor moral y rentabilidad.
Se puede hacer cuando se tiene un entendimiento preciso y un compromiso de las partes involucradas.
En primer lugar, es importante comprender que las pruebas unitarias son una habilidad en sí mismas. Puede ser un programador muy productivo según los estándares "convencionales" y aún así tener dificultades para escribir pruebas unitarias de una manera que se amplíe en un proyecto más grande.
Además, y específicamente para su situación, agregar pruebas unitarias a una base de código existente que no tiene pruebas también es una habilidad especializada en sí misma. A menos que usted o alguien en su equipo tenga experiencia exitosa con la introducción de pruebas unitarias a una base de código existente, diría que lee el libro de Feather es un requisito (no opcional ni muy recomendable).
Hacer la transición a la prueba unitaria de su código es una inversión en personas y habilidades tanto como en la calidad de la base del código. Comprender esto es muy importante en términos de mentalidad y gestión de expectativas.
Ahora, para sus comentarios y preguntas:
Sin embargo, me preocupa que termine perdiendo el panorama general y las pruebas fundamentales que se habrían incluido si hubiera usado TDD desde el principio.
Respuesta corta: Sí, perderá las pruebas y sí, es posible que inicialmente no se vean como lo tendrían en una situación de campo verde.
La respuesta a nivel más profundo es esta: no importa. Comienzas sin pruebas. Comience a agregar pruebas y refactorice a medida que avanza. A medida que los niveles de habilidad mejoren, comience a subir el listón para todo el código recién escrito agregado a su proyecto. Sigue mejorando, etc.
Ahora, leyendo entre líneas aquí, tengo la impresión de que esto proviene de la mentalidad de "la perfección como una excusa para no tomar medidas". Una mejor mentalidad es centrarse en la autoconfianza. Entonces, como es posible que aún no sepa cómo hacerlo, descubrirá cómo hacerlo y completará los espacios en blanco. Por lo tanto, no hay razón para preocuparse.
De nuevo, es una habilidad. No puede pasar de cero pruebas a TDD-perfección en un enfoque de "proceso" o "paso a paso" de libro de cocina de forma lineal. Será un proceso Sus expectativas deben ser hacer progresos y mejoras graduales e incrementales. No hay una pastilla magica.
La buena noticia es que a medida que pasan los meses (e incluso años), su código gradualmente comenzará a convertirse en un código "adecuado", bien factorizado y probado.
Como nota al margen. Encontrará que el obstáculo principal para introducir pruebas unitarias en una base de código antigua es la falta de cohesión y las dependencias excesivas. Por lo tanto, probablemente encontrará que la habilidad más importante será cómo romper las dependencias existentes y desacoplar el código, en lugar de escribir las pruebas unitarias reales.
¿Hay algún proceso / paso que deba cumplirse para garantizar que las soluciones existentes se prueben adecuadamente en la unidad y no solo se integren?
A menos que ya lo tenga, configure un servidor de compilación y configure una compilación de integración continua que se ejecute en cada registro, incluidas todas las pruebas unitarias con cobertura de código.
Entrena a tu gente.
Comience en algún lugar y comience a agregar pruebas mientras progresa desde la perspectiva del cliente (ver más abajo).
Use la cobertura de código como referencia guía de la cantidad de código base de producción que se está probando.
El tiempo de construcción siempre debe ser RÁPIDO. Si su tiempo de construcción es lento, sus habilidades de prueba de unidad están rezagadas. Encuentra las pruebas lentas y mejóralas (desacopla el código de producción y prueba de forma aislada). Bien escrito, debería poder realizar varios miles de pruebas unitarias y aún así completar una compilación en menos de 10 minutos (~ 1 ms / prueba es una guía buena pero muy aproximada, pueden aplicarse algunas excepciones como código usando la reflexión, etc. )
Inspeccionar y adaptar.
¿Cómo puedo asegurarme de que las pruebas son de buena calidad y no son solo el caso de que cualquier prueba sea mejor que ninguna prueba?
Su propio juicio debe ser su fuente principal de realidad. No hay métrica que pueda reemplazar la habilidad.
Si no tiene esa experiencia o juicio, considere contratar a alguien que sí.
Dos indicadores secundarios aproximados son la cobertura total del código y la velocidad de construcción.
¿Vale la pena el esfuerzo para una solución existente que está en producción?
Si. La gran mayoría del dinero gastado en un sistema o solución personalizada se gasta después de su puesta en producción. E invertir en calidad, las personas y las habilidades nunca deberían estar fuera de moda.
¿Sería mejor ignorar las pruebas para este proyecto y agregarlo en una posible reescritura futura?
Debería tener en cuenta, no solo la inversión en personas y habilidades, sino lo más importante, el costo total de propiedad y el tiempo de vida esperado del sistema.
Mi respuesta personal sería "sí, por supuesto" en la mayoría de los casos porque sé que es mucho mejor, pero reconozco que puede haber excepciones.
Lo que será más beneficioso; pasar algunas semanas agregando pruebas o algunas semanas agregando funcionalidad?
Ninguno. Su enfoque debe ser agregar pruebas a su base de código MIENTRAS está progresando en términos de funcionalidad.
Una vez más, es una inversión en personas, habilidades y la calidad de la base del código y, como tal, requerirá tiempo. Los miembros del equipo deben aprender cómo romper dependencias, escribir pruebas unitarias, aprender nuevos hábitos, mejorar la disciplina y la conciencia de calidad, cómo diseñar mejor el software, etc. Es importante entender que cuando empiezas a agregar pruebas, los miembros de tu equipo probablemente no tiene estas habilidades aún en el nivel que necesitan para que ese enfoque tenga éxito, por lo que detener el progreso para pasar todo el tiempo para agregar muchas pruebas simplemente no funcionará.
Además, agregar pruebas unitarias a una base de código existente de cualquier tamaño de proyecto considerable es una tarea GRANDE que requiere compromiso y persistencia. No puede cambiar algo fundamental, espere mucho aprendizaje en el camino y pídale a su patrocinador que no espere ningún retorno de la inversión al detener el flujo del valor comercial. Eso no volará, y francamente no debería.
En tercer lugar, desea inculcar valores sólidos de enfoque comercial en su equipo. La calidad nunca llega a expensas del cliente y no puedes ir rápido sin la calidad. Además, el cliente está viviendo en un mundo cambiante, y su trabajo es facilitarle la adaptación. La alineación del cliente requiere calidad y el flujo del valor comercial.
Lo que está haciendo es pagar la deuda técnica. Y lo está haciendo al mismo tiempo que atiende a sus clientes en constante cambio de necesidades. Gradualmente, a medida que se paga la deuda, la situación mejora y es más fácil servir mejor al cliente y ofrecer más valor. Etc. Este impulso positivo es lo que debe aspirar porque subraya los principios del ritmo sostenible y mantendrá y mejorará la moral, tanto para su equipo de desarrollo, su cliente y sus partes interesadas.
Espero que ayude