Aller au contenu
14 août 2026·8 min de lecture

Comment un banc de parité prouve une réécriture

Un banc de parité rejoue le trafic réel, compare les sorties exactes, maîtrise l'aléatoire et révèle les erreurs contestées de l'ancien système.

Comment un banc de parité prouve une réécriture

Une réécriture est prête quand elle se comporte comme le système qu'elle remplace avec les entrées qui comptent. Une architecture propre, des tests unitaires réussis et des écrans familiers ne prouvent pas que le nouveau système comptabilise les mêmes totaux de facture, choisit la même assiette fiscale ou rejette le même ajustement mal formé. Un banc de parité le prouve. Il envoie la même requête enregistrée aux deux systèmes, capture chaque résultat observable, normalise uniquement les champs autorisés à varier et produit un écart qu'un responsable peut expliquer.

Cela ressemble à un test de régression ordinaire jusqu'à ce que l'argent, les dates, l'état et les effets externes entrent en jeu. La comparaison facile ne tient alors plus. L'ancienne application peut lire l'heure au milieu d'un calcul, dépendre de l'ordre des enregistrements, arrondir après chaque ligne, réutiliser un taux de change périmé ou écrire cinq lignes avant de renvoyer une réponse. Certains de ces comportements sont des exigences. D'autres sont des accidents dont les utilisateurs dépendent désormais. D'autres encore sont des défauts. Le banc doit les distinguer sans masquer les preuves gênantes.

J'utilise la parité comme argument d'acceptation, pas comme pourcentage sur un tableau de bord. Cet argument a quatre parties : l'entrée rejouée représente la production, les deux exécutions partent d'un état équivalent, la politique de comparaison est explicite et chaque différence acceptée a un responsable et une raison. Si une partie reste vague, un résultat vert signifie peu de chose.

En quoi la parité diffère d'un test de régression ordinaire

Un banc de parité compare deux implémentations du même comportement. Une suite de régression compare une implémentation à des attentes écrites par des personnes. Cette distinction change ce que chaque test peut découvrir. Un test unitaire peut confirmer qu'une fonction d'intérêts réécrite suit la formule choisie pour le test. Il ne peut pas révéler que l'ancien système tronque le taux journalier avant capitalisation, sauf si quelqu'un connaissait déjà cette particularité et l'a encodée. Rejouer le même compte dans les deux systèmes fait apparaître immédiatement la différence.

L'ancien système tient lieu de spécification exécutable, mais il n'est pas infaillible. Le traiter comme oracle transforme sa sortie en preuve, pas en vérité. Le banc doit signaler que l'ancien système a renvoyé 104,17 et la réécriture 104,18. Un responsable produit, un contrôleur financier ou un responsable métier nommé décide si ce centime relève du contrat ou d'un défaut. Le mécanisme de test ne doit pas prendre cette décision de principe en arrondissant silencieusement les deux valeurs jusqu'à ce qu'elles correspondent.

Les tests de régression restent nécessaires. Ils isolent des règles, couvrent des limites synthétiques et sont assez rapides pour chaque commit. La parité couvre les combinaisons que personne n'a pensé à décrire : une ligne à zéro après un avoir, un client avec deux calendriers de facturation ou un programme RPG qui traite les espaces autrement que les zéros. Gardez les deux. Dès qu'un écart est arbitré, transformez la décision en test de régression ciblé afin que l'équipe n'ait pas à la redécouvrir lors d'un autre rejeu massif.

Le banc compare aussi davantage que la réponse visible. Pour une transaction, le contrat observable peut inclure les mutations en base, les fichiers émis, les messages de file, les écritures comptables, les codes d'état, les catégories d'erreur et l'ordre. Si le remplacement renvoie le bon total mais le comptabilise dans la mauvaise période, une parité limitée à la réponse donne un feu vert dangereux. Définissez la frontière d'observation avant d'enregistrer le trafic et incluez chaque effet visible par un autre système ou une personne.

Le trafic enregistré exige un contrat de rejeu

Un bon enregistrement contient assez d'informations pour reproduire l'intention sans copier un amas incontrôlé de journaux. Les journaux d'accès bruts suffisent rarement. Ils peuvent omettre le corps des requêtes, l'identité authentifiée, l'état de session, les en-têtes qui sélectionnent une règle métier ou la séquence ayant créé l'état actuel de la base. Ils peuvent aussi contenir des secrets qui ne doivent jamais entrer dans un stockage de test.

