El problema clave con el código heredado es que no tiene pruebas. Así que necesitas agregar algunos (y luego más ...).
Esto en sí mismo requeriría mucho trabajo, como anotó @mattnz. Pero el problema especial del código heredado es que nunca fue diseñado para ser comprobable . Así que, por lo general, es un gran desorden de espaguetis en código, donde es muy difícil o completamente imposible aislar partes pequeñas para probarlas en la unidad. Por lo tanto, antes de la prueba de unidad, debe refactorizar el código para hacerlo más comprobable.
Sin embargo, para refactorizar de forma segura, debes realizar pruebas de unidad para verificar que no has roto nada con tus cambios ... Esta es la captura 22 del código heredado.
El libro te enseña cómo salir de esta captura haciendo los cambios mínimos y más seguros al código para habilitar las primeras pruebas unitarias. No están diseñados para hacer que el diseño sea más agradable, solo para habilitar pruebas unitarias. De hecho, a veces hacen que el diseño sea más feo o más complejo. Sin embargo, le permiten escribir pruebas, y una vez que haya implementado las pruebas unitarias, tiene la libertad de mejorar el diseño.
Hay muchos trucos para hacer que el código sea verificable: algunos son obvios y otros no. Hay métodos que nunca hubiera pensado en mí mismo, sin haber leído el libro. Pero lo que es aún más importante es que Feathers explica qué hace que una unidad de código sea verificable. Debe cortar las dependencias e introducir barreras en su código, pero por dos razones distintas:
-
detección : para verificar y verificar los efectos de ejecutar un código, y
-
separación : para obtener el código específico en un arnés de prueba en primer lugar.
Cortar dependencias de forma segura puede ser complicado. La introducción de interfaces, simulacros y inyección de dependencia es limpia y agradable como objetivo, pero no necesariamente segura en este momento. Así que a veces tenemos que recurrir a la subclase de la clase bajo prueba para anular algún método que normalmente, por ejemplo. iniciar una solicitud directa a un DB. Otras veces, incluso podríamos necesitar reemplazar una clase de dependencia / jar por una falsa en el entorno de prueba ...
Para mí, el concepto más importante introducido por Feathers es costuras . Una costura es un lugar en el código donde puedes cambiar el comportamiento de tu programa sin modificar el código en sí mismo . La creación de uniones en su código permite separar el fragmento de código bajo prueba, pero también le permite detectar el comportamiento del código bajo prueba, incluso cuando es difícil o imposible hacerlo directamente (por ejemplo, porque la llamada realiza cambios en otro objeto o subsistema, cuyo estado no es posible consultar directamente desde el método de prueba).
Este conocimiento le permite observar las semillas de la capacidad de prueba en el montón de código más desagradable y encontrar los cambios mínimos, menos perturbadores y más seguros para llegar allí. En otras palabras, para evitar hacer refacciones "obvias" que tengan el riesgo de romper el código sin que te des cuenta, porque aún no tienes las pruebas unitarias para detectar eso.