Unité 9 / 11

Tests de régression, maintenance des tests et lutte contre les tests fragiles

Gains :

  • Comprendre le but des tests de régression et être capable de sélectionner des tests et de produire des cas de régression en fonction des changements grâce à l'intelligence artificielle
  • Capacité à diagnostiquer les causes profondes des tests fragiles (synchronisation, dépendance d'ordre, état partagé, dépendance externe) et à appliquer des solutions permanentes sans supprimer le symptôme
  • Capacité à maintenir la discipline d'exécution de la version préliminaire du package complet tout en gardant la suite de régression rapide, indépendante et fiable en éliminant les tests en double

Le logiciel change constamment ; Chaque nouvelle fonctionnalité, chaque correctif peut casser quelque chose qui fonctionnait auparavant. La perturbation ultérieure d'une fonction qui fonctionnait auparavant est appelée régression. Les tests de régression consistent à retester les fonctionnalités existantes à chaque modification pour détecter ces dégradations. Au fil du temps, ces suites de tests s'agrandissent (des milliers de tests) et deux problèmes majeurs surviennent : la suite ralentit et les tests irréguliers (des tests peu fiables qui réussissent et échouent parfois dans le même code) détruisent la confiance de l'équipe dans les résultats des tests. L'intelligence artificielle (IA) est une aide puissante pour maintenir la suite de régression bien entretenue, rapide et fiable. Mais la mise en garde principale demeure : si l’IA peut proposer de « faire passer » un test fragile, elle peut souvent produire un correctif qui masque un véritable bug. Votre travail consiste à trouver la cause profonde de l’instabilité, et non à supprimer le symptôme.

Causes profondes des tests fragiles

Les tests fragiles sont le problème de test le plus insidieux : il n'est pas fiable qu'ils réussissent ou échouent, ce qui pousse l'équipe à prendre l'habitude de "il a dû rester bloqué à nouveau, exécutez-le à nouveau" - et cette habitude ignorera un jour un vrai bug comme étant "flaky". Principales causes profondes :

  • Condition de timing/course : le test vérifie le résultat sans attendre la fin d'une opération. La raison la plus courante.
  • Dépendance d'ordre : les tests dépendent des données laissées les uns par les autres ; Il se casse lorsque l'ordre change.
  • Cas partagé : plusieurs tests utilisent les mêmes données de test/utilisateur, ce qui est en conflit.
  • Dépendance externe : réseau réel, service tiers, heure système, valeur aléatoire.
  • Différence d'environnement : passe en local, reste en CI (environnement d'intégration continue).
Attention : réussir un test fragile en « réessayant plusieurs fois » masquera souvent une véritable erreur de concurrence. Réessayer est un outil de diagnostic, pas un traitement. Trouvez d’abord la cause profonde ; N’utilisez la nouvelle tentative qu’en dernier recours en cas d’instabilité documentée et véritablement externe.

Maintenance des tests : garder le colis en bonne santé

La suite de régression est comme un jardin ; Si on n’en prend pas soin, les mauvaises herbes prendront le dessus. L'IA assiste dans trois tâches de maintenance :

1. Nettoyage de test en double/inutile. Au fil du temps, un grand nombre de cas s’accumulent testant la même chose. L'IA suggère de regrouper et de fusionner des tests similaires.

2. Diagnostic de test fragile. Vous donnez à l'IA le code de test et le modèle d'instabilité ; suggère des causes profondes possibles et une solution permanente.

3. Sélection/priorisation des tests. Il est coûteux d’exécuter l’intégralité du package à chaque modification. Grâce à l'analyse d'impact des tests (en sélectionnant uniquement les tests pertinents en fonction du code modifié), l'IA recommande quels tests doivent être exécutés en premier. Cependant, le package complet de pré-version est indispensable.

Quarantaine : gérer correctement les tests fragiles

