Per quanto riguarda la tua domanda iniziale, ciò che è "accettabile" è impossibile per noi rispondere. Tu stesso devi decidere quanta rielaborazione puoi fare mentre procedi ancora al ritmo richiesto del nuovo sviluppo. Tale è stato l'obiettivo dei project manager per decenni.
Indipendentemente dal sistema di sviluppo che stai utilizzando (cascata, UML, Rational Rose, Agile), sono assolutamente necessarie due cose:
- Il client deve aver comunicato a te esattamente ciò che il codice dovrebbe fare nel caso generale durante l'esecuzione di alcune attività. Questo non è impossibile come sembra; di solito il "caso generale" si divide in un "caso nominale", in un "caso eccezionale" e in un "caso di errore". Le situazioni per queste devono essere descritte e il comportamento previsto del sistema in queste situazioni definito.
- Dati i requisiti a un livello di specificità che copre tutti gli scenari previsti, il codice deve rispettare i requisiti. Per i casi nominali, eccezionali e di errore, il sistema dovrebbe funzionare come definito prima di essere rilasciato al cliente.
Considerate queste due cose accadute per ogni compito che il sistema è in grado di eseguire in tutte le situazioni note, avete fatto tutto ciò che è umanamente possibile per garantire un prodotto di qualità. Tuttavia, ci saranno ancora "difetti"; non è possibile garantire che il codice esegua come previsto al di fuori degli scenari noti, il che potrebbe aver inavvertitamente escluso alcuni possibili scenari. Non è colpa tua come sviluppatore; o tu come analista non hai pensato di chiedere cosa dovesse accadere in qualche caso particolare (probabilmente perché sembrava rientrare in una situazione definita), o il cliente non ha definito correttamente i requisiti in modo tale che tutto il possibile casi sono stati coperti. Succede tutte le volte. Ciò che accade come risultato di una prospettiva di business dipende dalla metodologia di progettazione e dal modello di business, ma voi come sviluppatori probabilmente estenderete il codice per coprire le situazioni mancate, e quindi verificherete che il sistema funzioni ancora in tutte le altre situazioni.
Questo è dove TDD brilla davvero; se accetti che la regressione delle funzionalità dovuta all'introduzione di difetti nel lavoro futuro sia possibile, allora naturalmente segue che avere un test sempre disponibile per dimostrare che il codice soddisferà i requisiti (e quindi che hai scritto ciò che pensavi di aver ha scritto) è un mezzo inestimabile per evitare la regressione.