9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
1/24
9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
2/24
9/6/2014
Doublures en folie
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) http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
3/24
9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
4/24
9/6/2014
Doublures en folie
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) http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
5/24
9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
6/24
9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
7/24
9/6/2014
Doublures en folie
(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 ? http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
8/24
9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
9/24
9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
10/24
9/6/2014
Doublures en folie
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. http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
11/24
9/6/2014
Doublures en folie
(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 ? http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
12/24
9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
13/24
9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
14/24
9/6/2014
Doublures en folie
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. http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
15/24
9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
16/24
9/6/2014
Doublures en folie
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) http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
17/24
9/6/2014
Doublures en folie
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. http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
18/24
9/6/2014
Doublures en folie
(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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
19/24
9/6/2014
Doublures en folie
(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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
20/24
9/6/2014
Doublures en folie
(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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
21/24
9/6/2014
Doublures en folie
(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) http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
22/24
9/6/2014
Doublures en folie
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 http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
23/24
9/6/2014
Doublures en folie
CODEUR, RĂŠveille-toi !
http://agilitateur.azeau.com/public/doublures-en-folie/doublures-en-folie.v1.html
24/24