Utilisez une enveloppe de rejeu versionnée. Elle indique ce qui est arrivé, le contexte qui a influencé le comportement, le point de contrôle d'état attendu et les sorties que le banc observera. Une forme pratique est la suivante :

{
  "case_id": "close-004812",
  "captured_at": "2026-01-31T23:58:42Z",
  "operation": "POST /accounts/close",
  "identity_ref": "role:month_end_operator",
  "state_checkpoint": "ledger-2026-01-31-r7",
  "request": {"account_id": "A1842", "period": "2026-01"},
  "observe": ["response", "ledger_entries", "outbox"]
}

Stockez des références vers les identités et les secrets, jamais des identifiants actifs. Remplacez les champs personnels uniquement par une correspondance déterministe, car une anonymisation aléatoire peut détruire les jointures et le sens métier. Si le client 842 apparaît dans une requête, une écriture comptable et une table d'adresses, le jeu nettoyé doit conserver ces liens. Préservez la longueur et les classes de caractères lorsque la validation en dépend.

L'échantillonnage mérite une politique écrite. Une tranche aléatoire de requêtes courantes apporte du volume, mais rate souvent les cas rares qui portent un risque financier ou opérationnel. Combinez un échantillon de production avec des strates délibérées : type d'opération, succès et échec, montants élevés et nuls, limites calendaires, encodages inhabituels, traitements longs et chaque branche liée à l'argent ou aux droits. Enregistrez les sessions en plusieurs étapes comme des cas ordonnés lorsque les appels ultérieurs dépendent des précédents.

Conservez la capture d'origine intacte. Dérivez-en des jeux nettoyés et rejouables avec des transformations versionnées, puis notez la version de transformation à chaque exécution. Sinon, un changement du filtre peut modifier l'entrée pendant que l'équipe croit évaluer un changement du programme. L'accès aux captures doit rester limité, leur conservation finie et un cas en échec doit révéler ses identifiants par des diagnostics contrôlés plutôt que de verser les enregistrements complets dans les journaux CI.

Un état initial équivalent fait partie du test

La même requête sur des données différentes ne prouve rien. Avant chaque unité de rejeu, les deux implémentations ont besoin d'un état logiquement équivalent, y compris les tables de référence, les réglages fonctionnels, les positions de séquence, les seuils de lot et les enregistrements créés aux étapes précédentes. C'est généralement plus difficile que d'envoyer la requête.

Choisissez la plus petite frontière de remise à zéro qui préserve le sens. Un calcul de devis pur peut partir d'un petit jeu par cas. Une clôture de compte peut exiger un scénario ordonné avec plusieurs écritures antérieures. Un traitement nocturne peut demander un point de contrôle complet de la base et une file maîtrisée. Réinitialiser tout l'environnement avant chaque requête est lent, tandis que réutiliser une base mutable permet aux cas de se contaminer. Regroupez les cas en scénarios indépendants, réinitialisez à leurs frontières et gardez l'ordre des requêtes dans chaque groupe.

N'exigez pas des schémas physiques identiques. Un service modernisé avec Postgres ne doit pas imiter des fichiers VSAM ou un fichier physique AS/400 simplement pour faciliter la comparaison. Construisez des adaptateurs d'état qui expriment les mêmes faits métier dans chaque représentation. Comparez ensuite les résultats métier observables, pas les structures internes des tables. Une parité d'architecture annulerait l'intérêt de la réécriture.

La préparation de l'état doit inclure les valeurs souvent oubliées : date métier, base des fuseaux horaires, paramètres régionaux, métadonnées de devise, mode d'arrondi, barèmes fiscaux, taux de change, graines de séquence et contexte d'autorisation. Épinglez ces dépendances à une version du jeu de données. Si le traitement ancien lit une table de taux par date d'effet et que la réécriture prend la dernière ligne du jour, un JSON de requête identique pose encore deux problèmes différents.

Vérifiez la préparation au lieu de faire confiance au chargeur. Avant l'exécution, calculez une empreinte sémantique compacte, par exemple des nombres et des hachages sur des enregistrements métier canoniques. Les empreintes anciennes et nouvelles ne seront pas identiques octet par octet entre schémas, mais elles peuvent attester des faits : 418 postes ouverts, le même principal cumulé par devise et le même ensemble d'identifiants de règles actives. Une erreur de préparation doit arrêter le cas comme invalide, pas apparaître plus tard comme un écart applicatif.

