Alors qu'on soit bien claire : je pense que le TDD est préférable à l'ITLD (Iterative Test-Last Development). Cela dit, je ne veux pas utiliser une méthodologie sans me baser sur rien, alors j'ai fait une revue de la littérature scientifique pour voir ce qu'on mesurait concernant le TDD, l'ITLD et le no-test, et il se trouve que le résultat de cette compilation d'articles scientifiques est contrastée sur certains sujets, mais que pour le moment (j'essaye d'y rajouter régulièrement des sources quand j'ai le temps) une des conclusions est clairement qu'écrire les tests avant ou après avoir écrit le code n'est pas le facteur le plus déterminant dans les critères que tu cites.
Je nuancerais cependant sur un point : on oppose plus souvent le TDD à "pas de tests" qu'à l'ITLD, et oui clairement dans ce cas les bénéfices sont monstrueux. Quand on le compare à l'ITLD cependant certains facteurs ne changent pas ou peu :
- nombre de defects (même si là j'ai peu de points de comparaison avec l'ITLD)
- qualité externe (on trouve même certaines études dans laquelles la qualité externe est supérieure pour l'ITLD, même si je parierais plus sur des fluctuations statistiques marginales)
- qualité interne (complexité algorithmique, architecture, design patterns, etc.), et là ça s'explique très bien par un facteur : personne n'effectue correctement la dernière étape du TDD qui est le refactoring, et donc une fois testé le code ne bouge plus.
Cela dit tout n'est pas sombre et le TDD en lui-même a des avantages indéniables :
- amélioration de la confiance des développeurs dans leur code et diminution du stress
- amélioration de l'apprentissage et de la représentation conceptuelle du code
On peut noter également qu'un meilleure découpage des tâches en amont permet de réduire les defects et d'augmenter la qualité interne, peut-être que le TDD favorise ce découpage mais là encore j'ai peu de données.
Ce que je conclue de ça, c'est que si quelqu'un ne teste pas son code, mieux vaut le faire tester avant ou après son écriture en premier lieu en lui laissant le choix, avant d'arriver au TDD, car c'est surtout la présence de tests qui amène le plus de bénéfices. Ensuite, quand on en arrive au TDD il est surtout nécessaire de ne pas négliger le refactoring (avec par exemple de la peer review systématique, ce sur quoi je fais actuellement des recherches de la même sorte) pour avoir encore de grands bénéfices.
Encore une fois : je suis totalement pour le TDD, je dis juste que s'il faut faire des choix, ce n'est pas le plus gros facteur d'amélioration, c'est tout.