Aggiunta di test di unità a un progetto C normale e legacy

11

Il titolo dice tutto. La mia azienda sta riutilizzando un progetto firmware legacy per un dispositivo microcontrollore, scritto completamente in chiaro C.

Ci sono parti che sono ovviamente sbagliate e che necessitano di modifiche e che provengono da uno sfondo C # / TDD Non mi piace l'idea di refactoring casuale senza prove per assicurarci che la funzionalità rimanga invariata. Inoltre, ho visto che è difficile trovare bug introdotti in molte occasioni attraverso minimi cambiamenti (che è qualcosa che credo sarebbe stato corretto se fosse stato usato il test di regressione). È necessario prestare molta attenzione per evitare questi errori: è difficile rintracciare un gruppo di globalità attorno al codice.

Per riassumere:

  • Come si aggiungono i test unitari al codice esistente strettamente accoppiato prima del refactoring?
  • Quali strumenti consigliate? (meno importante, ma comunque bello sapere)

Non sono direttamente coinvolto nella scrittura di questo codice (la mia responsabilità è un'app che interagirà con il dispositivo in vari modi), ma sarebbe male se venissero lasciati dei buoni principi di programmazione se ci fosse la possibilità che potessero essere usati .

    
posta Groo 25.08.2011 - 08:49
fonte

2 risposte

7

Prendi una copia di Lavorare efficacemente con il codice legacy di Michael Feathers. È pensato per affrontare situazioni del genere. Anche se si concentra maggiormente su linguaggi OO come C ++ e Java, credo che possa ancora aiutarti molto.

Sembra che parte di esso (o un articolo di bozza iniziale) sia disponibile gratuitamente qui .

    
risposta data 25.08.2011 - 10:12
fonte
7

Per le tecniche, probabilmente il Michael Feathers libro in La risposta di Péter Török sarà abbastanza completa. Se non vuoi andare al libro, ti suggerisco di seguire una procedura in tre fasi:

  1. esamina il codice non testabile e duplica piccole parti della funzionalità di quel codice in funzioni testabili. È importante che le nuove funzioni abbiano un comportamento che è ovviamente equivalente alla funzione che stai cercando di duplicare - non sto realmente sostenendo la scrittura di unit test attorno al codice legacy, quindi devi stare molto attento e limita il tuo ambito, al fine di mantenere la fiducia nel refactoring.
  2. scrivi test unitari attorno a quelle nuove funzioni.
  3. modifica il codice originale per chiamare le nuove funzioni.

Ripeti questa procedura alcune volte e dovresti scoprire che la qualità della base del codice precedente è aumentata in modo significativo.

Per quanto riguarda gli strumenti, si noti che C ++ può chiamare in C, quindi qualsiasi framework di test dell'unità C ++ può essere usato per testare il codice C. Ad esempio, stiamo utilizzando CPPUnit per eseguire un test unitario di un codice C nel nostro progetto.

    
risposta data 25.08.2011 - 13:05
fonte

Leggi altre domande sui tag