Antoine Grondin
écritsà proposrss···
← writing
February 9, 2013english·한국어·français

TDD : le chien et la clôture§

Antoine Grondin

Vous pensiez que Test Driven Development: By Example (Kent Beck) était un ouvrage canonique illustrant parfaitement comment appliquer le TDD à votre pratique du développement ? Détrompez-vous ! Aujourd'hui, je prétends avoir un meilleur exemple.

Hein ?§

Depuis samedi dernier, l'admin habituelle de the_house est en vacances. Elle se balade dans le Sud des États-Unis, à rôder sur les plages de Floride. Avant de s'envoler, elle m'a demandé de maintenir son projet et de m'assurer que tout tournait bien. Il n'y a pas grand-chose à faire, donc ce n'est pas vraiment un problème.

Ou du moins, c'est ce que je pensais !

the_house ne pouvait pas mieux choisir son moment pour planter : son admin est absente.

Le décor§

Il y a environ deux jours, une zone couvrant au moins le bloc /16 a commencé à accumuler beaucoup de déchets (certains voisins colocalisés appellent ça « snow »), sans moyen clair de les évacuer. Comme toute personne respectable le ferait, j'ai entrepris l'entreprise de sortir manuellement une bonne partie de cette cochonnerie de la mémoire principale et de la déplacer vers le swap devant the_house, à l'écart, laissant de la place à cars et pedestrians pour s'exécuter correctement.

Premier signe d'échec§

Pendant quelques heures, tout allait bien. Puis il y a deux jours, au matin, un signe prescient d'échec est apparu. L'admin colocalisé de another_house m'a envoyé un courriel, qu'il a assez bizarrement imprimé et estampé sur the_house.door (quel individu étrange). Apparemment, deux de nos dogs s'étaient échappés de notre réseau local.

À ce stade, vous vous demandez peut-être « qu'est-ce qu'ils foutent avec deux dogs ? ». Il se trouve que les utilisateurs de the_house apprécient la compagnie des dogs, alors ils en maintiennent deux à l'intérieur des frontières de leur localhost (ou du moins, c'est ce qu'ils croyaient !). Ils le font au mépris du bon sens, tout être humain respectable évitant doctement un tel emmerdiciel de peur qu'il n'encombre leur house de déchets en tous genres, ou même qu'il ne détruise des morceaux de the_house.

Donc même s'ils ont parfaitement le droit de mettre leur instance de the_house en danger comme ça, ils doivent s'assurer que les dogs ne peuvent pas s'échapper vers les systèmes voisins (et détruire leur environnement) !

Rien de tout cela ne s'est produit cette fois-là, mais deux dogs n'en ont pas moins traversé le pare-feu fence ce matin-là.

Au début, j'ai cru que c'était un paramètre mal réglé. Je suis allé faire le tour de fence et j'ai découvert une fuite bénigne causée par un paramètre. Je l'ai réparée avec un simple hack ; j'ai trouvé quelque part dans the_house.trash un bout de ferraille qui pouvait apparemment colmater la fuite.

Fastoche !

...me suis-je dit !

Ces vils dogs ne sortiront pas de sitôt !

Tu parles ! Mon manque d'humilité allait mettre un peu plus de 12 heures à me le faire payer, avec une bonne dose d'échec.

Erreur, erreur, erreur !§

Donc cet échec initial était peut-être un peu plus compliqué qu'un dotfile mal configuré. En me reconnectant à the_house ce soir-là, j'ai constaté que les deux dogs avaient disparu. Apparemment, ils s'étaient encore une fois enfuis. Allez savoir pourquoi, le plus proche voisin de notre bloc /24 a décidé de prendre la garde des dogs évadés en attendant que le mainteneur suppléant de the_house (c'est-à-dire moi) revienne.

