web-dev-qa-db-fra.com

Devrait-il y avoir des tests unitaires pour les expressions régulières complexes?

Dois-je écrire des tests unitaires pour les expressions régulières complexes dans mon application?

  • D'une part: ils sont faciles à tester car le format d'entrée et de sortie est souvent simple et bien défini, et ils peuvent souvent devenir si complexes que les tests spécifiques sont donc précieux.
  • D'un autre côté: ils font eux-mêmes rarement partie de l'interface d'une unité. Il pourrait être préférable de ne tester que l'interface et de le faire d'une manière qui teste implicitement les expressions rationnelles.

ÉDITER:

Je suis d'accord avec Doc Brown qui dans son commentaire note qu'il s'agit d'un cas spécial de test unitaire des composants internes .

Mais comme les regexes des composants internes ont quelques caractéristiques spéciales:

  1. Un regex sur une seule ligne peut être vraiment complexe sans être vraiment un module séparé.
  2. Les regexes mappent l'entrée à la sortie sans aucun effet secondaire et sont donc très faciles à tester séparément.
34
Lii

Mis à part le dogmatisme, la vraie question est de savoir s'il apporte une valeur à un test unitaire d'expressions régulières complexes. Il semble assez clair qu'il fournit de la valeur (que la regex fasse partie d'une interface publique ou non) si la regex est suffisamment complexe, car elle vous permet de trouver et de reproduire des bogues et d'éviter les régressions.

102
JacquesB

Regex peut être un outil puissant, mais ce n'est pas un outil auquel vous pouvez vous fier pour continuer à travailler si vous apportez des modifications même mineures à des regex complexes.

Créez donc de nombreux tests qui documentent les cas qu'il doit couvrir. Et créez de nombreux tests qui documentent les cas où il devrait échouer, s'il est utilisé pour la validation.

Chaque fois que vous devez changer vos expressions régulières, vous ajoutez les nouveaux cas en tant que tests, modifiez vos expressions régulières et espérez le meilleur.

Si j'étais dans une organisation qui en général n'utilisait pas de tests unitaires, j'écrirais quand même un programme de test qui testerait toutes les expressions rationnelles que nous utiliserions. Je le ferais même à mon propre rythme si je le devais, mes cheveux n'ont plus besoin de perdre de couleur.

21
Bent

Les expressions régulières sont du code avec le reste de votre application. Vous devez tester que le code fait globalement ce que vous attendez de lui. Cela a plusieurs objectifs:

  • Les tests sont une documentation exécutable. Il montre clairement ce que vous devez faire pour le code. S'il est testé, c'est important.
  • Les futurs mainteneurs peuvent être certains qu'en les modifiant, les tests garantiront que le comportement reste inchangé.

Comme il y a un obstacle supplémentaire à surmonter en ayant du code dans un langage différent intégré au reste, vous devriez très probablement accorder cette attention supplémentaire au profit de la maintenance.

En bref, vous devez tester votre application, point final. Que vous testiez votre regex avec des tests automatisés qui l'exécutent de manière isolée, dans le cadre d'une plus grande boîte noire ou si vous vous contentez de la manipuler à la main, cela est secondaire au point que vous devez vous assurer qu'il fonctionne.

Le principal avantage des tests unitaires est qu'ils permettent de gagner du temps. Ils vous permettent de tester la chose autant de fois que vous le souhaitez maintenant ou à tout moment dans le futur. S'il y a une raison de croire que votre regex sera à tout moment refactorisé, modifié, obtiendra plus de contraintes, etc., alors oui, vous voulez probablement des tests de régression pour cela, ou quand vous le changez, vous devrez aller à travers une heure de réflexion sur tous les cas Edge afin que vous ne le cassiez pas. Cela, ou vous apprenez à vivre avec peur de votre code et ne le changez tout simplement jamais.

1
sara