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 BitVectorist ein structSpeicherort für eine einzelne UInt64Datei 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
countEigenschaft vom TypInt - Eine
isEmptyEigenschaft 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
countMethode 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
countmuss auf etwas funktionieren, was unweigerlich meine Initialisierer testetDie Umsetzung von
isEmptysetzt aufcountDie Umsetzung von
==setzt aufcount.
Ich konnte dieses Problem teilweise lösen, indem ich eine private API einführte, die BitVectoraus 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?
BitVectorist eine perfekte Größe für Unit-Tests und behebt sofort Ihre Probleme, die öffentliche MitgliederBitVectorgegenseitig benötigen, um aussagekräftige Tests durchzuführen.