Se hai a che fare con grandi quantità di codice legacy che non è attualmente in fase di test, ottenere la copertura del test ora invece di aspettare un'ipotetica grande riscrittura in futuro è la mossa giusta. Iniziare scrivendo unit test non lo è.
Senza test automatizzati, dopo aver apportato modifiche al codice è necessario eseguire alcuni test manuali end-to-end dell'app per assicurarsi che funzioni. Inizia scrivendo test di integrazione di alto livello per sostituirlo. Se la tua app legge i file, li convalida, elabora i dati in qualche modo e visualizza i risultati desiderati per i test che catturano tutto ciò.
Idealmente, avrai i dati di un piano di test manuale o sarai in grado di ottenere un campione di dati di produzione effettivi da utilizzare. Altrimenti, poiché l'app è in produzione, nella maggior parte dei casi sta facendo quello che dovrebbe essere, quindi basta inventare dati che colpiranno tutti i punti alti e supporre che l'output sia corretto per ora. Non è peggio che assumere una piccola funzione, supporre che stia facendo quello che è il suo nome o qualsiasi commento suggerisca che dovrebbe fare, e scrivere test supponendo che funzioni correttamente.
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 volta che hai abbastanza di questi test di alto livello scritti per catturare il normale funzionamento delle app e i casi di errore più comuni la quantità di tempo che dovrai spendere martellando sulla tastiera per provare a catturare errori dal codice facendo qualcosa di diverso da ciò che pensavi che avrebbe dovuto scendere in modo significativo, rendendo molto più semplice il futuro refactoring (o anche una grande riscrittura).
Dato che sei in grado di espandere la copertura dei test unitari, puoi ridurre o addirittura ritirare la maggior parte dei test di integrazione. Se la tua app sta leggendo / scrivendo file o accedendo a un DB, testare quelle parti in modo isolato e deriderle o far iniziare i test creando le strutture dati lette dal file / database sono un punto ovvio da cui iniziare. In realtà la creazione di tale infrastruttura di test richiederà molto più tempo rispetto alla scrittura di una serie di test rapidi e sporchi; e ogni volta che esegui una serie di test di integrazione di 2 minuti invece di spendere 30 minuti per testare manualmente una frazione di ciò che i test di integrazione hanno coperto, stai già facendo una grande vittoria.