Par Danny Paradis : Architecte de solutions d'automatisation spécialisé en tests d'interface utilisateur.
16 mai 2024
Dernièrement, en mission chez l’un de mes clients, j’ai dû faire face au problème des tests instables dans le processus d’intégration et de livraison en continu (CI/CD). Les « flaky tests » ou tests instables sont ceux qui passent, parfois, et qui échouent, parfois, causant de l’instabilité dans la chaîne de tests. Je vous invite à prendre le temps de nous poser trois questions qui nous permettront de dégager des stratégies efficaces pour gérer les tests instables, d’explorer les raisons les plus communes à l’origine de ces résultats inattendus et d’identifier les causes racines les plus courantes.
Pourquoi est-il important de gérer les tests instables?
Moins de perte de temps : Les tests instables nécessitent souvent des réexécutions inutiles, ce qui entraîne le gaspillage de ressources et la perte du temps précieux des analystes techniques.
Augmentation du stress de livraison : L’imprédictibilité des tests instables occasionne du stress et surtout elle fait en sorte que les membres de l’équipe perdent l’intérêt, ce qui nuit au moral et la productivité.
Perte de confiance dans votre pipeline de test : Les résultats de tests, qu’il s’agisse de faux positifs ou de faux négatifs, entraînent une perte de confiance dans l’infrastructure de test. Il devient difficile pour les développeurs de se fier aux résultats, ce qui pourrait entraîner l’introduction de défauts dans la production.
Quelles sont les stratégies pour gérer les tests instables?
Instaurer une surveillance qui sera en mesure de vous produire un rapport des tests instables et leur pourcentage de fiabilité. Ce rapport vous aidera à suivre rapidement l’amélioration de l’exécution de votre suite de tests et vous permettra de prioriser la correction des tests problématiques.
Rouler vos tests le plus souvent possible, afin d’avoir un bon échantillonnage de l’état de vos tests.
Implémentez une mécanique de réessais temporaire. Réexécuter un test lorsqu’il échoue peut être une stratégie efficace pour gérer les erreurs intermittentes. Cela vous permettra, à court terme, de ne pas ajouter de bruit négatif dans les rapports de test. Méfiez-vous toutefois, car cela pourrait être comme un pansement cachant le problème. N’oubliez pas que vous n’avez que contourné le problème, alors continuez de travailler à enrailler les tests instables.
Désactiver l’exécution des tests en parallèle. Les tests en série peuvent aider à détecter les répercussions de l’exécution de certains tests sur l’exécution d’autres tests en même temps. Même chose pour les ressources de l’environnement.
Limiter l’impact des composants externes sur le code testé. On recommande d’éviter l’utilisation de composants externes comme un système tiers de carte de crédit qui effectue une maintenance pendant l’exécution de vos tests. L’objectif est de garantir que les tests se concentrent uniquement sur le comportement du code à tester, sans être perturbés par des facteurs externes.
Identifier les causes racines. Il essentiel de comprendre les raison qui font que les tests échouent pour résoudre le problème. Les raisons communes comprennent des environnements instables, des problèmes d’infrastructure de test, des « race conditions », des dépendances externes et aussi de vrais bogues!
Refactoriser le code de test. Passez en revue et refactorisez votre code de test pour améliorer la stabilité, réduire les faux positifs et rendre vos tests plus robustes et efficaces.
Mettre régulièrement à jour votre infrastructure de test. La maintenance et les mises à jour régulières de votre infrastructure de test peuvent garantir que celle-ci reste stable, fiable et dépourvue des problèmes connus qui peuvent contribuer à l’instabilité.
Peut-on dégager les causes racines les plus courantes des tests instables?
Tests aléatoires : L’utilisation de données aléatoires pour vos tests garantit seulement une chose : des tests instables. Un test doit toujours produire le même résultat pour valider un comportement attendu.
Synchronisation des pages : Un exemple de problème fréquent survient lorsque le test essaie de cliquer sur un bouton qui n’est pas encore apparu sur la page. Cependant, cette difficulté fréquemment rencontrée avec Selenium tend à être résolue avec l’émergence de nouveaux outils tels que Playwright.
Validation du temps : Certains tests nécessitent de se poser des questions sur la vraie validation que l’on souhaite effectuer. Par exemple, le temps des agents qui exécutent les tests n’est peut-être pas sur le même fuseau horaire ou encore vos infrastructures ne sont pas toutes au même endroit.
Parallélisme : L’exécution en parallèle est très utile afin d’accélérer l’exécution de votre suite de tests, mais en contrepartie, elle peut facilement introduire des résultats de tests instables. Par exemple un test qui s’attend à trouver 10 éléments dans une liste, mais qui est impacté par un autre test qui en supprime un. Veillez à ce que vos tests soient tous indépendants les uns des autres, en ce qui a trait aux données.
Jeux de données : Un jeu de données utilisé par plusieurs tests demande une planification minutieuse de son utilisation, afin d’éviter les faux positifs, introduits par l’ordre aléatoire d’exécution des tests.
Environnements : Restez en contact avec votre équipe d’infrastructure pour être informé des activités susceptibles d’affecter vos tests. Il n’est pas rare que des tests de nuit soient impactés par des sauvegardes hebdomadaires.
Comme vous l’avez sans doute compris, la gestion des tests instables est une tâche cruciale pour assurer une chaîne de tests stable et efficace. En appliquant des stratégies telles que l’identification des causes racines, les réessais, la désactivation du parallélisme, la refactorisation du code et la surveillance régulière, vous pouvez considérablement réduire l’occurrence de tests instables, améliorant ainsi la fiabilité globale des tests et la productivité de l’équipe.
Oui, c’est possible! Maintenant, les 1000 tests de mon client roulent avec un succès complet tous les jours. Les tests instables, ces fameux « flaky tests », ont disparu, ce qui nous permet de détecter avec assurance une régression. N'hésitez pas à partager vos réflexions et expériences dans les commentaires ci-dessous!
Prêt à éliminer les « flaky tests » de votre processus CI/CD? Découvrez comment optimiser votre suite de tests dès maintenant pour garantir une exécution sans faille et gagner en fiabilité grâce à l'expertise de l'un de nos experts!
Comments