Concept Golden master
Sorties réelles d'un système existant, figées bugs compris, pour juger sa réécriture. Le LLM propose les entrées, le legacy seul produit les sorties.
SFEIR AI · Publié le 20 octobre 2026
Figer le comportement observé, bugs compris
Un golden master est l'enregistrement des sorties réelles d'un logiciel existant pour un jeu d'entrées donné : ce que produit le programme qui tourne, y compris ses bugs, et non ce que sa documentation annonce. Toute réécriture est ensuite jugée contre cet enregistrement. Michael Feathers a nommé cette pratique « tests de caractérisation » dans Working Effectively with Legacy Code (Pearson, 2004) : un test de caractérisation décrit ce que le code fait, pour mettre sous contrôle un code legacy qu'il définit comme du code dépourvu de tests.
En 2014, J. B. Rainsberger appelle « golden master » la copie de la dernière sortie jugée acceptable, conservée et comparée à chaque exécution. L'approval testing outille le même principe : la bibliothèque ApprovalTests, dont Llewellyn Falco est le créateur, prend un instantané du résultat et vérifie qu'il n'a pas changé. Le kata Gilded Rose d'Emily Bache fournit des approval tests prêts à l'emploi dans une quarantaine de langages pour s'entraîner à refactoriser un code sans tests.
Le piège à l'ère des LLM
Demander à un modèle d'écrire les tests d'un code legacy produit des tests dont il écrit aussi les valeurs attendues, à partir de sa lecture du code et des commentaires, jamais de son exécution. Le test fige une interprétation. Quand il échoue sur l'existant, l'équipe corrige le code pour faire passer le test, et modifie une règle en production avant d'avoir migré la première ligne. Hamadi Jabloun décrit ce sabotage dans son article du 20 septembre 2026 sur sfeir.dev : les tests de caractérisation servent à « figer son comportement actuel, bugs compris », et un modèle qui invente les sorties ne fige rien.
Le golden master inversé
La règle tient en une phrase, posée par Hamadi Jabloun dans le même article : « le LLM génère les ENTRÉES. Le code legacy, lui seul, génère les SORTIES ». Le modèle repère bien les frontières à tester : zéro, champs vides, seuils, dates de fin de mois, débordements. L'autorité sur les sorties appartient au programme qui tourne en production. Les entrées proposées sont rejouées sur l'application d'origine dans un environnement de test, les sorties observées, erreurs comprises, sont enregistrées, et la nouvelle application est jugée contre cet enregistrement seul. Le modèle qui écrit le code cible reçoit la consigne de signaler tout cas qui lui paraît erroné dans une liste d'écarts à arbitrer, au lieu de le corriger en silence ; le métier tranche entre défaut du nouveau code et bug historique.
Le score de mutation mesure le filet : PIT en Java ou mutmut en Python injectent des fautes dans le code et comptent celles que la suite détecte, quand un taux de couverture de lignes ne dit rien de la qualité des assertions. Le shadow traffic sécurise la bascule : la production est routée vers les deux implémentations en parallèle, seule la réponse de l'ancienne fait foi, et les divergences sont journalisées. Un module bascule quand le taux de divergence reste nul sur une période représentative.
D'autres acteurs du marché appliquent le même principe. Winfall, qui migre des applications WinDev et WebDev vers C# et .NET, écrit : « Chaque procédure migrée reçoit ses tests unitaires C#, dont les valeurs attendues sont capturées sur l'application d'origine. »
Rendre le golden master reproductible
Un golden master qui change à chaque exécution ne vaut rien. Il faut neutraliser les sources d'indéterminisme : date et heure courantes, nombres aléatoires, compteurs et numérotations, appels réseau, singletons statiques. On introduit des points de contrôle, les seams de Feathers : horloge paramétrable, numérotation injectée, wrapper autour de l'appel externe. Le commit qui rend l'application testable ne touche à aucune règle métier.
Ce que l'on compare dépend de l'application. Une fonction d'un progiciel de gestion renvoie rarement une simple valeur ; ses effets sont dans les tables, les documents imprimés et les fichiers exportés. On capture l'état des tables après chaque scénario (lignes créées, modifiées, supprimées, valeurs calculées), on compare les états imprimés par extraction du texte et des montants ou visuellement avec une tolérance définie, et on compare les exports octet par octet après normalisation des horodatages et des identifiants techniques. Le meilleur golden master reste l'enregistrement du trafic de production sur une période représentative, avec au moins une clôture de mois.
Dans la pratique SFEIR : l'étape 5 de la migration
Le golden master inversé est l'étape 5 de la méthode de migration en six étapes que SFEIR applique aux applications WinDev, et sa gate Ship : un module ne bascule qu'à divergence nulle (la méthode détaillée, le guide de la migration WinDev). Les scénarios Gherkin issus de l'extraction des règles métier fournissent les premières entrées ; la phase transitoire où l'application d'origine tourne sur PostgreSQL permet de comparer des écritures dans le même moteur. Le livrable par module : un fichier golden_master.json, le rapport de comparaison et le score de mutation de la suite.
Une migration livrée sans ce filet nourrit le rework rate, ces déploiements non planifiés qui corrigent ce que la recette n'a pas vu. La fiche modernisation legacy situe la pratique dans l'ensemble de la démarche.
Questions fréquentes
Quelle différence entre un golden master et des tests unitaires classiques ?
Un test unitaire affirme ce que le code devrait faire ; un golden master enregistre ce qu'il fait, bugs compris, et signale tout changement. Une différence appelle une décision : quelqu'un tranche si c'est le code ou le golden master qui doit changer.
Pourquoi le LLM ne doit-il pas écrire les valeurs attendues ?
Il les déduit de sa lecture du code, pas de son exécution, et fige une interprétation. Quand le test échoue sur l'existant, l'équipe corrige du code en production avant d'avoir migré. Dans le golden master inversé, le modèle propose seulement les entrées ; l'application d'origine produit les sorties.
Que faire d'un bug historique découvert dans le golden master ?
Le documenter, le faire arbitrer par le métier et ne le corriger qu'après la bascule du module, pour garder le référentiel de comparaison intact. La correction est une décision produit, tracée, jamais une correction silencieuse du modèle.
Combien de cas faut-il dans un golden master ?
Assez pour atteindre un score de mutation satisfaisant sur le module, mesuré avec PIT ou mutmut. Le volume compte moins que la couverture des frontières, et l'enregistrement du trafic réel sur une période représentative, avec une clôture de mois, apporte les cas que personne n'invente.
Sources
- sfeir.dev : Hamadi Jabloun, « Du Legacy à l'état de l'art : moderniser avec l'IA sans rejouer le Big Bang » (golden master inversé, tests de caractérisation, score de mutation PIT et mutmut, shadow traffic, seams de Feathers) · 2026-09-20
Golden Master : le LLM génère les ENTRÉES. Le code legacy, lui seul, génère les SORTIES attendues.
- Winfall : page d'accueil, section « Tests générés depuis votre code » (migration WinDev et WebDev vers C#, Blazor et .NET) · 2026-10-20
Chaque procédure migrée reçoit ses tests unitaires C#, dont les valeurs attendues sont capturées sur l'application d'origine.
- Wikipédia (EN) : « Characterization test », terme forgé par Michael Feathers, synonyme « Golden Master Testing » · 2026-10-20
This term was coined by Michael Feathers.
- InformIT (Pearson) : fiche du livre « Working Effectively with Legacy Code », Michael Feathers, publié le 22 septembre 2004, ISBN 0-13-117705-2 · 2004-09-22
Published Sep 22, 2004 by Pearson
- J. B. Rainsberger, « Surviving Legacy Code with Golden Master and Sampling » (The Code Whisperer) · 2014-09-28
I call that the golden master
- ApprovalTests : site officiel, définition et liste des langages pris en charge · 2026-10-20
Approval tests simplify this by taking a snapshot of the results, and confirming that they have not changed.
- SE Radio 595 : « Llewelyn Falco on Approval Testing », Llewellyn Falco présenté comme créateur d'ApprovalTests · 2023-12-27
He's the creator of ApprovalTests, co-author of the Mob Programming Guidebook
- GitHub : Emily Bache, dépôt GildedRose-Refactoring-Kata (approval tests fournis, fixtures TextTest, licence MIT) · 2026-10-20
Alternatively, use the Approval tests provided in this repository.
- Pitest : site officiel de PIT, système de mutation testing pour Java et la JVM · 2026-10-20
Faults (or mutations) are automatically seeded into your code, then your tests are run.
- PyPI : mutmut, mutation testing pour Python 3 (version 3.8.0 du 12 septembre 2026) · 2026-09-12
Mutmut is a mutation testing system for Python, with a strong focus on ease of use.
Golden master dans vos projets
Échanger avec SFEIRArticles liés
Tests de non-régression d'une migration WinDev : la méthode du golden master inversé
Une application migrée qui tourne ne prouve rien. Il faut montrer qu'elle produit les mêmes écritures, états et exports que l'application WinDev, bugs compris. Notre méthode : le LLM propose les entrées, WinDev seul produit les sorties, et le nouveau code est jugé contre ce golden master.
Migration WinDev : réécrire vos applications PC SOFT avec l'IA, sans big bang
Une migration WinDev se joue sur deux chantiers : retrouver les règles métier enfouies dans vingt ans de fenêtres, puis prouver que la nouvelle application fait la même chose que l'ancienne. Méthode SFEIR en six étapes, stack cible, ordres de grandeur et grille rester, geler ou migrer.
Migrer WinDev avec la Software Factory 10x : la méthode SFEIR en six étapes, de l'audit à la bascule
Six étapes, un livrable vérifiable au bout de chacune, trois gates tenues par des humains et l'exécution confiée aux agents Claude Code : comment SFEIR mène une migration WinDev sur son SDLC à onze phases, de l'audit du patrimoine à la bascule.
Migration WinDev : les 10 risques qui font échouer un projet, et comment les maîtriser
Big bang, règles oubliées, états découverts en recette, lots invisibles, tests écrits par le LLM : les migrations WinDev échouent rarement pour une raison technique. Les dix risques que nous rencontrons le plus, et l'étape de la méthode qui neutralise chacun.
Extraire les règles métier d'une application WinDev avec l'IA : la rétro-documentation spec first
Les règles de gestion d'une application WinDev vivent dans son WLangage et nulle part ailleurs. Comment les extraire avec l'IA : export en mode texte, prompt d'archéologie à cinq sections, double exécution, Gherkin, ADR rétroactifs et validation métier.
HFSQL vers PostgreSQL : migrer les données d'une application WinDev sans perte
Migrer une base HFSQL vers PostgreSQL sans perte : transposer le schéma, déclarer les clés que le code gardait implicites, nettoyer avant de migrer, répéter les migrations à blanc jusqu'à deux rapports de conformité sans écart, faire tourner WinDev sur PostgreSQL, puis basculer.
Migrer WebDev et WinDev Mobile : sites, applications SaaS et applications terrain
WebDev et WinDev Mobile partagent le WLangage avec WinDev, mais leurs migrations ont leurs questions propres : serveur d'application facturé par cœurs et mémoire, référencement, sessions d'un côté ; hors ligne, synchronisation, terminaux et Flutter de l'autre. Ce qui change, ce qui ne change pas.
Tests automatisés : le multiplicateur DORA que personne ne peut ignorer
L'IA code plus vite que vous ne pouvez relire : bienvenue dans l'ère de l'amplification Un chiffre, d'abord. Selon le rapport DORA 2025, 90 % des développeurs utilisent désormais l'IA au quotidien. Ce taux a progressé de 14 points en un an — l'accélération la plus rapide...