Devrais-je écrire des tests unitaires pour les expressions régulières complexes dans mon application?
- D'une part, ils sont faciles à tester, car les formats d'entrée et de sortie sont souvent simples et bien définis, et ils peuvent souvent devenir si complexes que leurs tests sont particulièrement utiles.
- Par contre, ils font rarement partie de l'interface d'une unité. Il serait peut-être préférable de ne tester que l'interface et de le faire d'une manière qui teste implicitement les expressions rationnelles.
MODIFIER:
Je suis d'accord avec Doc Brown qui, dans son commentaire, note qu'il s'agit d'un cas particulier de test unitaire de composants internes .
Mais comme composants internes, les expressions rationnelles ont quelques caractéristiques spéciales:
- Une regex sur une seule ligne peut être vraiment complexe sans être vraiment un module séparé.
- Les regex associent l'entrée à la sortie sans aucun effet secondaire et sont donc très faciles à tester séparément.
Réponses:
Mis à part le dogmatisme mis à part, la vraie question est de savoir s'il apporte de la valeur aux expressions régulières complexes du test unitaire. Il semble assez clair que cela apporte de la valeur (que la regex fasse ou non partie d'une interface publique) si la regex est suffisamment complexe, car cela vous permet de rechercher et de reproduire des bogues et d'éviter les régressions.
la source
isValid
,parse
,tryParse
ou tout le reste, selon exactement comment il est utilisé), alors que le code client n'a pas besoin de savoir qu'il est actuellement implémenté en utilisant une expression régulière. L’unité d’emballage disposerait alors de tests détaillés qui - là encore - n’auraient pas besoin de connaître l’implémentation actuelle. Bien sûr, ces tests testent de facto la regex, mais d’une manière indépendante de la mise en œuvre.FooValidator
pour ses entrées et sorties, alors vous ne vous inquiétez pas de la façon dont cela se fait. ++Regex peut être un outil puissant, mais ce n’est pas un outil sûr, mais qui fonctionne quand même si vous apportez des modifications même mineures à des regex complexes.
Créez donc de nombreux tests qui documentent les cas qu’il devrait couvrir. Et créez de nombreux tests qui documenteront les cas où il devrait échouer, s’il est utilisé pour la validation.
Chaque fois que vous devez modifier vos expressions rationnelles, vous ajoutez les nouveaux cas en tant que tests, modifiez-les et espérez que tout ira pour le mieux.
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 permettant de tester toutes les expressions rationnelles que nous utiliserions. Je le ferais même pendant mon temps libre, mes cheveux n’auraient pas besoin de perdre plus de couleur.
la source
Les expressions régulières sont du code avec le reste de votre application. Vous devriez vérifier que le code global fait ce que vous attendez de lui. Cela a plusieurs objectifs:
Comme il existe un obstacle supplémentaire à surmonter en ayant un code dans une langue différente intégrée au reste, vous devriez probablement accorder cette attention supplémentaire au bénéfice de la maintenance.
la source
En bref, vous devriez tester votre application, un point c'est tout. Que vous testiez votre regex avec des tests automatisés qui l'exécutent de manière isolée, dans le cadre d'une boîte noire plus grande ou que vous le manipuliez à la main, est secondaire au point où vous devez vous assurer que cela 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 ou à tout moment dans le futur. S'il y a une quelconque raison de croire que votre expression rationnelle sera à tout moment refactorisée, modifiée, si vous obtenez plus de contraintes, etc., alors oui, vous voulez probablement des tests de régression, ou si vous le modifiez, vous devrez aller au cours d’une heure de réflexion sur tous les cas critiques afin que vous n’ayez pas rompu. Ou alors vous apprenez à vivre avec la peur de votre code et ne le changez jamais.
la source
Je pense qu'avec ça tu y as répondu toi-même. Les regex dans une unité sont très probablement un détail d'implémentation.
Ce qui va pour tester votre SQL va probablement aussi pour les regex. Lorsque vous modifiez un élément SQL, vous devez probablement l'exécuter manuellement sur un client SQL pour voir s'il donne les résultats escomptés. Il en va de même lorsque je modifie une expression rationnelle, j'utilise un outil d'expression régulière avec des exemples d'entrées pour voir s'il fait ce que j'attendais.
Ce que je trouve utile, c’est un commentaire près de la regex avec un échantillon de texte auquel il devrait correspondre.
la source
Si vous devez demander, la réponse est oui.
Supposons que FNG pense qu'il peut "améliorer" votre regex. Maintenant, il est un FNG, donc automatiquement un idiot. Exactement le genre de personne qui ne devrait jamais toucher votre précieux code! Mais peut-être qu'il est lié au PHB ou à quelque chose du genre , alors vous ne pouvez rien faire.
Sauf que vous savez que le PHB va vous traîner en arrière et crier vers ce projet pour "peut-être donner au gars des indications sur la façon dont vous avez créé ce gâchis" quand tout va mal. Donc, vous écrivez tous les cas que vous avez soigneusement pris en compte lors de la construction de votre beau chef-d'œuvre d'expression.
Et puisque vous les avez toutes écrites, vous avez deux tiers du temps nécessaire pour avoir un ensemble de tests élémentaires, car, avouons-le, les scénarios de test regex sont extrêmement faciles à exécuter une fois que vous avez construit le cadre.
Alors maintenant, vous avez un ensemble de conditions de bord, d'alternatives et de résultats attendus. Et tout à coup, les cas de test constituent la documentation, comme promis dans tous ces articles de blog trop agiles. Vous venez de faire remarquer à la FNG que si son "amélioration" ne réussissait pas les tests existants, ce n'était pas vraiment une amélioration, n'est-ce pas? Et où sont ses nouveaux cas de test proposés qui démontrent un problème avec le code original, puisque cela fonctionne, il n'a pas besoin d'être modifié, jamais !!!
la source