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 !