La comparaison exacte commence par des valeurs canoniques

Comparez l'argent sous forme décimale avec une échelle et une devise déclarées, jamais comme chaînes formatées ou approximations binaires à virgule flottante. L'expression « au centime près » paraît simple, mais les équipes comparent souvent 12,3 à « 12,30 », convertissent les deux via un type flottant ou n'arrondissent que le total final alors que l'ancien programme arrondit chaque ligne. Le banc a besoin du contrat arithmétique du domaine.

IEEE 754 explique pourquoi la virgule flottante binaire ne peut représenter exactement de nombreuses fractions décimales. Cela ne rend pas faux tous les calculs flottants. Cela signifie qu'un epsilon inexpliqué est une mauvaise politique de parité financière. Analysez les sorties monétaires en coefficients décimaux et échelles, puis appliquez la règle métier au même stade que le système de production. Si le contrat demande d'arrondir chaque ligne de taxe à l'opposé de zéro, faites-le avant la somme. S'il exige quatre décimales pour un taux intermédiaire, comparez cette valeur si elle est observable ou ajoutez un diagnostic ciblé.

La canonisation doit retirer le bruit de représentation tout en gardant le sens. Elle peut convertir un horodatage en UTC, trier un ensemble explicitement non ordonné par des champs métier stables, traiter les champs JSON facultatifs absents selon le contrat d'API et décoder une valeur de largeur fixe remplie d'espaces. Elle ne doit pas changer la casse d'identifiants sensibles, trier une séquence visible par les utilisateurs, supprimer les doublons ou ramener chaque erreur à un échec générique.

Exprimez la politique sous forme de données lisibles plutôt que de l'enfouir dans le code du comparateur :

rules:
  - path: response.total_due
    type: decimal
    scale: 2
    tolerance: 0
  - path: response.generated_at
    type: timestamp
    mode: injected-clock
  - path: outbox[*].headers.trace_id
    mode: ignore
    reason: generated transport identifier
  - path: response.allocations
    mode: ordered

Cette politique empêche un nettoyage anodin d'élargir la tolérance de toute la suite. Exigez une raison pour chaque chemin ignoré et chaque tolérance non nulle. Examinez les changements de politique comme du code de production, car un comparateur peut effacer un défaut plus efficacement qu'une réécriture ne peut en créer un.

Signalez les différences au niveau du champ métier, pas sous forme de deux énormes blocs JSON. Un résultat utile dit invoice.lines[7].tax: legacy 1.34, rewrite 1.35, suivi de la règle de comparaison applicable et de la version du jeu. Incluez les décomptes globaux, mais ne laissez jamais un taux de concordance de 99,9 % cacher le dixième qui a échoué. Une retenue de paie erronée pèse davantage que des milliers de contrôles de santé identiques.

Il faut maîtriser le non-déterminisme avant de l'ignorer

Traitez ensemble des millions de lignes
La plateforme lit en parallèle les grands dépôts multilingues plutôt que de séparer les migrations.

La plupart du non-déterminisme peut devenir une entrée. Injectez une horloge, fixez la graine aléatoire, réservez les identifiants, figez les données de référence et isolez la concurrence. Quand les deux programmes consomment les mêmes valeurs explicites, le banc teste le comportement au lieu de comparer deux accidents.

Classez chaque champ variable dans l'un de quatre groupes. Les valeurs contrôlées reçoivent la même entrée dans les deux systèmes. Les valeurs canoniques diffèrent en représentation mais se ramènent au même sens. Les valeurs ignorées n'ont aucun sens métier, comme un identifiant de trace de transport. Les sorties statistiques exigent un test distinct car un seul rejeu ne prouve pas la parité d'un modèle stochastique. Cette classification est plus précise qu'une liste globale d'exclusions et donne aux examinateurs quelque chose de concret à contester.

Le temps cause la plupart des échecs évitables. Un processus peut lire l'horloge à la réception, lors de la comptabilisation, puis lors du formatage de la réponse. Écraser seulement l'horodatage final laisse la logique aux limites de date sans contrôle. Faites passer chaque lecture de l'heure métier de la réécriture par une source injectable. Pour l'ancien côté, utilisez un environnement isolé avec une heure système maîtrisée lorsque c'est sûr, interceptez son fournisseur de temps ou capturez les valeurs utilisées et comparez les résultats métier dérivés dans un scénario qui ne peut franchir une limite. Ne changez jamais l'heure d'un hôte de production partagé.

