Sto provando a praticare TDD, usandolo per sviluppare un semplice come Bit Vector. Mi capita di usare Swift, ma questa è una domanda indipendente dalla lingua.
My BitVectorè un file structche memorizza un singolo UInt64e presenta un'API su di esso che ti consente di trattarlo come una raccolta. I dettagli non contano molto, ma è piuttosto semplice. I 57 bit alti sono bit di memorizzazione e i 6 bit inferiori sono bit di "conteggio", che indicano quanti dei bit di memoria memorizzano effettivamente un valore contenuto.
Finora ho una manciata di funzionalità molto semplici:
- Un inizializzatore che costruisce vettori di bit vuoti
- Una
countproprietà di tipoInt - Una
isEmptyproprietà di tipoBool - Un operatore di uguaglianza (
==). NB: questo è un operatore di uguaglianza di valore simile a quelloObject.equals()di Java, non un operatore di uguaglianza di riferimento come==in Java.
Sto incontrando un sacco di dipendenze cicliche:
Il test unitario che verifica il mio inizializzatore deve verificare che il nuovo costruito
BitVector. Può farlo in uno dei 3 modi:- Dai un'occhiata
bv.count == 0 - Dai un'occhiata
bv.isEmpty == true - Controllalo
bv == knownEmptyBitVector
Il metodo 1 si basa
count, il metodo 2 si basaisEmpty( su cui si basacount, quindi non ha senso utilizzarlo), il metodo 3 si basa==. In ogni caso, non posso testare il mio inizializzatore da solo.- Dai un'occhiata
Il test
countdeve funzionare su qualcosa, che inevitabilmente mette alla prova i miei inizializzatoriL'attuazione di
isEmptysi basa sucountL'attuazione di
==si basa sucount.
Sono stato in grado di risolvere parzialmente questo problema introducendo un'API privata che costruisce un BitVectormodello di bit esistente (come aUInt64 ). Ciò mi ha permesso di inizializzare i valori senza testare altri inizializzatori, in modo da poter "fare il boot strap" verso l'alto.
Perché i miei test unitari siano davvero test unitari, mi ritrovo a fare un sacco di hack, il che complica notevolmente il mio prod e test code.
Come risolvi esattamente questo tipo di problemi?
BitVectorè una dimensione dell'unità perfettamente fine per i test unitari e risolve immediatamente i problemi di cui i membri pubblici hannoBitVectorbisogno l'uno per l'altro per effettuare test significativi.