Ho un aneddoto pertinente da qualcosa che sta succedendo adesso per me. Sono su un progetto che non usa TDD. La nostra gente del QA ci sta muovendo in quella direzione, ma siamo un piccolo outfit ed è stato un processo lungo e articolato.
Comunque , di recente stavo usando una libreria di terze parti per svolgere un'attività specifica. C'era un problema riguardante l'uso di quella libreria, quindi è stato messo su di me per scrivere essenzialmente una versione di quella stessa libreria per conto mio. In totale, sono state circa 5.000 linee di codice eseguibile e circa 2 mesi del mio tempo. So che le linee di codice sono una metrica scadente, ma per questa risposta ritengo che sia un indicatore di magnitudine decente.
C'era una particolare struttura di dati di cui avevo bisogno che mi avrebbe permesso di tenere traccia di un numero arbitrario di bit. Dato che il progetto è in Java, ho scelto il BitSet
di Java e l'ho modificato un po '(avevo bisogno anche della capacità di tracciare il 0
s principale, che il BitSet di Java non fa per qualche motivo .....) . Dopo aver raggiunto il ~ 93% di copertura, ho iniziato a scrivere alcuni test che avrebbero messo in evidenza il sistema che avevo scritto. Avevo bisogno di confrontare alcuni aspetti della funzionalità per garantire che fossero abbastanza veloci per i miei requisiti finali. Non sorprende che una delle funzioni che avevo sovrascritto dall'interfaccia BitSet
fosse assurdamente lenta quando si trattava di insiemi di bit di grandi dimensioni (centinaia di milioni di bit in questo caso). Altre funzioni sovrascritte si basavano su questa funzione, quindi era un enorme collo di bottiglia.
Ciò che ho finito per fare è andare al tavolo da disegno e capire come manipolare la struttura sottostante di BitSet
, che è un long[]
. Ho progettato l'algoritmo, ho chiesto ai colleghi il loro contributo e poi ho iniziato a scrivere il codice. Quindi, ho eseguito i test unitari. Alcuni di loro si sono spezzati e quelli che mi hanno segnalato mi hanno indicato esattamente dove dovevo cercare il mio algoritmo per sistemarlo. Dopo aver corretto tutti gli errori dai test delle unità, sono stato in grado di dire che la funzione funziona come dovrebbe. Per lo meno, potrei essere sicuro che questo nuovo algoritmo funzionasse bene come il precedente algoritmo.
Naturalmente, questo non è a prova di proiettile. Se c'è un bug nel mio codice che i test unitari non controllano, allora non lo saprò. Ma naturalmente, lo stesso identico bug avrebbe potuto essere anche nel mio algoritmo più lento. Tuttavia , posso dire con un alto grado di sicurezza che non devo preoccuparmi dell'output sbagliato da quella particolare funzione. I test unitari preesistenti mi hanno consentito di risparmiare ore, forse giorni, per provare a testare il nuovo algoritmo per garantire che fosse corretto.
Quel è il punto di avere test unitari indipendentemente dal TDD - vale a dire, i test unitari lo faranno per te in TDD e al di fuori di TDD lo stesso, quando finisci con il refactoring / mantenere il codice. Naturalmente, questo dovrebbe essere associato a regolari test di regressione, test del fumo, test fuzzy, ecc., Ma il test unit , come afferma il nome, mette alla prova le cose sul più piccolo livello atomico possibile, che ti dà la direzione su dove sono spuntati errori.
Nel mio caso, senza i test unitari esistenti, in qualche modo dovrei trovare un metodo per garantire che l'algoritmo funzioni sempre. Che, alla fine ... suona molto simile a testing dell'unità , vero?