Les identifiants générés demandent une corrélation plutôt qu'une égalité lorsqu'ils n'ont pas de sens métier. Supposons que les deux systèmes créent un nouvel identifiant de dossier, puis l'utilisent dans trois lignes et un événement. Associez l'ancien identifiant au nouveau au point de création et vérifiez que toutes les références ultérieures gardent cette relation. Ignorer tous les champs d'identifiant masquerait une référence étrangère cassée. Exiger les mêmes séquences lierait la réécriture à un détail d'implémentation.

La concurrence exige des tests répétés et ordonnancés, pas une normalisation optimiste. Si l'ordre des résultats est sans portée contractuelle, comparez un multiensemble tout en vérifiant les multiplicités. Si deux écritures se disputent le même solde, forcez les deux entrelacements avec des barrières autour de la lecture et de l'écriture disputées. Une tolérance large n'excuse pas les mises à jour perdues. Gardez les tests de charge et d'endurance séparés de la parité sémantique, mais ramenez toute panne découverte dans un petit scénario de parité reproductible.

Les effets externes doivent être capturés, pas reproduits

Un rejeu ne doit pas envoyer de vrais paiements, courriels, travaux d'impression ou messages partenaires. Remplacez la frontière par un enregistreur qui accepte la même commande, renvoie un accusé contrôlé et stocke une représentation canonique à comparer. Il faut prouver que le nouveau système voulait produire le même effet, pas produire cet effet deux fois.

Placez les enregistreurs à la dernière frontière que vous contrôlez. Capturer un appel de fonction interne peut réussir alors que la sérialisation, le routage ou les en-têtes sont faux. Capturer au-delà de la frontière peut affecter un tiers. Pour un courtier de messages, enregistrez le sujet final, les en-têtes métier, le champ de partitionnement lorsqu'il porte un sens et la charge utile après sérialisation. Pour une interface de fichier, capturez les octets et une vue métier analysée lorsque les largeurs fixes, l'encodage ou les fins de ligne font partie du contrat.

Les effets en base exigent une comparaison consciente des transactions. Prenez un instantané avant des entités métier concernées, exécutez le cas, puis calculez le delta après. Comparez insertions, mises à jour, suppressions et invariants entre les deux représentations. Ne comparez pas directement les horodatages d'audit ou les identifiants substituts, sauf si des consommateurs en dépendent. Vérifiez que débits et crédits s'équilibrent, qu'une ligne d'outbox existe par action validée et qu'un retour arrière ne laisse aucune modification métier partielle.

Les échecs sont aussi des sorties. Faites correspondre la classe d'erreur, l'état, la possibilité de reprise et les effets externes. Le texte exact de l'ancienne erreur ne mérite pas toujours d'être conservé, surtout si la réécriture renvoie une erreur structurée. Les appelants peuvent toutefois dépendre d'un code ou d'un signal de nouvelle tentative. Écrivez cette règle de compatibilité. Un remplacement qui transforme une erreur de validation permanente en erreur serveur à retenter peut causer davantage de dégâts qu'un écart d'affichage d'un centime.

L'enregistreur doit exposer les tentatives en double. Pour les reprises, comparez le comportement d'idempotence sur toute la séquence : première requête, accusé perdu, requête répétée et état final. Deux commandes sortantes identiques ne sont pas anodines parce qu'un environnement de test aval a accepté les deux.

Un écart a besoin d'une trace de décision

Obtenez la parité en 30 jours
CodeHero intègre les preuves de rejeu et livre chaque projet en moins de 30 jours.

Chaque écart doit suivre un petit flux explicite : le reproduire, le localiser, le classer, lui attribuer un responsable et encoder la décision. Sans cette trace, les équipes chassent des horodatages inoffensifs pendant des jours ou écartent des différences financières pour préserver une échéance.

Commencez par réduire le rejeu en échec. Conservez son point de contrôle, retirez les enregistrements sans rapport et réduisez la séquence de requêtes jusqu'à ce que l'écart subsiste. Examinez ensuite la première valeur observable divergente, pas le total final. Un écart d'un centime sur une facture peut commencer par un arrondi de ligne. Vingt champs suivants ne font que le répéter. Stockez le cas minimal avec le banc pour l'exécuter à chaque changement.

