Riscrivendo da zero solo per poter avere test automatici è sciocco - hai una base di codice che (soprattutto) funziona, e probabilmente puoi testarla (solo non automaticamente). Una riscrittura, anche con tutti i test nel mondo, comporta un rischio in più e richiede sempre più tempo del previsto. Quindi non farlo.
Anche scrivere test per ottenere una copertura del 100% in un colpo solo è sciocco, perché significa che si sta fermando lo sviluppo in corso per implementare qualcosa che non aggiunge ancora alcun valore. Nella maggior parte delle situazioni, questo è inaccettabile. Inoltre, scrivere test per il codice che funziona già e che non ha bisogno di cambiare ha poco beneficio se non verificare che funzioni davvero (ma se è in esecuzione in produzione, è meglio esserne già certi).
Il modo migliore per farlo, IMO, è aggiungere test man mano che procedi. Cioè, per ogni modifica che fai, applica i seguenti passaggi:
- Verifica se i test esistenti descrivono sufficientemente la funzionalità corrente.
- Se necessario, aggiungi test per acquisire la funzionalità corrente di quella particolare parte / modulo / classe / funzione / ... Verifica che superino.
- Rif. codice esistente se necessario.
- Modifica i test per riflettere il nuovo comportamento previsto.
- Modifica il codice per far passare i test.
- refactoring.
I passaggi da 4 a 6 sono solo TDD di base; l'unica aggiunta è che si aggiungono retroattivamente i test necessari prima di avviare il ciclo TDD effettivo.
Se segui questa procedura e i test che aggiungi nel passaggio 2 sono sufficienti, il codebase si sposterà gradualmente verso la copertura completa del test.
Naturalmente, se vuoi riscrivere comunque, per ragioni diverse, è probabile che iniziare subito a TDD dall'inizio sia una buona idea.