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 struct
che memorizza un singolo UInt64
e 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
count
proprietà di tipoInt
- Una
isEmpty
proprietà 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
count
deve funzionare su qualcosa, che inevitabilmente mette alla prova i miei inizializzatoriL'attuazione di
isEmpty
si basa sucount
L'attuazione di
==
si basa sucount
.
Sono stato in grado di risolvere parzialmente questo problema introducendo un'API privata che costruisce un BitVector
modello 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 hannoBitVector
bisogno l'uno per l'altro per effettuare test significativi.