Si está lidiando con grandes cantidades de código heredado que no se está probando actualmente, obtener la cobertura de prueba ahora en lugar de esperar una reescritura hipotética en el futuro es el movimiento correcto. Comenzar escribiendo pruebas unitarias no lo es.
Sin pruebas automáticas, después de realizar cualquier cambio en el código, debe realizar algunas pruebas manuales de extremo a extremo de la aplicación para asegurarse de que funciona. Comience escribiendo pruebas de integración de alto nivel para reemplazar eso. Si su aplicación lee archivos, los valida, procesa los datos de alguna manera y muestra los resultados que desea pruebas que capturan todo eso.
Idealmente, tendrá datos de un plan de prueba manual o podrá obtener una muestra de datos de producción reales para usar. Si no es así, dado que la aplicación está en producción, en la mayoría de los casos está haciendo lo que debería ser, así que solo invente datos que lleguen a todos los puntos altos y suponga que la salida es correcta por ahora. No es peor que tomar una función pequeña, suponiendo que está haciendo lo que su nombre o cualquier comentario sugiere que debería estar haciendo, y escribir pruebas asumiendo que funciona correctamente.
IntegrationTestCase1()
{
var input = ReadDataFile("path\to\test\data\case1in.ext");
bool validInput = ValidateData(input);
Assert.IsTrue(validInput);
var processedData = ProcessData(input);
Assert.AreEqual(0, processedData.Errors.Count);
bool writeError = WriteFile(processedData, "temp\file.ext");
Assert.IsFalse(writeError);
bool filesAreEqual = CompareFiles("temp\file.ext", "path\to\test\data\case1out.ext");
Assert.IsTrue(filesAreEqual);
}
Una vez que tenga suficientes de estas pruebas de alto nivel escritas para capturar el funcionamiento normal de las aplicaciones y los casos de error más comunes, la cantidad de tiempo que necesitará para golpear el teclado para tratar de detectar errores del código haciendo algo diferente a lo que pensaste que se suponía que debía hacerlo, se reduciría significativamente, lo que facilitaría mucho la refactorización futura (o incluso una gran reescritura).
Como puede ampliar la cobertura de pruebas unitarias, puede reducir o incluso retirar la mayoría de las pruebas de integración. Si los archivos de lectura / escritura de su aplicación o el acceso a una base de datos, probar estas partes de forma aislada y burlarse de ellas o hacer que comiencen sus pruebas creando las estructuras de datos leídas del archivo / base de datos es un lugar obvio para comenzar. En realidad, crear esa infraestructura de prueba llevará mucho más tiempo que escribir un conjunto de pruebas rápidas y sucias; y cada vez que ejecuta un conjunto de pruebas de integración de 2 minutos en lugar de pasar 30 minutos probando manualmente una fracción de lo que cubren las pruebas de integración, ya está obteniendo una gran victoria.