Utilisez un petit ensemble de classifications :

  • Défaut de réécriture : la nouvelle implémentation viole un comportement ancien accepté.
  • Défaut du banc : l'état, la capture, la normalisation ou l'observation est incorrect.
  • Correction approuvée : le comportement ancien est faux et un responsable autorise un nouveau résultat.
  • Changement de contrat : l'organisation modifie volontairement le comportement au-delà d'une correction.
  • Non résolu : il manque encore des preuves ou un responsable, donc la publication reste bloquée pour ce cas.

Un dossier d'approbation doit nommer le cas, le champ, l'ancienne valeur, la nouvelle, la justification, l'approbateur, la date de décision et le test de régression qui définit désormais le comportement attendu. Évitez les dérogations libres comme « problème d'arrondi accepté ». Six mois plus tard, personne ne sait si elle couvrait une juridiction fiscale ou tous les calculs. Faites expirer les exceptions générales et interdisez les jokers sans raison bornée.

Un bon artefact d'échec tient dans une revue sans exposer tout l'enregistrement de production. Il comprend les entrées nettoyées, l'empreinte sémantique de l'état, les deux sorties normalisées, une différence structurée, la version de politique et la commande de rejeu. Ce paquet permet à un ingénieur de reproduire le résultat pendant qu'un responsable métier examine la conséquence réelle.

Quand l'ancien système a tort, conservez la preuve plutôt que le comportement

Les défauts connus de l'ancien système doivent devenir des divergences approuvées, jamais des astuces du comparateur. Prouvez d'abord que la réécriture diffère. Prouvez ensuite pourquoi l'ancien résultat viole la règle choisie. Enfin, consignez qui assume la décision de changer le comportement observable. Cela sépare l'autorité technique de migration de l'autorité métier.

Le conseil populaire « faire correspondre d'abord, corriger plus tard » n'est utile que si ce plus tard existe. Il réduit les variables simultanées et rend la migration plus facile à raisonner. Il devient faux s'il livre une surfacturation connue, recrée une autorisation dangereuse ou ancre des données corrompues parce que personne n'a planifié la seconde modification. La gravité et la réversibilité décident de l'ordre. Conservez temporairement les bizarreries sans danger si cela réduit le risque de mise en service. Corrigez les comportements nocifs avant la bascule avec approbation et communication explicites.

Faites passer les corrections approuvées par deux assertions. L'assertion de parité documente l'écart voulu : l'ancien système produit X, le remplacement produit Y. L'assertion de régression métier prouve Y à partir d'une règle ou d'un exemple indépendant. Si vous supprimez plus tard l'ancien côté, le second test reste la spécification durable. Il empêche aussi un futur mainteneur de « corriger » la réécriture pour retrouver l'ancien défaut après avoir vu un cas rouge.

Les données historiques peuvent propager le défaut. Un code correct peut encore contredire d'anciens rapports parce que des soldes, indicateurs d'état ou champs dérivés stockés contiennent déjà de mauvais résultats. Décidez pour chaque classe d'enregistrement affectée s'il faut migrer, recalculer, mettre en quarantaine ou conserver. Répétez cette politique de données dans le même point de contrôle que le rejeu. Une parité de code sans décision sur les données laisse l'argument de bascule incomplet.

Communiquez le changement à la frontière où les utilisateurs ou systèmes dépendants le remarquent. Un montant corrigé peut nécessiter un rapport de rapprochement. Une validation plus stricte peut faire ressortir des dossiers que l'ancien système acceptait silencieusement. Une correction d'autorisation peut invalider un processus. La trace de décision doit indiquer la réponse opérationnelle, pas seulement la justification arithmétique.

Le lanceur de l'ancien système a besoin d'une interface stable

Voyez les écarts avant bascule
Les cas enregistrés révèlent totaux contestés, effets externes et cas limites pendant la réécriture.

Le banc doit appeler l'ancien système par la frontière stable la plus étroite qui exerce encore son comportement réel. Un point d'accès HTTP est pratique s'il existe, mais de nombreux parcours anciens commencent par un fichier de lot, un enregistrement de file, une transaction terminal ou une procédure stockée. Enveloppez ce point d'entrée dans un lanceur qui accepte l'enveloppe de rejeu, établit le contexte, attend la fin et renvoie les observations capturées dans un format de résultat versionné. Ne recopiez pas la logique métier dans cet adaptateur. Chaque règle copiée crée une autre implémentation susceptible de diverger.

