2008-08-21 13 views
5

me he unido a un equipo que trabaja en un producto. Este producto ha existido durante ~ 5 años aproximadamente y utiliza ASP.NET WebForms. Su arquitectura original se ha desvanecido con el tiempo, y las cosas se han vuelto relativamente desorganizadas a lo largo de la solución. De ninguna manera es terrible, pero definitivamente puede usar un poco de trabajo; todos ustedes saben lo que quiero decirRefactoring para Comprobabilidad en un sistema existente

He estado realizando algunas refactorizaciones desde que llegué 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 hay un conjunto completo de pruebas unitarias para acompañar cada componente.

Todo el equipo está a cargo de la necesidad de realizar cambios estructurales a través de la refactorización, pero nuestro Gerente de Proyecto ha expresado algunas preocupaciones de que no tenemos las pruebas adecuadas para hacer refactorizaciones con la confianza de que no estamos presentando errores de regresión en el sistema. A él le gustaría que escribiéramos más pruebas primero (en contra de la arquitectura existente), luego realizamos las refactorizaciones. Mi argumento es que la estructura de clases del sistema está demasiado estrechamente unida a escribir pruebas adecuadas, y que el uso de un enfoque más Test Driven mientras realizamos nuestras refactorizaciones puede ser mejor. Lo que quiero decir con esto no es escribir pruebas en contra de los componentes existentes, pero escribir pruebas para los requisitos funcionales específicos, a continuación, refactorización código existente para satisfacer esas necesidades. Esto nos permitirá escribir pruebas que probablemente tendrán más longevidad en el sistema, en lugar de escribir un montón de pruebas de "descarte".

¿Alguien tiene alguna experiencia en cuanto a cuál es la mejor línea de conducta? Tengo mis propios pensamientos, pero me gustaría escuchar algunos comentarios de la comunidad.

Respuesta

5

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

Recomiendo encarecidamente obtener una copia del libro de Michael Feather Working Effectively With Legacy Code (por "código heredado" Plumas significa cualquier sistema que no esté adecuadamente cubierto por las pruebas unitarias). Esto está lleno de buenas ideas para romper esas conexiones y dependencias de las que habla, de una manera segura que no va a correr 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 desde el cual se puede aprender mucho.

2

¿Puede volver a factor en paralelo? Lo que quiero decir es volver a escribir las piezas que desea refactorizar utilizando TDD, pero deje la base de código existente en su lugar. ¿Luego, elimine el código existente cuando sus nuevas pruebas satisfagan las necesidades de su PM?

0

Sólo lanzando una segunda recomendación para trabajar eficazmente con el código heredado, un excelente libro que realmente me abrió los ojos al hecho de que casi cualquier código antiguo/chungo/untestable puede wrangled!

1

También me gustaría enviar una sugerencia para visitar el sitio web Refactoring de Martin Fowler. Literalmente escribió el libro sobre esto.

En cuanto a la introducción de 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 sobre objetos concretos y reemplazarlos con interfaces. Una vez que hayas hecho eso, será mucho más fácil escribir pruebas unitarias contra tu base de código y puedes hacerlo un componente a la vez. Aún mejor, no tendrás que descartar ninguna prueba unitaria.

Pruebas unitarias ASP.Net puede ser complicado, pero hay muchos marcos que hacen que sea más fácil hacerlo. ASP.Net MVC y WCSF para nombrar unos pocos.

0

Totalmente de acuerdo con la respuesta de Ian Nelson. Además, comenzaría a realizar 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 PM.

Cuestiones relacionadas