Sì, questo è un ottimo approccio quando si risolvono i bug in modalità manutenzione. In questo modo, puoi almeno dimostrare che il bug è stato corretto, e finire con un test di regressione "gratuito" - finché hai questo test, non dovrai mai correggere lo stesso bug due volte.
Scrivere un test adatto può tuttavia diventare piuttosto difficile quando il sistema non è stato progettato per la testabilità, ad es. se non è stata utilizzata l'iniezione di dipendenza. Ciò non rende necessariamente i test impossibili, li rende solo più costosi e più fragili. In questi casi, potrebbe essere utile eseguire un refactoring molto accurato per introdurre cuciture nel design in cui è possibile applicare i test.
In assenza di una suite di test completa, una buona documentazione e una buona conoscenza del dominio, è impossibile garantire che il tuo bugfix non rotti qualcos'altro. È bene essere consapevoli di questo rischio, ma non può essere mitigato. Dato che sei a conoscenza di questo rischio, proverai a limitare le correzioni dei bug alla più piccola area di codice possibile. Cercare di lasciare il codice migliore di quello che hai trovato è una nobile causa, ma è rischioso se non comprendi pienamente tutte le implicazioni di questo codice.
Idealmente, dovresti anche eseguire la versione fissa insieme alla versione interrotta per rilevare le modifiche nell'output o nel comportamento che non avevi intenzione, ma probabilmente non è fattibile per sistemi complessi.
Vale anche la pena sottolineare che i bug tendono a raggrupparsi. Se hai tempo, chiedi: perché è stato introdotto questo bug? Qual è la causa principale? Potrebbe aver causato problemi simili qui intorno?
Con una comprensione sufficiente, può essere meglio intraprendere un refactoring più completo di un modulo. Per esempio. una volta stavo sottoponendo a test una piccola funzione di analisi. La causa principale non era che l'algoritmo di analisi era difettoso, ma il modello di dati dell'output. Ora che ho capito come non rappresentare questo tipo di dati, potrei completamente riscrivere quella parte del codice ed eliminare un'intera classe di possibili problemi. Un'altra volta, si è scoperto che un modulo molto difettoso era presente solo per ragioni storiche e non era più utilizzato realmente. La sua eliminazione è stata molto più produttiva rispetto al tentativo di correggere ogni singolo problema.