Le développement piloté par les tests est similaire à la conception par contrat, où vous avez des conditions préalables, des invariants et des post-conditions.
Le terme a été inventé par Bertrand Meyer dans le cadre de sa conception du langage de programmation Eiffel et décrit pour la première fois dans divers articles à partir de 1986 [Wikipedia]
Les méthodes formelles datent d'au moins 1983 et ont été utilisées pour des systèmes critiques pour la sécurité tels que le métro parisien sans conducteur utilisant la méthode B:
Dans la première version, la plus abstraite, appelée Abstract Machine, le concepteur doit spécifier l'objectif de la conception. [Wikipédia]
Celles-ci pourraient être certaines des choses à partir desquelles Kent Beck "a aidé à lancer ... la redécouverte de la programmation test-first".
Plus précisément: Apparemment, le projet Mercury de la Nasa au début des années 1960 était le premier projet logiciel utilisant un développement piloté par les tests et d'autres pratiques agiles. Je n'ai trouvé aucune documentation préliminaire, mais voici un rapport de 2003 qui cite la communication des membres du projet:
Le projet Mercury s'est déroulé avec des itérations très courtes (une demi-journée) qui étaient encadrées dans le temps. L'équipe de développement a procédé à un examen technique de tous les changements et, fait intéressant, a appliqué la pratique de programmation extrême du test d'abord, de la planification et de l'écriture des tests avant chaque micro-incrément.
Le reste du rapport est également intéressant, il poursuit:
La première référence que nous avons trouvée qui se concentrait spécifiquement sur la description et la recommandation du développement itératif était un rapport de 1968 de Brian Randell et FW Zurcher de l'IBM TJ Watson Research.
En plus des tests automatisés, le rapport de 1968 préconise le codage et les tests parallèles, sinon les tests en premier:
g. Conception détaillée, codage et documentation de chaque bloc de programme.
h. Conception et documentation des méthodes de test pour chaque bloc de programme en parallèle avec l'étape (g).