JMeter : Trouver le bon élément dans une liste avec les expressions régulières et en mode ligne unique

Voici un billet pour parler des expressions régulières (regexp) avec JMeter. L’élément Extracteur d’expressions régulières est très utile dans les scénario JMeter pour extraire des données de la réponse reçues suite à une requête. Par contre, il n’est pas toujours facile d’avoir (de trouver) la bonne regexp…

J’ai mis quelques heures pour trouver cette regexp qui était nécessaire pour la préparation d’un scénario de test de charges JMeter. J’ai même adapté un petit programme Java/Swing testeur de regexp style Java pour qu’il devienne un programme testeur de regexp Jakarta ORO, celui du JMeter, ceci afin de tester plus vite les différentes regexp.

Commençons, soit le texte de réponse d’une requête HTTP (utilisant en fait SOAP/XML-RPC) suivant :

<ClientBean>
<id>765432</id>
<code>1.87665308</code>
<nom>JAMES BOND</nom>
<statutNumAppel>Inactif</statutNumAppel>
</ClientBean>
<ClientBean>
<id>765432</id>
<code>1.33333333</code>
<nom>LARGO WINCH</nom>
<statutNumAppel>Inactif</statutNumAppel>
</ClientBean>
<ClientBean>
<id>765432</id>
<code>1.87999999</code>
<nom>BENGAMIN GATES</nom>
<statutNumAppel>Actif</statutNumAppel>
</ClientBean>
<ClientBean>
<id>765432</id>
<code>1.23334444</code>
<nom>EMMA PEAL</nom>
<statutNumAppel>Inactif</statutNumAppel>
</ClientBean>

Cette liste est dynamique (on n’a pas toujours 4 éléments, celui ayant le statut d’actif n’est pas toujours à cette position (ici 3ème) et les valeurs bien entendues changent pour chaque requête du test).

Comment faire pour extraire le code « 1.87999999 » correspondant au même ID 765432 pour chaque élément de cette liste, et qui est celui « Actif » ? Le tout avec une expression régulière JMeter ?

Avant de commencer, je rappelle que l’analyseur d’expressions régulières de JMeter est Jakarto ORO. Celui-ci fourni un moteur qui reproduit le comportement du moteur d’expressions régulières de Perl v5.003. On peut donc se référer à la documentation de Perl pour comprendre les expressions régulières.

NB. Depuis la version 2.4 de JMeter, le récepteur Arbre de résultats propose une vue Testeur de RegExp qui permet de tester une expression régulière directement sur la réponse de la requête reçue.

Pour revenir à notre question. Tout d’abord, il faut passer en mode ligne unique au niveau de l’analyseur de regexp, pour cela, on utilise un « modificateur » Perl. Un modifier sert à changer le comportement de l’analyseur.

Le modificateur « ligne unique» est à ajouter dans l’expression régulière. Aussi, on place en début de la regexp, la chaîne suivante : « (?s) »

Maintenant, avec le (?s), les caractères de fin de ligne « \n » sont considérés comme n’importe quel caractère, (symbolisé par le point « . » dans une regexp), ce qui signifie que le texte à analyser devient un grand texte d’une seule ligne du point de vue de l’analyseur.

Ensuite la grosse difficulté est que l’on veut le code pour l’élément qui en statutNumAppel à Actif. La première idée de regexp est :

(?s)code>(.+?)</code.+?statutNumAppel>Actif

Malheureusement, cela ne fonctionnera pas, car on se trouve toujours avec le premier ‘code’ (ici 1.87665308). Pourquoi, car le deuxième « .+? » va englober tous les caractères entre la première occurrence du code et le statut Actif.

Pour indiquer à l’analyseur de regexp que l’on veut « le code qui est collé à l’Actif », il faut être un peu plus explicite. Cette regexp sera la bonne (après une bonne cinquantaine de tentative et relecture de la documentation des regexp) :

(?s)(?:>.+?</code.+){0,}>(.+?)</code.+?Actif

Celle-ci indique :

  • Avec le (?:>.+?</code.+) on indique un groupement (grâce aux parenthèses) que l’on ne veut pas enregistrer dans une variable $x$ à cause du ?: situé au début.
  • Avec {0,} on indique que l’on veut ce groupement (?:>.+?</code.+) de 0 à n fois, l’analyseur doit donc rechercher toutes les occurrences du code.
  • Avec le deuxième >(.+?)</code.+ on ‘surprend‘ l’analyseur pour lui dire que finalement on ne veut pas toutes les occurrences, mais les occurrences N – 1 dans le groupement précédent
  • Avec le Actif on lui précise que l’on veut l’occurrence N du ‘code’ suivie par le statut Actif.

Et voilà, c’est ‘simple’, une fois que l’on a trouvé… 😉

En complément,

a) JMeter est par défaut en mode multiligne (pour l’avoir explicitement, il faut « (?m) en début d’expression régulière.

b) En mode ligne unique « (?s) », le début de la ligne est représentée par l’accent circonflexe « ^ », et la fin de ligne par le signe dollar « $ »

Pour en savoir plus sur les expressions régulières au niveau JMeter :

Pour tester ses regexp en dehors de JMeter :

./