J'essaie de pratiquer le TDD, en l'utilisant pour développer un simple comme Bit Vector. Il se trouve que j'utilise Swift, mais c'est une question indépendante de la langue.
My BitVector
est un struct
qui stocke un seul UInt64
et présente une API qui vous permet de le traiter comme une collection. Les détails importent peu, mais c'est assez simple. Les 57 bits supérieurs sont des bits de stockage et les 6 bits inférieurs sont des bits de "comptage", qui vous indiquent combien de bits de stockage stockent réellement une valeur contenue.
Jusqu'à présent, j'ai une poignée de capacités très simples:
- Un initialiseur qui construit des vecteurs de bits vides
- Une
count
propriété de typeInt
- Une
isEmpty
propriété de typeBool
- Un opérateur d'égalité (
==
). NB: il s'agit d'un opérateur d'égalité de valeurs semblable àObject.equals()
Java, pas d'un opérateur d'égalité de référence comme==
en Java.
Je rencontre un tas de dépendances cycliques:
Le test unitaire qui teste mon initialiseur doit vérifier que le nouveau modèle a été construit
BitVector
. Il peut le faire de trois manières:- Vérifier
bv.count == 0
- Vérifier
bv.isEmpty == true
- Regarde ça
bv == knownEmptyBitVector
La méthode 1 s'appuie sur
count
, la méthode 2 s'appuie surisEmpty
(qui elle-même s'appuiecount
, il n'y a donc aucun intérêt à l'utiliser), la méthode 3 s'appuie sur==
. En tout cas, je ne peux pas tester mon initialiseur isolément.- Vérifier
Le test pour les
count
besoins de fonctionner sur quelque chose, qui teste inévitablement mes initialiseur (s)La mise en œuvre de
isEmpty
s'appuie surcount
La mise en œuvre de
==
s'appuie surcount
.
J'ai pu résoudre en partie ce problème en introduisant une API privée qui construit un à BitVector
partir d'un modèle binaire existant (en tant que UInt64
). Cela m'a permis d'initialiser les valeurs sans tester les autres initialiseurs, afin de pouvoir "booter" en montant.
Pour que mes tests unitaires soient vraiment des tests unitaires, je me retrouve à faire un tas de hacks, ce qui complique considérablement ma prod et mon code de test.
Comment contournez-vous exactement ce genre de problèmes?
BitVector
est une taille d'unité parfaitement fine pour les tests unitaires et résout immédiatement vos problèmes dont les membres du public ontBitVector
besoin les uns des autres pour effectuer des tests significatifs.