- Sto parlando di unit test in senso TDD. (Non "integrazione" automatizzata, o come ti piace chiamarlo test.)
- Codice legacy come in: (C ++) codice senza test. (vedi: Michael Feathers ' lavora in modo efficace con il codice legacy )
- Ma anche il codice legacy come in: codice con cui il nostro team ha lavorato negli ultimi 10-5 anni, quindi molto spesso abbiamo una buona idea di dove mettere le cose per cambiare qualcosa.
- Disponiamo di test unitari (tramite Boost.Test) per alcuni moduli che sono arrivati in seguito o si sono adattati "in modo naturale" ai test unitari (contenitori specifici per app comuni, stringhe, aiutanti di rete, ecc.)
- Non disponiamo ancora di test di accettazione automatici adeguati.
Ora, recentemente ho avuto il "piacere" di implementare 3 nuove funzionalità rivolte all'utente.
Ognuno di questi mi ha richiesto circa 1-2 ore per aggiornarmi con le parti di codice che dovevo cambiare, 1-2 ore per implementare il (piccolo) codice che avevo bisogno di cambiare e altre 1-2 ore per assicurarmi che l'app corse correttamente dopo e fece come doveva fare.
Ora ho davvero aggiunto poco codice. (Penso che un metodo e alcune linee telefoniche per ogni funzione.)
La stesura di questo codice (tramite uno dei metodi suggeriti in WEwLC ), in modo che un test unitario avesse senso (e non fosse una tautologia completa) avrebbe richiesto facilmente altre 2-4 ore, se non di più. Ciò avrebbe aggiunto il 50% -100% di tempo a ciascuna funzionalità, senza alcun vantaggio immediato
- Non avevo bisogno del test unitario per capire qualcosa sul codice
- Il test manuale è lo stesso lavoro, poiché devo ancora verificare se il codice è integrato correttamente nel resto dell'app.
Concesso, se , in seguito, "qualcuno" è arrivato e ha toccato quel codice, teoricamente potrebbe trarre qualche beneficio da quel test unitario. (Solo teoricamente, poiché quell'isola testata di codice vivrebbe in un oceano di codice non testato.)
Quindi, "questa volta" ho scelto di non fare il duro lavoro di aggiungere un test unitario: le modifiche al codice per ottenere quelle cose sotto test sarebbero state significativamente più complesse delle modifiche al codice per ottenere la funzionalità correttamente (e pulita).
È qualcosa di tipico per il codice legacy fortemente accoppiato? Sono pigro / stabiliamo le priorità sbagliate come squadra? O sono prudente, testando solo cose in cui il sovraccarico non è troppo elevato?