Tengo 200 000 líneas de código mal diseñado, ¿serán más valiosas las pruebas unitarias o las pruebas de integración? [duplicar]

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/206404

Pregunta

orte orte orte orte orte Esta pregunta ya tiene respuestas aquí : orte orte orte He heredado 200 000 líneas de código espagueti, ¿ahora qué? (19 respuestas) orte ¿Cuál es la forma más efectiva de agregar funcionalidad a un código desconocido y estructuralmente defectuoso? [duplicar] (7 respuestas) orteCerrado hace 7 años .\"2013-07-30 orte orte

He heredado mucho código mal diseñado;el código no tiene pruebas.Estoy implementando pruebas antes de intentar una refactorización importante, pero me encontré con un problema con mis pruebas unitarias.

El problema es que haré una prueba unitaria de una función y luego decidiré que la función es una responsabilidad.Me desharé de la función o cambiaré su propósito.De cualquier manera, la función original desaparece y las pruebas unitarias fallan.

¿Debo pasar mucho tiempo poniendo pruebas unitarias en un diseño que cambiaré drásticamente?¿No serán inútiles esas pruebas unitarias después de un rediseño importante?

¿Serían más valiosas las pruebas de integración?Puedo elegir características del programa que sé que no cambiarán y crear algunas pruebas de integración para asegurarme de que, de hecho, no cambien.Podría cambiar todo el código detrás de la función, pero la función aún debería funcionar y las pruebas de integración aún deberían pasar.

Sé que hay muchas preguntas sobre temas similares.Estoy preguntando específicamente sobre el uso y el valor de la prueba unitaria frente a las pruebas de integración en código heredado desordenado.

¿Fue útil?

Solución

Hay un libro increíble que cubre lo que estás haciendo en gran profundidad.Trabajar de manera efectiva con el código heredado describe una serie de técnicas para hacer exactamente lo que estás haciendo.La tabla de contenido está disponible en aquí. Me la habían recomendado durante años y la tomé recientemente.

Básicamente, sí, tienes razón.Pruebe la funcionalidad de la que dependerán los usuarios (o los componentes de consumo), asegurándose de que puede cubrir los casos extremos tanto como sea humanamente posible.Las pruebas unitarias (a través de TDD) serán útiles para el nuevo código que escribirá para reemplazar el código existente, mientras que las pruebas de integración que escribió para cubrir el código existente garantizarán que no esté rompiendo nada y que siga cumpliendo con sucontratos

Otros consejos

No se preocupe por el nombre de la prueba: concéntrese en el hecho de que el propósito de las pruebas es garantizar que cuando refactorice el código, siga haciendo lo mismo.

Por lo tanto, escribirá pruebas con dos propósitos:

    orte
  1. Para asegurarse de no romper la funcionalidad existente cuando refactoriza el código existente a algo más manejable.
  2. orte
  3. Para definir y probar la función del nuevo código que agregue.
  4. orte

En teoría, solo debería estar haciendo una u otra de las anteriores, aunque el desafío es que probablemente necesitará refactorizar el código para facilitar la adición de nuevas funciones y más, si realmente es heredado, para que sea comprobable en el primero.lugar (razón por la cual hay un énfasis en la refactorización y la adición de características como actividades distintas).

En cualquier caso, desea agregar pruebas a un propósito; es poco probable que esté refactorizando el código porque solo porque puede, tendrá objetivos que alcanzar y las pruebas que escriba (unidad, integración, lo que sea) deberían ser las necesariaspara apoyar el trabajo que te mueve hacia ese objetivo.

En este caso, creo que las pruebas de regresión/integración serían más útiles.Pero aún querrá crear pruebas unitarias mientras refactoriza.Además, tenga en cuenta que las pruebas unitarias son para probar lo que se supone que debe hacer una función, no lo que hace actualmente.Así que escribe tus pruebas como si el código fuera perfecto, luego refactoriza para que el código se ajuste a las pruebas.

orte

¿Debo pasar mucho tiempo poniendo pruebas unitarias en un diseño que cambiaré drásticamente?

orte

Esto es discutible.Si está cambiando el diseño drásticamente, podría recomendar simplemente dejar el código antiguo como está y escribirlo de nuevo.200kloc no es mucho en el gran esquema de las cosas.Si no está modificando el código anterior, la prueba unitaria probablemente no tenga valor.

Si lo está modificando de alguna manera, las pruebas unitarias (probablemente) le ahorrarán tiempo y esfuerzo.

orte

¿No serán inútiles esas pruebas unitarias después de un rediseño importante?

orte

Claro, pero durante el rediseño, son invaluables.

Licenciado bajo: CC-BY-SA con atribución
scroll top