Doublures en folie
v1.0
CC BY-SA 3.0
Olivier Azeau
http://agilitateur.azeau.com/
Prologue
CODEUR lit le livre xUnit Test Patterns.
NARRATEUR
Codeur est contrarié. Il s'est toujours considéré comme un virtuose du développement logiciel mais quand ses collègues lui ont dit qu'ils voulaient désormais pratiquer le TDD, il n'a pas eu le choix. Tests, Rouge, Vert, Refactor... Il devait assimiler tous ces mots nouveaux et il fallait le faire vite. Il s'attaque alors à la lecture de xUnit Test Patterns par Gerard Meszaros mais la fatigue le gagne...
Scène 1 - un premier test
Dans le calme d'un environnement d'exécution au repos, TEST fait les cent pas.
CODEUR entre lentement dans cet endroit qu'il découvre à peine. SUT, CAPTEUR et CHRONO lui emboitent le pas.
SUT
Je me demande si on est au bon endroit
CODEUR
On verra bien. N'ayons pas peur. Avançons. Il parait que les environnements de test sont des endroits sûrs.
TEST
Bonjour ! Vous venez pour le TDD ?
CODEUR
Oui... Comment le savez-vous ?
TEST
Pourquoi quelle autre raison venir ici ?
Où est votre système à tester ?
CODEUR
Mon quoi ?
TEST
Un programme à concevoir en pratiquant le TDD.
Dans notre jargon, on parle de système à tester.
CODEUR
(se retournant vers SUT et le désignant)
Il est là !
SUT s'avance.
TEST
Viens ! N'aie pas peur !
(désignant le centre de la pièce)
Mets-toi là pour que tout le monde puisse te voir.
SUT s'exécute et vient se placer à l'endroit proposé.
CODEUR
Mais qui êtes-vous au juste ?
TEST
On m'appelle TEST, pour vous servir !
Quel est le but de votre programme ?
CODEUR
Il doit indiquer, sur la durée, la température ambiante maximale observée.
TEST
Et vous connaissez la température actuelle ?
CODEUR
Non, mais je peux me renseigner. J'ai un capteur de température.
(se tournant vers CAPTEUR)
Quelle est la température actuelle ?
CAPTEUR
22 degrés
CODEUR
(se retournant vers TEST)
22 degrés !
TEST
Bien ! Commençons par là.
(s'adressant à SUT)
Quelle est la température maximale observée ?
Etonné par la question, SUT ne sait pas quoi répondre.
A la manière d'un arbitre de football, TEST lui montre un carton rouge.
CODEUR
Eh ! Comme vous y allez ! Il n'a même pas encore été programmé !
TEST
Justement, c'est un bon début. En commençant par un test rouge, on détermine un but précis. Ce n'est pas une sanction mais une opportunité pour améliorer un programme.
Maintenant, on va le programmer le plus simplement possible pour avoir "22 degrés" comme réponse.
CODEUR
(s'adressant à SUT)
Quand il te demande "Quelle est la température maximale observée ?", tu lui réponds "22 degrés".
TEST
Quelle est la température maximale observée ?
SUT
22 degrés
TEST montre un carton vert à SUT
CODEUR
Et là on est bien avancé... On a un programme perroquet !
Scène 2 - avec un capteur
TEST
C'est un début ! Maintenant, essayons d'améliorer le test pour exprimer plus clairement l'intention.
Un test se compose habituellement de trois phases : "Arranger, Agir, Auditer".
"Agir", c'est quand je pose la question pour exécuter la partie du programme que l'on teste.
"Auditer", c'est quand je vérifie le résultat attendu.
CODEUR
Et il manque la phase "Arranger", au début. Celle où j'aurais dû mettre en place mon capteur de température si j'en avais eu le temps...
TEST
C'est un peu l'idée. Mais imaginons un instant que l'on veuille tester des conditions qui ne correspondent pas à ce qu'indique le capteur ?
Par exemple, disons que la température est de 18 degrés.
CODEUR
On va demander à quelqu'un d'allumer la climatisation ?
TEST
On va faire plus simple. Je connais quelqu'un qui peut nous aider.
(élevant la voix)
STUB, où es-tu ?
Bouchon ! Viens-ici !
STUB entre dans la pièce
STUB
Je suis là, mais cesse de m'appeler Bouchon. Je m'appelle Stub. Je fournis des entrées indirectes à un système à tester.
TEST
Quand on te demandera "Quelle est la température actuelle ?", tu répondras "18 degrés".
(s'adressant à SUT)
Quelle est la température maximale observée ?
SUT
22 degrés
TEST montre un carton rouge à SUT
CODEUR
Eh ! Voilà que ça recommence. Je n'ai même pas eu le temps de le programmer !
TEST
Si vous n'aviez pas vu le rouge, vous n'auriez même pas su qu'il y avait quelque chose à programmer !
CODEUR
(s'adressant à SUT et montrant STUB)
Tu vois ce capteur ? Quand quelqu'un te demande "Quelle est la température maximale observée ?", tu demandes au capteur "Quelle est la température actuelle ?". Le capteur te fournira une réponse et tu donneras cette réponse à celui qui t'a posé la question.
TEST
(s'adressant à SUT)
Quelle est la température maximale observée ?
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
18 degrés
SUT
(s'adressant à TEST)
18 degrés
TEST montre un carton vert à SUT
Scène 3 - avec un écran
CODEUR
Je dois admettre que cette pratique présente un certain intérêt. Et si, au lieu de donner directement la réponse, mon programme l'écrivait sur un écran, ça serait un peu plus compliqué à vérifier, non ?
TEST
Non. En fait c'est même plutôt simple. Je connais un espion qui peut nous aider sur ce coup là.
(élevant la voix)
SPY, tu peux venir nous aider ?
SPY entre dans la pièce
SPY
Bonjour la compagnie. Moi c'est SPY. J'enregistre les sorties indirectes d'un système à tester pour que le test puisse savoir ce qui s'est passé.
TEST
Arrête de frimer et montre nous plutôt ce que tu sais faire. Quand on te dit d'afficher une valeur, tu la mémorises et je te la demanderai.
(s'adressant à SUT)
Quelle est la température maximale observée ?
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
18 degrés
SUT
(s'adressant à TEST)
18 degrés
TEST
(s'adressant à SPY)
Quelle est la dernière valeur écrite ?
SPY
Rien n'a été écrit.
TEST montre un carton rouge à SUT
CODEUR
C'est bon, j'ai compris. Je vais changer mon programme.
(s'adressant à SUT et montrant SPY)
Quand le capteur te donne une réponse, tu demandes à cet écran de l'afficher et tu annonces que tu as fini.
TEST
(s'adressant à SUT)
Quelle est la température maximale observée ?
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
18 degrés
SUT
(s'adressant à SPY)
Affiche 18 degrés.
J'ai fini !
TEST
(s'adressant à SPY)
Quelle est la dernière valeur écrite ?
SPY
18 degrés.
TEST montre un carton vert à SUT
Scène 4 - Un début de logique
CODEUR
Maintenant, j'aimerais affiner la logique de mon programme. Pour que ce faux capteur, ce stub, renvoie plusieurs valeurs, il suffit de lui dire de faire ainsi ?
Par exemple, si on mesure 18 degrés la première fois et 25 degrés la fois suivante, le maximum observé devrait être 25 degrés.
TEST
Le plus simple, c'est bien souvent d'essayer. On ne risque rien.
(s'adressant à STUB)
Quand on te demandera "Quelle est la température actuelle ?", la première fois, tu réponds "18 degrés". Et quand on te le demande une seconde fois, tu réponds "25 degrés".
(s'adressant à SUT)
Quelle est la température maximale observée ?
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
18 degrés
SUT
(s'adressant à SPY)
Affiche 18 degrés.
J'ai fini !
TEST
(s'adressant à SPY)
Quelle est la dernière valeur écrite ?
SPY
18 degrés.
TEST montre un carton rouge à SUT
CODEUR
Et donc là je peux coder la logique de comparaison pour calculer le maximum. J'ai compris !
TEST
Pas si vite ! Il faut garder en tête que l'on ne doit faire que des modifications minimales au code : rien de plus que ce qui permet de faire passer le test au vert.
CODEUR
Ah... Cela demande réflexion...
(s'adressant à SUT)
Quand on te demanderas la température maximale observée,la séquence que tu sais déjà faire, celle où tu demandes la température et où tu l'affiches, il te faudra la dérouler, non pas une mais deux fois avant de signaler que tu as fini.
TEST
(s'adressant à SUT)
Quelle est la température maximale observée ?
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
18 degrés
SUT
(s'adressant à SPY)
Affiche 18 degrés.
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
25 degrés
SUT
(s'adressant à SPY)
Affiche 25 degrés.
J'ai fini !
TEST
(s'adressant à SPY)
Quelle est la dernière valeur écrite ?
SPY
25 degrés.
TEST montre un carton vert à SUT
Scène 5 - avec un chronomètre
CODEUR
C'est bizarre. Le test est vert mais, paradoxalement, je ne suis pas content du code actuel. Il ne me plait pas. Pourquoi répéter la séquence deux fois ? Pourquoi pas trois fois ? Ou même quatre ?
Je vais devoir tester avec tous les nombres entiers ? Ça risque de durer un petit moment...
TEST
Imaginons un instant que le programme quitte cet environnement de test pour aller dans son environnement réel, comment cela se passerait-il ?
CODEUR
Dans le monde réel, il y a ce chronomètre que j'ai apporté.
CODEUR désigne CHRONO qui est resté en retrait derrière lui depuis le début
TEST
A quoi sert-il ?
CODEUR
Il donne la cadence. En fait, le programme ne termine jamais mais il demande au chronomètre de le prévenir à intervalle régulier pour effectuer la mesure de température et tout ce qui suit.
TEST
Vous pouvez essayer de modifier le programme en y intégrant le chronomètre...
CODEUR
J'ai le droit de faire ça ? Je croyais qu'il me fallait avoir un test rouge avant de faire les modifications.
TEST
Il y a deux raisons qui permettent de modifier un programme. La première, c'est quand on veut étendre ses fonctionnalités. Il faut avoir un test rouge pour cela. C'est ce que l'on a fait jusqu'à présent.
L'autre raison, c'est quand les indicateurs sont au vert mais que la conception actuelle n'est pas satisfaisante. On peut alors remanier le programme à fonctionnalité constante.
CODEUR
Parfait, je vais donc rajouter mon chronomètre.
(s'adressant à CHRONO)
Va te placer là-bas, derrière le programme.
CHRONO va se placer derrière SUT
CODEUR
(s'adressant à SUT)
Quand on te demanderas la température maximale observée, tu exécutes la
séquence que tu sais déjà faire, celle où tu demandes la température et
où tu l'affiches.
Après avoir affiché, tu demanderas au chronomètre qui est derrière toi de te prévenir dans dix secondes.
Là, tu attends.
Dès que le chronomètre te prévient, tu recommences comme si on venait à nouveau de te demander la température maximale observée.
TEST
(s'adressant à SUT)
Quelle est la température maximale observée ?
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
18 degrés
SUT
(s'adressant à SPY)
Affiche 18 degrés.
(s'adressant à CHRONO)
Préviens-moi dans dix secondes !
CHRONO compte silencieusement jusqu'à dix dans une salle silencieuse.
CHRONO
Le temps est écoulé !
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
25 degrés
SUT
(s'adressant à SPY)
Affiche 25 degrés.
(s'adressant à CHRONO)
Préviens-moi dans dix secondes !
CHRONO se remet à compter silencieusement dans une salle à nouveau silencieuse.
Au bout de cinq secondes, CODEUR n'en peut plus et explose.
CODEUR
Stop ! On arrête ça !
Scène 6 - avec un faux chronomètre
CODEUR
Ca ne marchera pas ! Mon chronomètre ne vas jamais s'arrêter et on ne pourra rien tester.
En plus, on passe notre temps à attendre !
TEST
C'est bien de s'en rendre compte. Il y a des développeurs qui s'entêtent et continuent d'utiliser de vrais composants tiers pendant les tests.
CODEUR
Mais si on ne peut pas utiliser un vrai, que va-t-on utiliser ?
TEST
Facile : on va utiliser un faux !
D'ailleurs, il y en a un qui nous attend.
(s'adressant à FAKE)
FAKE, approche-toi. Viens prendre la place de ce chronomètre.
FAKE entre dans la pièce et pousse nonchalamment CHRONO sur le côté pour occuper sa place.
FAKE
Pousse-toi de là. Laisse la place aux doublures.
TEST
(s'adressant à FAKE)
FAKE, aujourd'hui, tu es un chronomètre.
Quand quelqu'un te demande de prévenir dans un certain nombre de secondes, tu lui réponds immédiatement que le temps est écoulé.
Et si on te le demande une deuxième fois, tu ne réponds pas mais tu t'adresses à moi pour me dire que c'est fini.
(s'adressant à SUT)
Quelle est la température maximale observée ?
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
18 degrés
SUT
(s'adressant à SPY)
Affiche 18 degrés.
(s'adressant à FAKE)
Préviens-moi dans dix secondes !
FAKE
Le temps est écoulé !
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
25 degrés
SUT
(s'adressant à SPY)
Affiche 25 degrés.
(s'adressant à FAKE)
Préviens-moi dans dix secondes !
FAKE
(s'adressant à TEST)
C'est fini !
TEST
(s'adressant à SPY)
Quelle est la dernière valeur écrite ?
SPY
25 degrés.
TEST montre un carton vert à SUT
Scène 7 - programme final
CODEUR
Ça fait plaisir. Mon programme commence à avoir une bonne tête et le test se déroule plus rapidement que ce que j'aurais pu imaginer.
On va essayer de terminer !
(s'adressant à TEST)
C'est la dernière ligne droite. On va mettre trois valeurs en entrée : 18 degrés, 25 degrés et 10 degrés. On va faire attendre notre faux chronomètre deux fois au lieu d'une et au final on devrait avoir un affichage qui indique 25 degrés.
TEST
(s'adressant à STUB)
Quand on te demandera "Quelle est la température actuelle ?", la première fois, tu réponds "18 degrés", la seconde fois, tu réponds "25 degrés", et la troisième fois, tu réponds "10 degrés".
(s'adressant à FAKE)
Quand quelqu'un te demande de le prévenir, tu lui réponds immédiatement que le temps est écoulé.
Si on te le demande une deuxième fois, idem.
Et si on te le demande une troisième fois, tu me dis que c'est fini.
(s'adressant à SUT)
Quelle est la température maximale observée ?
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
18 degrés
SUT
(s'adressant à SPY)
Affiche 18 degrés.
(s'adressant à FAKE)
Préviens-moi dans dix secondes !
FAKE
Le temps est écoulé !
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
25 degrés
SUT
(s'adressant à SPY)
Affiche 25 degrés.
(s'adressant à FAKE)
Préviens-moi dans dix secondes !
FAKE
Le temps est écoulé !
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
10 degrés
SUT
(s'adressant à SPY)
Affiche 10 degrés.
(s'adressant à FAKE)
Préviens-moi dans dix secondes !
FAKE
(s'adressant à TEST)
C'est fini !
TEST
(s'adressant à SPY)
Quelle est la dernière valeur écrite ?
SPY
10 degrés.
TEST montre un carton rouge à SUT
CODEUR
Allons-y !
(s'adressant à SUT)
Il va te falloir faire un truc en plus quand le capteur te donne une réponse.
Si c'est la première fois, tu mémorises cette valeur. Les fois suivantes, tu compares la réponse avec la valeur que tu as mémorisée et tu mémorises la plus grande des deux.
Dans les deux cas, tu affiches la valeur mémorisée.
TEST
(s'adressant à SUT)
Quelle est la température maximale observée ?
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
18 degrés
SUT
(s'adressant à SPY)
Affiche 18 degrés.
(s'adressant à FAKE)
Préviens-moi dans dix secondes !
FAKE
Le temps est écoulé !
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
25 degrés
SUT
(s'adressant à SPY)
Affiche 25 degrés.
(s'adressant à FAKE)
Préviens-moi dans dix secondes !
FAKE
Le temps est écoulé !
SUT
(s'adressant à STUB)
Quelle est la température actuelle ?
STUB
10 degrés
SUT
(s'adressant à SPY)
Affiche 25 degrés.
(s'adressant à FAKE)
Préviens-moi dans dix secondes !
FAKE
(s'adressant à TEST)
C'est fini !
TEST
(s'adressant à SPY)
Quelle est la dernière valeur écrite ?
SPY
25 degrés.
TEST montre un carton vert à SUT
CODEUR
Là, c'est tout bon. Je crois qu'on peut aller se coucher !
TOUS EN CHOEUR
CODEUR, Réveille-toi !