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 BitVectorest un structqui stocke un seul UInt64et 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
countpropriété de typeInt - Une
isEmptyproprié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
countbesoins de fonctionner sur quelque chose, qui teste inévitablement mes initialiseur (s)La mise en œuvre de
isEmptys'appuie surcountLa 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 à BitVectorpartir 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?
BitVectorest une taille d'unité parfaitement fine pour les tests unitaires et résout immédiatement vos problèmes dont les membres du public ontBitVectorbesoin les uns des autres pour effectuer des tests significatifs.