Vous avez constaté qu'un test est fragile, mais vous n'avez pas le temps d'en corriger immédiatement la cause profonde. Ce qu'il faut faire? Il existe deux mauvaises manières : supprimer complètement le test (ce comportement n'est plus du tout conservé) ou le faire taire en réessayant (en masquant le vrai bug). La bonne méthode consiste à mettre en quarantaine (en séparant temporairement le test fragile du colis principal et en le suivant dans une liste distincte). Les tests en quarantaine n'empêchent pas la fusion des versions, mais restent une dette visible et sont régulièrement traités. Le point critique est le suivant : la quarantaine est une salle d’attente, pas une poubelle. Si la liste de quarantaine s'allonge, c'est le signe que la santé test de l'équipe se détériore. L'IA peut examiner périodiquement votre liste de quarantaine et la regrouper par modèles de causes profondes ; Il permet des solutions collectives en révélant des causes communes, telles que « les 6 tests sont connectés au même utilisateur de test partagé ».

Astuce : ajoutez un « propriétaire » et une « date de dernière révision » à chaque enregistrement de quarantaine. Les quarantaines abandonnées deviennent des dépotoirs permanents ; Les tests fragiles y vivent pour toujours parce que personne ne s'en soucie.

Tableau de stratégie de régression

Statut

Stratégie

Rôle de l'IA

correction mineure

Zone concernée + test de fumée

Sélectionnez les tests pertinents

nouvelle fonctionnalité

Module associé + intégration

Proposer un nouveau cas de régression

grand refactor

Package de régression complet

Analyse des écarts de couverture

pré-version

Forfait complet + exploration

Estimation de la priorité et de la durée

Correction en direct urgente

Chemin ciblé + critique

Ensemble de test de sécurité minimum

Invite faible/Invite forte

Faible : "Ce test échoue parfois, corrigez-le."
Fort : "Ce test échoue 3 exécutions sur 10, code inchangé. Diagnostiquer la cause première de l'instabilité : il peut s'agir d'un timing/course, d'une dépendance d'ordre, d'un état partagé, d'une dépendance externe ou d'une différence d'environnement.

Invite puissante ; oriente le diagnostic vers la cause profonde et interdit explicitement la suppression des symptômes.

Quatre modèles copiables

1) Diagnostic test fragile :

Ce code de test réussit parfois et échoue parfois sans changement. Répertoriez les causes profondes candidates (race, dépendance d'ordre, état partagé, dépendance externe, horloge/aléatoire, différence d'environnement) et montrez les éléments de preuve dans le test pour chacune. Proposer une solution permanente ; marquez la solution suppressive telle qu’une nouvelle tentative en dernier recours et avec justification. Test : [code] / Modèle d'instabilité : [combien de fois en combien d'exécutions]

2) Proposer un cas de régression :

Le changement suivant a été apporté : [modification/résumé PR]. Répertoriez les comportements ACTUELS que ce changement briserait et proposez un cas de test de régression pour chacun. Mettez particulièrement en évidence les zones d’effets secondaires et de dépendances partagées.

3) Nettoyage des tests en double :

Consultez la suite de tests ci-dessous. Regroupez les cas en double ou qui se chevauchent qui testent le même comportement ; Suggérez lesquels je devrais conserver et lesquels je devrais combiner pour chaque groupe. Avertir s'il existe un risque de perte de couverture. Tests : [liste/code]

4) Sélection de l'effet de test :

Les fichiers/fonctions suivants ont changé : [liste]. Dans la suite de tests existante, sélectionnez et justifiez les tests que je dois exécuter en premier (ceux qui sont directement/indirectement liés au code modifié). Remarque : rappelez-moi que je continuerai à exécuter la suite complète en version préliminaire.

trois mini-cases