Tiens, tiens, tiens, c'était plutôt étrange. La ferraille que j'avais mise devant la fuite avait disparu, et elle était introuvable aux alentours (je soupçonne les deux kids du house colocalisé d'avoir abusé de leurs droits sur fence et d'avoir délibérément dégagé la ferraille de devant la fuite afin d'exécuter leur insatiable programme play sur dogs).

En effet, le problème était plus gros que je ne le pensais. Il y avait un besoin de réparer ce fence, sans quoi the_house risquait d'être mis en péril sur ce serveur colocalisé, en faisant chier les co-utilisateurs de la machine.

À ce stade vous pourriez penser que la vie est en train de m'administrer une douloureuse injection de sagesse, directement dans le cerveau. Eh bien vous avez tort.

Mon cerveau est plus dur que l'acier§

Le lendemain matin (ce matin), en me réveillant et en me préparant à aller prendre une douche, je me surprends à croire négligemment que les dogs ne trouveront pas le passage par la fuite en seulement 15 minutes, le temps que je me douche avant d'aller les rentrer.

Et en effet, une fois de plus ils se sont enfuis. Ils se sont évadés en beauté, décidant cette fois de donner l'assaut aux voisins du bloc /16. Avec une dose respectable de honte, je me retrouve à pinger tous les coins de la zone, essayant de trouver où sont les dogs. Heureusement, ils ne sont pas allés trop loin et 15 minutes plus tard, je les ai ramenés à la maison.

Je les mets en idle derrière un réseau virtuel que nous appelons crate et je m'en vais pour la journée. En chemin, je remplis un rapport de bug pour the_house et le marque comme confirmé.

Enfin, le bon sens l'emporte§

TL;DR :§

Les chiens se sont échappés de la maison trois fois avant que je réalise (ou accepte) que la clôture avait un vrai problème. Au passage, j'ai mis mon TL;DR au milieu de ce satané texte, aussi inutile que possible. J'ai vu ça ailleurs et je me suis dit « voilà un endroit plutôt inutile où mettre un TL;DR ». Vous voilà servis vous aussi !

Quel chic type !

La vraie nature de la bête§

Il se trouve qu'une quantité massive de cochonnerie, dite snow, a fait monter la pression sur fence, qui cède désormais quand les dogs demandent à le traverser. En temps normal, fence devrait avoir assez de ressources pour tenir les dogs en respect. Cependant, ce snow supplémentaire a abaissé la barrière à l'entrée pour les dogs. En plus de ça, il y a ce trou béant dans fence, qui n'arrange rien.

J'ai vraiment besoin de réparer ce bug, une bonne fois pour toutes. Comment faire ? Comme n'importe quel réparateur vous le dira, la première étape consiste à définir un cas de test qui confirme la présence du bug.

Dans notre cas, ce dont nous avons besoin, c'est :

  • Une instance de dog, de préférence un chien débrouillard, motivé et hyperactif. Castez-le en un overexcited_dog.
Un chien regardant fixement l'objectif
Exemple de chien débrouillard, motivé et hyperactif
  • Un fence insuffisant, de préférence mal configuré (c'est-à-dire avec des « trous »).

Le test§

Quel genre de test pouvons-nous utiliser pour mettre en évidence les échecs de notre fence ? C'est assez simple et ça tient en trois étapes :

  1. Prenez l'overexcited_dog et placez-le derrière le fence.
  2. Passez de l'autre côté du fence avec un tableau de meat. L'overexcited_dog doit être conscient de la présence de meat dans le tableau.
  3. Secouez le tableau de meat jusqu'à ce que l'overexcited_dog soit upcasté en un way_too_excited_dog.

Le test échoue si way_too_excited_dog traverse le fence et mange le tableau de meat. Si le way_too_excited_dog ne parvient pas à passer, il sera downcasté en un whining_dog, qu'on reconnaît à son état de désespoir proche de la panique. Il est important que vous mettiez fin au test immédiatement quand le dog atteint cet état, parce que sinon, c'est bien trop cruel. Pour ce faire, donnez simplement une entrée de meat au dog et laissez-le rentrer dans the_house, et tout ira bien.

Rouge, vert, refactoriser§

Nous avons maintenant un test qui échoue. En effet, quand je le lance, j'obtiens invariablement un way_too_excited_dog, qui mange mon tableau de meat.

Je ne peux pas garder ce test rouge trop longtemps (je n'ai pas assez de viande !), alors il me faut trouver un correctif !

Première tentative§

Je fais le tour de the_house et je trouve une pelle en métal. Peut-être que si je creuse une tranchée autour de fence, mon overexcited_dog ne passera pas (malgré le trou) !

Je lance le test :

Rouge.

Wow ! Quel dommage !

Deuxième tentative§

Je prélève un morceau de fence qui couvrait un côté du mur de the_house, je le découpe du reste, puis je l'applique sur le trou du fence, le patchant de fait.

Je lance le test :

Rouge.

Quoi ? Encore ? En effet, le way_too_excited_dog est passé d'une manière inattendue : il a carrément sauté par-dessus le fence.

Malgré la tranchée et le trou patché, nous avons toujours un test rouge ! Grâce au TDD, je peux maintenant voir que la vraie nature de mon bug n'est pas seulement le trou dans le mur, mais la nature brute du fence !

Par chance, le test que j'ai conçu plus haut est parfaitement adapté à ce scénario (puisqu'il nous l'a fait entendre cinq sur cinq).

Je retourne à mes outils et j'observe le fence une fois de plus. Le way_too_excited_dog a réussi à le traverser en grimpant sur le fence qui ploie. Avec assez d'over_excitement, le dog utilise de fait le fence comme un ressort pour se propulser plus haut, bondissant vers le délicieux meat. J'attrape une planche de bois dans the_house.basement et je la sors pour l'appliquer sur le côté le plus bas du fence.

Je tends le fil du grillage à poules (ah oui, j'ai oublié de préciser que c'est un grillage à poules, hah !), je le fixe à la planche, puis je fais de même sur la seconde moitié du fence avec un bout de bois que je trouve dans les parages. Je parviens ainsi à redresser le fence.

Puis je lance mon test une fois de plus.

Vert !§

L'overexcited_dog se transforme rapidement en whining_dog. Ce fence (à poules) a eu raison de sa débrouillardise, de sa motivation et de son hyperactivité !

Refactoriser !§

Maintenant, voici l'état du fence :

Un grillage à poules affaissé, étayé par une planche et un bâton
Tu peux être une clôture si tu y crois très fort

C'est une clôture plutôt bancale si vous voulez mon avis. Bien que notre test pour the_house.fence soit vert, il nous reste des hacks vraiment dégueulasses. Nous ne pouvons pas laisser notre codebase dans cet état !

Malheureusement, fence est un chantier trop gros pour être entrepris avant la release Printemps. Le tout devra être reconstruit de zéro, en utilisant un vrai fence, correct cette fois. En attendant, nous devrons composer avec ce hack et garder un œil sur notre test — histoire de s'assurer qu'il reste vert !

tamuning - séoul