Pregunta

Me uní a un equipo que trabaja en un producto.Este producto existe desde hace aproximadamente 5 años y utiliza ASP.NET WebForms.Su arquitectura original se ha desvanecido con el tiempo y las cosas se han vuelto relativamente desorganizadas en toda la solución.De ninguna manera es terrible, pero definitivamente necesita algo de trabajo;Todos sabéis a qué me refiero.

He estado realizando algunas refactorizaciones desde que me uní al equipo del proyecto hace unos 6 meses.Algunas de esas refactorizaciones son simples: método de extracción, método de extracción, etc.Algunas de las refactorizaciones son más estructurales.Los últimos cambios me ponen nervioso ya que no existe un conjunto completo de pruebas unitarias que acompañen a cada componente.

Todo el equipo está de acuerdo con la necesidad de realizar cambios estructurales mediante la refactorización, pero nuestro gerente de proyecto ha expresado algunas preocupaciones de que no tenemos pruebas adecuadas para realizar refactorizaciones con la confianza de que no estamos introduciendo errores de regresión en el sistema.Le gustaría que primero escribiéramos más pruebas (contra la arquitectura existente) y luego realizáramos las refactorizaciones.Mi argumento es que la estructura de clases del sistema está demasiado estrechamente acoplada para escribir pruebas adecuadas, y que puede ser mejor utilizar un enfoque más basado en pruebas mientras realizamos nuestras refactorizaciones.Lo que quiero decir con esto no es escribir pruebas para los componentes existentes, sino escribir pruebas para requisitos funcionales específicos y luego refactorizar el código existente para cumplir con esos requisitos.Esto nos permitirá escribir pruebas que probablemente tendrán más longevidad en el sistema, en lugar de escribir un montón de pruebas "desechables".

¿Alguien tiene alguna experiencia sobre cuál es el mejor curso de acción?Tengo mis propios pensamientos, pero me gustaría escuchar algunas aportaciones de la comunidad.

¿Fue útil?

Solución

Las preocupaciones de su PM son válidas: asegúrese de probar su sistema antes de realizar cualquier refactorización importante.

Recomiendo encarecidamente obtener una copia del libro de Michael Feather. Trabajar eficazmente con código heredado (Por "Código heredado", Feathers se refiere a cualquier sistema que no esté adecuadamente cubierto por pruebas unitarias).Esto está repleto de buenas ideas sobre cómo descomponer esos acoplamientos y dependencias de los que habla, de una manera segura que no corra el riesgo de introducir errores de regresión.

Buena suerte con el programa de refactorización;En mi experiencia, es un proceso agradable y catártico del que se puede aprender mucho.

Otros consejos

¿Puedes refactorizar en paralelo?Lo que quiero decir es reescribir las piezas que desea refactorizar usando TDD, pero dejando el código base existente en su lugar.¿Entonces eliminar gradualmente el código existente cuando sus nuevas pruebas satisfagan las necesidades de su PM?

También me gustaría hacer una sugerencia para visitar el Refactorización sitio web de Martin Fowler.Literalmente escribió el libro sobre estas cosas.

En cuanto a introducir pruebas unitarias en la ecuación, el mejor método que he encontrado es encontrar un componente de nivel superior e identificar todas las dependencias externas que tiene en objetos concretos y reemplazarlas con interfaces.Una vez que haya hecho eso, será mucho más fácil escribir pruebas unitarias en su código base y podrá hacerlo un componente a la vez.Aún mejor, no tendrás que desechar ninguna prueba unitaria.

Las pruebas unitarias de ASP.Net pueden ser complicadas, pero existen muchos marcos que lo hacen más fácil. ASP.NetMVC, y WCSF para nombrar unos pocos.

Simplemente lanzo una segunda recomendación para Trabajar eficazmente con código heredado, un libro excelente que realmente me abrió los ojos al hecho de que casi cualquier código viejo, de mala calidad o que no se pueda comprobar se puede solucionar.

Totalmente de acuerdo con la respuesta de Ian Nelson.Además, comenzaría a implementar algunas pruebas de "alto nivel" (pruebas funcionales o de componentes) para preservar el comportamiento desde el punto de vista del usuario.Este punto podría ser la preocupación más importante para su primer ministro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top