Tester les valeurs qui matchent et celles qui ne doivent pas matcher
Un bon jeu de tests regex doit contenir des valeurs qui doivent matcher et des valeurs qui doivent être rejetées.
Tester uniquement des exemples valides peut masquer de gros problèmes, car une regex trop permissive peut accepter presque n’importe quoi.
Pour chaque pattern, préparez des exemples qui prouvent que la regex accepte le format attendu et rejette les saisies mal formées.
Utiliser des saisies réalistes
Les regex échouent souvent lorsqu’elles rencontrent de vraies saisies utilisateur plutôt que des exemples propres et artificiels.
Les utilisateurs peuvent ajouter des espaces, retours à la ligne, accents, majuscules, séparateurs ou valeurs incomplètes.
Tester avec des données réalistes permet de décider si la regex doit être stricte, flexible ou précédée d’une étape de normalisation.
Inclure des cas limites
Les cas limites sont les valeurs proches de la frontière entre ce que la regex doit accepter et ce qu’elle doit refuser.
Testez par exemple la valeur valide la plus courte, la plus longue, une valeur trop courte d’un caractère et une valeur trop longue d’un caractère.
Ces cas révèlent les erreurs de longueur, les ancres manquantes et les quantificateurs trop larges ou trop stricts.
Tester attentivement les ancres
Les ancres changent profondément le comportement d’une regex.
Un pattern sans ancre peut trouver un fragment valide dans une chaîne invalide plus grande, tandis qu’un pattern ancré valide toute la saisie.
Pour les regex de validation, ajoutez toujours des tests avec des caractères en trop avant ou après la valeur attendue.
Tester les flags et les modes
Les flags peuvent modifier complètement le résultat d’une regex.
Le mode insensible à la casse, le mode multiligne ou le mode global peuvent changer ce qui est matché et la manière dont les résultats sont retournés.
Quand vous documentez ou déployez une regex, testez-la avec exactement les mêmes flags que ceux utilisés en production.
Tester séparément extraction et validation
La validation et l’extraction sont deux usages différents.
Une regex de validation vérifie généralement toute la saisie, tandis qu’une regex d’extraction recherche une valeur dans un texte plus grand.
Ne réutilisez pas aveuglément les mêmes tests. Les patterns d’extraction doivent être testés dans des phrases, logs, textes collés et données bruitées.
Tester les remplacements
Lorsqu’une regex sert à remplacer du texte, le match n’est que la moitié du test.
Il faut aussi vérifier le résultat final après remplacement, surtout avec des groupes capturants, lookarounds ou backreferences.
Les tests de remplacement sont importants pour masquer, nettoyer, formater ou transformer du texte sans créer d’erreurs.
Tester dans le moteur regex cible
Les moteurs regex ne supportent pas tous les mêmes fonctionnalités et peuvent interpréter certaines syntaxes différemment.
Un pattern qui fonctionne en PCRE peut ne pas fonctionner en JavaScript, et la syntaxe de remplacement peut varier selon les langages.
Testez toujours les regex destinées à la production dans le même moteur, le même langage et le même environnement que ceux réellement utilisés.
Conserver un jeu de tests réutilisable
Les regex importantes devraient avoir un jeu de tests réutilisable, et pas seulement quelques vérifications manuelles.
Conservez les exemples valides, invalides et les cas limites à côté du code ou de la documentation où la regex est maintenue.
Cela rend les évolutions futures plus sûres, car vous voyez immédiatement si une modification améliore le pattern ou casse un comportement existant.