2010-07-08 12 views
12

La situazione: milioni di righe di codice, oltre cento sviluppatori e frequenti difetti. Vogliamo evitare ripetendo i difetti e vogliamo migliorare la progettazione del codice (chi no?).Come si può implementare lo sviluppo basato su test con codice legacy?

Test Driven Development (prima unità test, quindi codice) sembra ideale: scrivere un test case per ciascuna funzione.

Ma, con così tanto codice scritto, come può essere implementato TDD? Da dove parti - con funzioni di basso livello?

Oppure siamo in ritardo per avviare TDD?

risposta

21

Inizia con Working Effectively with Legacy Code.

Non è proprio TDD se stai iniziando con il codice legacy - ma tutta la tua codifica può essere TDD. Mentre affronti un nuovo problema, scrivi un test per questo. Se non ci riesci, perché le classi legacy sono troppo difficili da testare, inizia a scrivere test per loro, tagliando i bit e coprendo i bit con i test.

Refactor the Low-Hanging Fruit.

Per evitare difetti di ripetizione: dato un esempio di difetto, scrivere un test che lo dimostri. Potrebbe essere un test relativamente ampio che simula solo l'attività dell'utente; non ancora un test unitario. Assicurati che il test fallisca. Fai la tua ricerca; capire perché il test sta fallendo. Ora - questo è importante - prima di correggere il bug, scrivi un test unitario che mostri il bug. Risolvi il bug e ora hai due test, almeno uno veloce, che ti protegge dalle regressioni.

+2

+1: la chiave qui è * non * provare e completare in modo completo i test di unità. – Richard

+1

@Carl - bel riassunto. Mi piace particolarmente il modo in cui hai un test unitario e un testo di sistema fuori dal difetto. – Wikis

+0

@Richard - Sono perplesso - non è il contrario di quello che sta dicendo Carl? – Wikis

2

Dal momento che Carl ha suggerito un libro ne suggerirò un altro: lo di Roy Osherove ha un intero capitolo su "Lavorare con codice legacy". Non ho ancora letto quel capitolo, ma i primi 5 capitoli sono eccellenti, e non vedo l'ora.

+0

FYI Mi è piaciuto il confronto tra le definizioni di Osherove per codice legacy: "codice sorgente che si riferisce alla tecnologia non più supportata" "qualsiasi applicazione precedente in manutenzione" "codice che funziona" "codice che non ha test" (dal libro di Feathers) – orbfish

+0

@Carl grazie per il collegamento C2, è esilarante. – orbfish

+0

@Orbfish - Grazie per il suggerimento. Forse quando lo avrai letto tornerai e condividerai alcuni approfondimenti? – Wikis