Ich versuche, TDD zu üben, indem ich es verwende, um einen einfachen Bit-Vektor zu entwickeln. Ich benutze Swift, aber das ist eine sprachunabhängige Frage.
My BitVector
ist ein struct
Speicherort für eine einzelne UInt64
Datei und bietet darüber eine API, mit der Sie sie wie eine Sammlung behandeln können. Die Details machen nicht viel aus, aber es ist ziemlich einfach. Die hohen 57 Bits sind Speicherbits und die unteren 6 Bits sind "Zählbits", die Ihnen mitteilen, wie viele der Speicherbits tatsächlich einen enthaltenen Wert speichern.
Bisher habe ich eine Handvoll sehr einfacher Fähigkeiten:
- Ein Initialisierer, der leere Bitvektoren erstellt
- Eine
count
Eigenschaft vom TypInt
- Eine
isEmpty
Eigenschaft vom TypBool
- Ein Gleichheitsoperator (
==
). NB: Dies ist einObject.equals()
in Java ähnlicher Wertegleichheitsoperator und kein Referenzgleichheitsoperator wie==
in Java.
Ich bin mit einer Reihe von zyklischen Abhängigkeiten konfrontiert:
Der Komponententest, der meinen Initialisierer testet, muss überprüfen, ob er neu erstellt wurde
BitVector
. Dies kann auf drei Arten geschehen:- Prüfen
bv.count == 0
- Prüfen
bv.isEmpty == true
- Prüfe das
bv == knownEmptyBitVector
Methode 1 stützt sich auf
count
Methode 2 stützt sich aufisEmpty
(die sich selbst stütztcount
, es macht also keinen Sinn, sie zu verwenden), Methode 3 stützt sich auf==
. In jedem Fall kann ich meinen Initialisierer nicht isoliert testen.- Prüfen
Der Test für
count
muss auf etwas funktionieren, was unweigerlich meine Initialisierer testetDie Umsetzung von
isEmpty
setzt aufcount
Die Umsetzung von
==
setzt aufcount
.
Ich konnte dieses Problem teilweise lösen, indem ich eine private API einführte, die BitVector
aus einem vorhandenen Bitmuster (als a UInt64
) ein erstellt. Dies ermöglichte es mir, Werte zu initialisieren, ohne andere Initialisierer zu testen, so dass ich meinen Weg nach oben "anschnallen" konnte.
Damit meine Komponententests wirklich Komponententests sind, mache ich eine Reihe von Hacks, die meinen Produkt- und Testcode erheblich komplizieren.
Wie genau gehen Sie mit solchen Problemen um?
BitVector
ist eine perfekte Größe für Unit-Tests und behebt sofort Ihre Probleme, die öffentliche MitgliederBitVector
gegenseitig benötigen, um aussagekräftige Tests durchzuführen.