TL; DR
Scrivere buoni test utili è difficile e ha un costo elevato in C ++. Riesci a sviluppare sviluppatori che condividono la tua logica su cosa e quando testare?
Lunga storia
Ero solito fare uno sviluppo guidato dai test, in effetti tutto il mio team, ma per noi non ha funzionato bene. Abbiamo molti test, ma non sembrano mai coprire i casi in cui abbiamo veri e propri bug e regressioni - che di solito si verificano quando le unità interagiscono, non dal loro comportamento isolato.
Questo è spesso così difficile da testare a livello di unità che abbiamo smesso di fare TDD (ad eccezione dei componenti in cui accelera davvero lo sviluppo) e invece abbiamo investito più tempo per aumentare la copertura dei test di integrazione. Mentre i test sulle unità di piccole dimensioni non hanno mai individuato errori reali e sono stati sostanzialmente solo un sovraccarico di manutenzione, i test di integrazione hanno davvero valso la pena.
Ora ho ereditato un nuovo progetto e mi chiedo come procedere per testarlo. È un'applicazione nativa C ++ / OpenGL, quindi i test di integrazione non sono in realtà un'opzione. Ma i test unitari in C ++ sono un po 'più difficili che in Java (devi fare esplicitamente cose virtual
), e il programma non è fortemente orientato agli oggetti, quindi non riesco a deridere / nascondere alcune cose.
Non voglio fare a pezzi e OO-ize il tutto solo per scrivere alcuni test per il gusto di scrivere test. Quindi ti sto chiedendo: per cosa dovrei scrivere i test? per esempio:
- Funzioni / Classi che mi aspetto di cambiare frequentemente?
- Funzioni / Classi che sono più difficili da testare manualmente?
- Funzioni / Classi che sono già facili da testare?
Ho iniziato a studiare alcune basi di codice C ++ rispettose per vedere come vanno i test. In questo momento sto esaminando il codice sorgente di Chromium, ma sto trovando difficile estrarre la logica del test dal codice. Se qualcuno ha un buon esempio o post su come gli utenti C ++ popolari (ragazzi del comitato, autori di libri, Google, Facebook, Microsoft, ...) si avvicinano a questo, sarebbe molto utile.
Aggiornare
Mi sono cercato su questo sito e sul web da quando ho scritto questo. Ho trovato delle cose buone:
- Quando è appropriato non test unitario?
- /programming/109432/what-not-to-test-when-it-comes-to-unit-testing
- http://junit.sourceforge.net/doc/faq/faq.htm#best
Purtroppo, tutti questi sono piuttosto centrati su Java / C #. Scrivere molti test in Java / C # non è un grosso problema, quindi il vantaggio di solito supera i costi.
Ma come ho scritto sopra, è più difficile in C ++. Soprattutto se la tua base di codice non è così-OO, devi fare un sacco di cose per ottenere una buona copertura del test unitario. Ad esempio: l'applicazione che ho ereditato ha uno Graphics
spazio dei nomi che è un livello sottile sopra OpenGL. Per testare una qualsiasi delle entità - che usano tutte direttamente le sue funzioni - dovrei trasformarla in un'interfaccia e una classe e iniettarla in tutte le entità. Questo è solo un esempio.
Quindi, quando rispondi a questa domanda, tieni presente che devo fare un investimento piuttosto grande per scrivere test.