Traitez la santé du lanceur séparément de la sortie applicative. Un délai dépassé, une région indisponible, un chargement de jeu en échec ou une panne d'enregistreur rend le cas non concluant. Cela ne signifie pas que l'ancien système a renvoyé une erreur et ne compte certainement pas comme une parité. Utilisez une enveloppe de résultat distinguant completed, application_failure et infrastructure_failure, puis joignez les journaux de tâche ou codes de diagnostic avec une conservation contrôlée. Cette distinction empêche une plomberie de test instable de gonfler le taux apparent de concordance.

L'isolation des ressources compte lorsque l'ancienne plateforme possède un état global. Deux rejeux parallèles peuvent partager des fichiers temporaires, noms de tâche, générateurs de séquence ou une table de travail que le code de production suppose réservée à un seul écrivain. Verrouillez explicitement ces ressources ou allouez des espaces de noms isolés lorsque la plateforme le permet. Si l'isolation est impossible, sérialisez le scénario concerné et indiquez-le dans les métadonnées. Un banc rapide qui modifie le comportement mesuré donne de moins bonnes preuves qu'un banc plus lent mais honnête.

Versionnez le lanceur, les adaptateurs, la politique de comparaison, les jeux et la version candidate dans chaque résultat. Un identifiant de rejeu doit suffire à reconstruire les cinq. Conservez si possible les artefacts par adresse de contenu afin qu'un examinateur puisse prouver qu'un rapport ultérieur utilise les mêmes sorties normalisées. Protégez les dossiers d'acceptation finaux selon les contrôles de changement existants. Le banc n'a pas besoin d'une nouvelle bureaucratie, mais sa preuve doit durer au moins autant que l'approbation qu'elle soutient.

Enfin, testez le banc avec des écarts implantés. Changez un centime, retirez une ligne d'outbox, inversez deux allocations ordonnées, décalez la date métier et forcez une fuite après retour arrière dans un jeu contrôlé. Chaque mutation doit produire l'échec attendu au niveau du champ. Les équipes testent constamment le code applicatif et supposent que le comparateur fonctionne. Un comparateur qui n'a jamais démontré sa sensibilité reste une partie non testée de la migration.

La preuve de publication doit résister à la manipulation d'un taux

Un seuil de publication crédible nomme le comportement couvert et l'incertitude restante. Il ne dit pas seulement que 98 % des cas ont réussi. Rapportez la couverture par opération et classe de risque, le nombre de correspondances exactes, les corrections approuvées, les pannes du banc, les écarts non résolus et les frontières non testées. Montrez si l'échantillon inclut la clôture de période, le retour arrière, la reprise, les entrées mal formées, les transactions de grande valeur et les plus anciennes formes de données prises en charge.

Gardez un seuil strict : aucun écart non résolu dans une classe critique, aucun effet externe inattendu, aucun changement de politique de comparaison caché dans la version candidate et aucun échec de préparation compté comme réussite. Les écarts moins risqués peuvent suivre une décision documentée, mais ils restent visibles dans la preuve. Un dénominateur qui exclut silencieusement les rejeux interrompus relève de la fraude sur tableur.

Exécutez le même corpus plusieurs fois. La répétabilité détecte le temps non maîtrisé, l'ordre, l'état partagé et les fuites d'environnement. Rejouez ensuite une capture récente réservée que les développeurs n'ont pas utilisée pour ajuster la réécriture. Un corpus peut devenir une cible de surapprentissage comme une suite unitaire. Le lot réservé n'a pas besoin d'être énorme. Il doit avoir une provenance représentative et protégée ainsi qu'une méthode d'échantillonnage documentée.

Au moment de la bascule, une exécution fantôme peut ajouter des preuves si le système l'autorise sans danger. Envoyez une copie des lectures ou commandes actives éligibles au remplacement, supprimez ses effets et comparez les résultats hors du chemin utilisateur. Ne laissez jamais les deux côtés valider une opération fantôme. Surveillez la confidentialité, la capacité et les changements de temps introduits par ce chemin lui-même.

