Le texte fondateur du TDD par Kent Beck : le test d'abord, le code ensuite, la peur en moins.
Pourquoi ce livre
Le TDD, tout le monde en parle et presque personne ne sait d'où ça vient. Ça vient d'ici. Kent Beck, l'inventeur de l'Extreme Programming et co-auteur de JUnit, pose en 2002 la discipline en un livre court et bizarre : il ne vous explique pas le TDD, il code devant vous, ligne par ligne, en montrant chaque erreur et chaque retour en arrière. On lit par-dessus son épaule.
La plupart des livres sur les tests donnent une liste de bonnes pratiques. Beck, lui, montre la méthode en train de se faire, sur deux cas réels : d'abord une petite classe qui gère de l'argent en plusieurs devises, puis un framework de test qu'il développe en s'en servant pour se tester lui-même. Sous la mécanique des tests, il pose une idée que ses imitateurs ont presque tous oubliée : programmer, c'est d'abord gérer sa peur de casser le code. C'est elle, bien plus que le cycle rouge/vert/refactor, qui explique pourquoi le livre tient encore vingt ans plus tard.
Les idées qui restent
Le livre fait 240 pages en trois parties. Voilà ce qui reste, une fois refermé.
1Le cycle rouge, vert, refactor
Toute la méthode tient en trois temps répétés à l'infini :
- Rouge : écrivez un test qui échoue ;
- Vert : faites-le passer le plus vite possible, par n'importe quel moyen, même sale ;
- Refactor : nettoyez le code sans rien casser.
// 1. ROUGE : on écrit le test AVANT le code
test('5 + 3 = 8', () => expect(somme(5, 3)).toBe(8)) // ✗ somme n'existe pas
// 2. VERT : le code le plus bête qui passe, même en dur
function somme(a, b) { return 8 } // ✓ honteux, mais vert
// 3. REFACTOR : un 2e test casse le "8 en dur", on généralise
function somme(a, b) { return a + b } // ✓ propre, toujours vert
La règle qui fait mal : pendant la phase deux, tout est permis pour obtenir le vert (même return 8 en dur), mais seulement le temps d'y arriver. Beck l'écrit : « le vert rapide excuse tous les péchés. Mais seulement pour un instant. » On ne refactorise jamais sur du rouge, et on ne laisse jamais une duplication derrière soi. La phrase de Ron Jeffries résume le but du livre en quatre mots : du code propre qui marche.
2Écrire le test d'abord, c'est concevoir
Le test n'arrive pas après le code, il arrive avant la classe elle-même. Beck commence par écrire ce qu'il voudrait pouvoir taper, comme s'il racontait l'usage parfait depuis l'extérieur : « quand on écrit un test, on imagine l'interface parfaite pour notre opération ». Son tout premier test crée un objet Dollar qui n'existe pas encore :
public void testMultiplication() {
Dollar five = new Dollar(5);
five.times(2);
assertEquals(10, five.amount);
}
Ce test ne compile même pas : quatre erreurs (pas de classe Dollar, pas de constructeur, pas de méthode times, pas de champ amount). Beck les corrige une par une. L'erreur de compilation n'est pas un échec, c'est la première étape normale. Le test a dessiné l'API avant qu'une seule ligne de logique existe.
3« Fake it » : trichez pour démarrer
La technique la plus contre-intuitive du livre. Pour passer au vert au plus vite, retournez une constante en dur. Le test veut 10 ? Écrivez return 10. Barre verte. Puis, et c'est là le génie, rendez la triche visible : 10, c'est 5 fois 2, donc écrivez amount = 5 * 2. Maintenant la duplication saute aux yeux : le 5 et le 2 sont à la fois dans le test et dans le code. Pour l'éliminer, vous remplacez les constantes par des variables, étape par étape, jusqu'à amount = amount * multiplier. C'est l'élimination de cette duplication entre le test et le code qui force la généralisation, pas une décision abstraite prise dans votre tête. Vous ne réfléchissez pas au code général : vous l'obtenez en supprimant la copie.
4Trianguler : généraliser avec deux exemples
Quand vous ne voyez pas du tout comment généraliser, ajoutez un deuxième test qui rend la triche impossible. Pour tester l'égalité de deux Dollar, un seul test (5 égale 5) se contente d'un return true. Ajoutez « 5 n'égale pas 6 », et la constante ne tient plus : vous êtes forcé de comparer vraiment les montants. Beck appelle ça la triangulation : « ne généralisez que lorsque vous avez deux exemples ou plus ». Mais il est honnête sur son propre usage : « je n'utilise la triangulation que quand je suis vraiment, vraiment incertain de la bonne abstraction ». Ce n'est pas l'outil par défaut, c'est le filet quand on est perdu.
5La liste de TODO comme volant
Avant d'écrire le premier test, Beck note tout ce qu'il faudra tester sur une liste. L'item en cours est en gras, l'item fini est barré. Quand une idée surgit en plein cycle (un cas limite, un refactoring à faire), il ne la traite pas tout de suite : il l'ajoute à la liste et reste concentré sur sa tâche en cours. La liste, c'est sa mémoire de travail posée sur la table : elle garde le focus sur une seule chose à la fois, et elle dit quand on a fini, quand elle est vide. Le TDD, dit-il, est un processus de pilotage : un peu à gauche, un peu à droite, jamais un grand plan figé d'avance.
6Le TDD, c'est gérer la peur
C'est la vraie thèse du livre, celle que ses imitateurs ont oubliée. « Le développement piloté par les tests est une façon de gérer la peur pendant qu'on programme. » Le stress crée un cercle vicieux : plus vous avez peur de casser, moins vous testez, plus vous introduisez de bugs, plus vous avez peur. Le TDD coupe la boucle. Beck le dit franchement : « plus je ressens de stress, plus je lance les tests ». La barre verte n'est pas qu'un voyant : c'est une dose de calme. Sa formule la plus belle : les tests sont la pierre philosophale du programmeur, ils transmutent la peur en ennui. Pas l'ennui de s'embêter, l'ennui tranquille de quelqu'un qui sait que rien ne va exploser.
7xUnit : l'arbre dont descend tout le testing moderne
La deuxième partie est vertigineuse : Beck construit un framework de test en l'utilisant pour se tester lui-même. Au tout début, le framework n'existe pas, alors il vérifie à la main, puis, dès que la classe TestCase tient debout, il lui fait tester sa propre exécution. De ce bootstrap sortent les briques que vous connaissez sans le savoir :
setUpettearDown: chaque test part d'un état propre et indépendant ;- TestSuite : regroupe des tests et se manipule comme un seul ;
- TestResult : compte les succès et les échecs.
Martin Fowler a résumé l'affaire : jamais dans l'histoire du génie logiciel autant de gens n'ont autant dû à aussi peu de lignes de code. JUnit, pytest, Jest, PHPUnit : tous descendent de cette poignée de classes.
8Les limites, dites par l'auteur lui-même
Ce qui rend le livre crédible, c'est que son auteur refuse de survendre. Beck pose lui-même les questions qui fâchent dans le dernier chapitre :
- Le TDD est-il prouvé ? « Non. Aucune étude n'a démontré catégoriquement de différence entre le TDD et ses nombreuses alternatives, en qualité, en productivité ou en plaisir. »
- Le code legacy ? « Le plus gros problème, c'est que du code écrit sans penser aux tests est en général très peu testable. »
- La taille des pas ? Pas de réponse unique : il faut savoir faire des petits pas ET des grands, et choisir selon sa confiance du moment.
Et il relativise tout : « une bonne ingénierie, c'est peut-être 20 % du succès d'un projet ». C'est l'inverse d'un gourou.
Trois choses que je ne savais pas
- L'exemple de la monnaie multi-devises n'est pas de Beck. Il reconstruit l'objet que Ward Cunningham, l'inventeur du wiki, avait conçu chez WyCash pour gérer un portefeuille en dollars et en francs suisses. Beck refait en public ce que Ward avait fait un jour d'inspiration.
- Tout le but du livre tient dans une phrase de Ron Jeffries : « du code propre qui marche ». Beck la coupe en deux et en fait sa méthode : d'abord on fait marcher, ensuite on rend propre. Jamais les deux en même temps.
- La partie II est écrite en Python, pas en Java. Beck change de langage parce que, dit-il, l'architecture de xUnit y ressort « de façon très limpide ». Le créateur de JUnit explique sa plus célèbre invention dans le langage d'un autre.
Mon avis, honnêtement
Si vous ne deviez lire qu'une chose sur le TDD, c'est ça, et pas un article de blog. Parce que le livre ne vous vend pas une recette, il vous montre un état d'esprit : le calme qu'on gagne à savoir, à chaque seconde, que le code marche encore. L'idée de la peur transformée en ennui a changé ma façon de voir les tests. Je n'écris plus des tests pour « avoir de la couverture », j'en écris pour avancer sans trouille.
Maintenant, soyons clairs : la lecture n'est pas toujours agréable. La partie I, la monnaie, traîne en longueur. On répète le même micro-cycle des dizaines de fois, et au bout d'un moment on a compris, on aimerait qu'il accélère. Le code est du Java de 2002 et du Python 2, avec des casts à la main et des tournures qui ont pris un coup de vieux. Et le TDD lui-même reste discuté : beaucoup de très bons développeurs ne l'appliquent pas à la lettre, et Beck est le premier à dire qu'aucune étude ne tranche.
Alors lisez-le pour l'état d'esprit, pas pour la lettre. Gardez le cycle, gardez la liste de TODO, gardez « fake it » quand vous bloquez, et surtout gardez l'idée de fond. Les micro-pas de l'exemple, eux, vous les adapterez à votre propre rythme.
Odilon
Toujours valable en 2026 ?
Oui, mais en deux temps. La discipline pure, les pas minuscules et la triangulation à l'ancienne, beaucoup l'ont assouplie : on teste souvent à une maille plus grosse, plus proche du comportement que de la classe. En revanche, l'idée centrale n'a jamais été aussi utile. À l'heure où l'IA génère des fonctions entières en une seconde, le test redevient votre garde-fou : c'est lui qui dit si le code pondu par la machine fait vraiment ce que vous vouliez. Écrire le test d'abord, c'est spécifier votre intention avant de la déléguer. Beck a écrit en 2002 un livre sur la peur de casser son propre code ; il se lit aujourd'hui comme un mode d'emploi pour faire confiance à du code que vous n'avez pas écrit.
Pour qui ?
Lisez-le si
- Vous entendez « TDD » depuis des années sans avoir jamais vu quelqu'un le faire vraiment, pas à pas
- Vous voulez comprendre d'où viennent setUp, tearDown et toute la mécanique de votre framework de test
- Vos tests vous stressent au lieu de vous rassurer, et vous cherchez pourquoi
- Vous relisez du code généré par IA et vous voulez en faire un filet de sécurité, pas un pari
Passez votre chemin si
- Vous voulez une référence moderne sur les tests : le code de 2002 vous gênera, voyez plutôt un livre récent sur votre langage
- Vous détestez les livres-démonstration où l'auteur code en temps réel : la partie I vous paraîtra interminable
- Vous cherchez la preuve chiffrée que le TDD est rentable : Beck lui-même vous dira qu'elle n'existe pas
Pour aller plus loin
Le cycle rouge/vert/refactor et la mécanique de xUnit se pratiquent directement dans mon cours gratuit sur les tests, et l'idée d'écrire le test comme une spécification se prolonge dans Coder avec l'IA, où le test devient le contrat qu'on impose à la machine.
Commentaires (0)