Cas 1 — Véritable erreur dissimulée par Retry. Une équipe a ajouté 3 tentatives à un test occasionnel de paiement restant ; Le test était toujours « réussi » désormais. L'application du « test de diagnostic fragile » a révélé que l'instabilité provenait d'une véritable condition de concurrence critique : à charge élevée, la confirmation de paiement était parfois traitée deux fois. Pendant des mois, Retry a dissimulé un bug qui aurait pu entraîner une réelle perte d’argent en direct. Cause première corrigée, nouvelle tentative supprimée.

Cas 2 — Le colis a rétréci, la vitesse a augmenté. Une suite de régression de 1 400 tests a duré 55 minutes. Avec le « nettoyage des tests en double », 380 tests se sont révélés être des doublons ou couverts ; fusionné. Le package a été réduit à 900 tests, la durée a été réduite à 34 minutes et la couverture n'a pas été réduite de manière mesurable. Des retours plus rapides ont encouragé l’équipe à tester plus fréquemment.

Cas 3 — Dépendance de commande. Un test réussirait toujours localement, mais il échouerait de manière aléatoire en CI. Les diagnostics de l'IA ont montré que le test dépendait de l'utilisateur créé par un autre test, dans CI, il a échoué car les tests s'exécutaient dans un ordre parallèle/différent. Chaque test a été réalisé pour établir ses propres données ; L’indécision est terminée.

Erreurs courantes

  • Faire taire le test fragile avec une nouvelle tentative. Réessayer sans chercher la cause profonde ; dissimuler la véritable erreur.
  • Culture du « coincé à nouveau ». Ignorer systématiquement les résultats rouges ; Un jour, éviter la vraie erreur.
  • Ne pas tailler du tout le paquet. Permettre aux tests en double de s’accumuler et de ralentir le package.
  • Dépendance entre les tests. Les tests sont basés sur une condition/séquence commune ; source d’incertitude.
  • Tester uniquement la pièce modifiée et ignorer le package complet. Raccourci de pré-version ; Les effets secondaires cachés s’échappent.
  • S'appuyer sur une dépendance externe. Tests basés sur le réseau/horloge/valeur aléatoire réels ; naturellement instable.

En résumé

Les tests de régression détectent les modifications qui interrompent les fonctions qui fonctionnaient auparavant ; Mais à mesure que les packages se développent, la lenteur et la fragilité des tests érodent la confiance. Les causes profondes des tests fragiles sont généralement le timing, la dépendance à l’ordre, l’état partagé et les dépendances externes. L’IA est une aide puissante pour le diagnostic, le nettoyage et la sélection des tests ; Mais supprimer l’indécision en réessayant masque de véritables erreurs. Trouvez la cause première, effectuez les tests indépendants et déterministes, élaguez régulièrement le package, exécutez le package complet avant sa publication.

Tâche de candidature

Choisissez un test de votre propre projet dont vous savez qu'il est fragile (ou semble instable). Extrayez les causes premières potentielles et vérifiez les éléments de preuve dans le test avec le modèle de « diagnostic de test fragile ». Identifiez la cause première et mettez en œuvre une solution permanente sans réessayer. Sélectionnez ensuite 10 tests dans votre package et recherchez ceux qui peuvent être combinés avec le « nettoyage des tests en double ». Indiquez le nombre d'instabilités de test que vous avez résolues à partir de leur cause première et le nombre de cas inutiles que vous avez supprimés de la suite.

liste de contrôle

  • [ ] J'ai diagnostiqué la cause profonde du test fragile ; Je n'ai pas supprimé le symptôme.
  • [ ] J'ai considéré Réessayer comme un dernier recours justifié, pas comme un remède.
  • [ ] J'ai rendu les tests indépendants et déterministes (isolés des dépendances externes).
  • [ ] J'ai supprimé les tests en double/inutiles de la suite de régression.
  • [ ] J'ai choisi de tester en fonction du changement, mais j'ai exécuté la version préliminaire complète du package.
  • [ ] J'ai pris chaque rouge au sérieux, contre la culture du "coincé à nouveau, passe".