CodeHero utilise le trafic de production enregistré et un banc de parité pour maintenir le comportement d'origine des systèmes réécrits en Go, Rust et TypeScript tout en changeant leur architecture. Pour un projet livré en moins de 30 jours, cette preuve doit être conçue dès la prise en charge, pas assemblée pendant la réunion de mise en production.

Le dossier d'acceptation doit aussi montrer ce que le rejeu n'a pas prouvé. Listez les opérations sans capture exploitable, les intégrations représentées uniquement par un substitut, les anciennetés de données absentes des jeux et les formes de concurrence testées seulement sous charge. Pour chaque lacune, nommez la preuve compensatoire, comme une suite de régression ciblée, une requête de rapprochement, une répétition opérateur en environnement préparé ou une observation limitée après la bascule. Ne transformez pas ces contrôles en affirmations de parité. Ils répondent à une autre question et doivent garder cette étiquette. L'approbateur peut ainsi juger un risque borné au lieu de supposer qu'un grand nombre de cas couvre tous les parcours. Joignez ce registre des lacunes au résultat final, car il devient le premier plan de test de la surveillance en production et du cycle de capture suivant. Si une opération non représentée apparaît en mode fantôme, ajoutez-la au corpus en conservant sa provenance. La preuve progresse quand de nouveaux cas étendent une frontière déclarée. Elle perd en crédibilité quand l'équipe change en silence le sens du mot couverture.

Un banc de parité gagne la confiance par les différences qu'il refuse de cacher. Rendez les entrées reproductibles, l'état équivalent, l'arithmétique explicite, les champs variables classés et les exceptions attribuées. Le dernier cas rouge devient alors une preuve utile, pas un obstacle à repeindre en vert.

FAQ

Qu'est-ce qu'un banc de parité dans une réécriture ?

Un banc de parité exécute le même cas capturé sur l'ancien système et son remplacement, puis compare chaque résultat métier observable. Il inclut l'état initial, les règles de normalisation, les effets externes et une décision pour chaque différence.

Quelle quantité de trafic de production faut-il rejouer ?

Il n'existe aucun pourcentage universel honnête. Échantillonnez le trafic courant, puis ajoutez les opérations rares, les échecs, les limites de montant et de calendrier, les reprises et les branches qui touchent à l'argent ou aux accès.

Peut-on utiliser directement les journaux de production comme jeux de rejeu ?

En général, non. Les journaux omettent souvent corps, identité, état ou ordre des requêtes et peuvent exposer des secrets. Construisez plutôt des enveloppes versionnées et un nettoyage déterministe.

Les valeurs monétaires doivent-elles avoir une tolérance ?

Partez d'une tolérance nulle après analyse décimale et application de la règle d'arrondi déclarée. N'utilisez une tolérance non nulle que si le contrat métier la permet et exigez une raison sur le champ précis.

Comment comparer les identifiants générés par deux systèmes ?

Associez l'ancien identifiant au nouveau lors de la création de chaque objet, puis vérifiez toutes les références ultérieures. Ignorer tous les identifiants masque les liens cassés. Exiger des séquences identiques lie inutilement les systèmes.

Comment traiter les horodatages pendant les tests de parité ?

Injectez la même horloge métier si possible et ne normalisez la représentation, comme le fuseau, que si le sens reste intact. Ignorer tous les horodatages peut cacher des erreurs de date de comptabilisation, d'expiration ou d'intérêts.

Que faire si l'ancien système contient un défaut connu ?

Consignez une correction approuvée avec ancienne valeur, nouvelle valeur, justification, responsable et date. Gardez une assertion de parité qui documente l'écart et un test indépendant qui prouve la règle corrigée.

Un test de parité doit-il comparer les tables de base de données ?

Comparez les changements d'état métier et les invariants, pas des structures de table identiques. Une architecture moderne peut stocker autrement tout en produisant les mêmes faits validés, messages et comportements visibles.

Comment tester sans risque les effets externes ?

Remplacez les frontières de paiement, courriel, fichier, impression et partenaire par des enregistreurs qui capturent la commande finale sans l'exécuter. Comparez la charge utile, le routage, la multiplicité, le résultat transactionnel et les reprises.

Quand la preuve de parité suffit-elle pour basculer ?

Elle suffit quand les opérations critiques et cas à risque sont représentés, les exécutions sont répétables, les effets correspondent et aucun écart critique ne reste sans décision. Publiez les corrections approuvées et les frontières non testées avec les réussites.