Come affrontare il legacy code non testato

Come affrontare il legacy code non testato

Parliamo di come affrontare il legacy code e quali strumenti abbiamo in nostro aiuto.

Legacy code: l’approccio giusto con cui affrontarlo

Il legacy code è una parte di sistema o un pezzo di software in produzione sul quale abbiamo una bassa, o nulla, conoscenza. Succede che ci ritroviamo a dover modificare il codice sorgente senza conoscerne bene il comportamento, quindi rischiando di compromettere la funzionalità originaria. 

Per chi lavora nell’ambito dello sviluppo software purtroppo è un caso abbastanza comune e molto spesso si genera frustrazione quando dobbiamo affrontare un codice sconosciuto.
L’approccio a un lavoro del genere può essere impegnativo: potremmo trascorrere ore solo cercando di comprendere il pensiero dell’originale sviluppatore. Di recente, durante le sessioni di coaching tecnico di Tech Reloaded, abbiamo affrontato una situazione simile e vogliamo condividere con voi come abbiamo approcciato il lavoro insieme al team per apportare le modifiche richieste in sicurezza e migliorare la comprensione della codebase.

Refactoring per affrontare il legacy code

Nel caso di codice legacy particolarmente complesso e intricato, spesso riorganizzare la codebase è il primo passo per renderla più leggibile e manutenibile facilitando quindi l’apporto delle modifiche richieste.
In questo senso, uno degli approcci più efficaci è il refactoring.

Fare refactoring significa ristrutturare il codice esistente senza modificare il comportamento per l’utente.
Applicare della ristrutturazione al codice esistente solleva dei rischi, anche se si fa refactoring per rendere più robusto o manutenibile il codice. Quali garanzie abbiamo che le modifiche che stiamo portando non alterino il comportamento atteso? Se il codice ci è sconosciuto non sappiamo neanche quali risultati dobbiamo ottenere, quali logiche ci sono all’interno e quali casi particolari dobbiamo coprire.
Avventurarci in azioni di refactoring in questa situazione diventerebbe un rischio considerevole perché non avremmo nulla che ci garantisca che il nostro intervento non abbia rotto in qualche modo le funzionalità già presenti, e magari in produzione da diverso tempo.


Il primo passo sarà quindi mettere in esercizio il sistema e capirne il funzionamento. Una tecnica che ci viene in soccorso è quella di accompagnare il processo di refactoring con test automatici.

Una persone al pc affronta il legacy code tramite refactoring e test di caratterizzazione

Test di caratterizzazione per un refactoring sicuro

Come dicevamo, aggiungere test automatici ci aiuta a capire il comportamento esistente del codice. In particolare, quello che ci ha aiutato quando ci siamo trovati in questa situazione presso un cliente sono stati i test di caratterizzazione, o test Golden Master. 

I test di caratterizzazione mettono in esercizio il sistema esistente e ne esplorano il comportamento aumentando così la nostra conoscenza rispetto al legacy code sul quale stiamo lavorando. In questa tipologia di test non abbiamo un vero risultato da confrontare con qualcosa che ci aspettiamo, ma dobbiamo assumere che, qualunque sia il risultato ottenuto dal software legacy, sia quello correttoÈ importante sottolineare che per aumentare il livello di comprensione del sistema, occorre creare tanti test di caratterizzazione. Tramite tanti test di caratterizzazione con diversi input e immaginando quali casi particolari ci potrebbero essere, andiamo a descrivere come il sistema agisce in base alle diverse casistiche. 

Misurare la Code Coverage

Non conoscendo il funzionamento a priori è difficile dire quanti casi particolari e “rami” di logica siamo riusciti a coprire. Detto ciò, possiamo avere un’indicazione del livello di completezza dei nostri test di caratterizzazione se misuriamo la Code Coverage, ovvero la percentuale del nostro sistema legacy che è stato messo in esercizio dai nostri test di caratterizzazione. Per esempio, una code coverage del 50% significa che sono state eseguite il 50% righe di codice del nostro sistema legacy.
Pur non essendoci una soluzione “scientifica” a questo problema, si può assumere che più alta è la Code Coverage, maggiori saranno le probabilità di essere entrati in tutti i “rami” di logica esistenti e aver coperto tutti i casi particolari.

L’articolo è stato scritto in collaborazione con Tech Reloaded ed è estratto dalla puntata del Reloaded PodcastCode Legacy e test di caratterizzazione” con Stefano MarelloNel prossimo episodio Stefano racconterà di come crearsi una rete di protezione che ci abiliti a fare refactoring sicuro.

Di legacy code ne parliamo anche nella nostra pagina dei servizi dedicata al software di qualità.

Leggi altri articoli della stessa categoria: Pratiche e strumenti per team

O esplora altre categorie Organizzazione e strategia Pratiche e strumenti per team Prodotti e progetti agili