JMeter & Les Extractions variables..... de Variables

617 views
Skip to first unread message

jean.marie...@gmail.com

unread,
Sep 24, 2013, 5:24:34 AM9/24/13
to jmet...@googlegroups.com

Bonjour à tous,

 

Je reviens à vous afin d’avoir votre avis sur une méthode efficace à utiliser pour l’extraction de variables.

 

Voici le problème. J

 

Dans un scénario de test, je reçois comme résultat d’une requête http les éléments suivants :

 

Variables identifiées :

 

·        N°Client

·        Nom

·        Prénom

·        Adresse

 

…….

 

·        Block

·        Titre

·        Auteurs

·        Editeurs

·        Code EAN

 

·        Block

·        Titre

·        Auteurs

·        Editeurs

·        Code EAN

 

·        Block

·        Titre

·        Auteurs

·        Editeurs

·        Code EAN

 

…….

 

·        Code Client

·        Remise

·        Compta

·        Date Achat

 

 

Comme vous pouvez le constater s’il s’agit d’information relative à un client qui achète des livres.

La particularités c’est que tous les clients n’achètent pas tous 3 livres, certains en achètent 1 et  d’autres peuvent en avoir 4, 5,…

 

Mon problème c’est de trouver une méthode pour récupérer les « Block » de variables.

Actuellement j’utilise les composant :

 

·        Extracteur CSS/JQuery

o   Nom de référence : Block_1

o   Expression CSS/JQuery : input[name=Block]

o   Attribut : Value

o   Récupérer la Nème corresp. : 1

o   Valeur par défaut : **  ERROR  -  Block_1  **

·        Assertion Réponse

o   Appliqué sur une variable : Block_1

o   Type de correspondance du motif : Est égale à (texte brut)

o   Motif à tester : **  ERROR  -  block_1  **

 

 

·        Extracteur CSS/JQuery

o   Nom de référence : Block_2

o   Expression CSS/JQuery : input[name=Block]

o   Attribut : Value

o   Récupérer la Nème corresp. : 2

o   Valeur par défaut : **  ERROR  -  Block_2  **

·        Assertion Réponse

o   Appliqué sur une variable : Block_2

o   Type de correspondance du motif : Est égale à (texte brut)

o   Motif à tester : **  ERROR  -  block_2  **

 

 

·        Extracteur CSS/JQuery

o   Nom de référence : Block_3

o   Expression CSS/JQuery : input[name=Block]

o   Attribut : Value

o   Récupérer la Nème corresp. : 3

o   Valeur par défaut : **  ERROR  -  Block_3  **

·        Assertion Réponse

o   Appliqué sur une variable : Block_3

o   Type de correspondance du motif : Est égale à (texte brut)

o   Motif à tester : **  ERROR  -  block_3  **

 

 

Et je répète la séquence pour les 3 blocks.

Le résultat est correcte sauf si j’ai un client qui achète un nombre différent de 3 livres. J

 

Auriez-vous une idée sur une méthode qui éviterait ce problème.

 

Merci d’avance.

 

Vincent Daburon

unread,
Sep 26, 2013, 10:09:21 AM9/26/13
to jmet...@googlegroups.com
Bonjour,

Il faut mettre -1 dans le champ Match No.

====================================================
Match No. Indicates which match to use. The CSS/JQuery selector may match multiple times.
  • Use a value of zero to indicate JMeter should choose a match at random.
  • A positive number N means to select the nth match.
  • Negative numbers are used in conjunction with the ForEach controller - see below.

If the match number is set to a negative number, then all the possible matches in the sampler data are processed. The variables are set as follows:

  • refName_matchNr - the number of matches found; could be 0
  • refName_n, where n = 1,2,3 etc - the strings as generated by the template
  • refName - always set to the default value
====================================================================
Si le nom de ton parametre est : P_BLOCK et que tu as 4 valeurs trouvées (et qui peut changer)
Tu auras comme variables crées dans JMeter

P_BLOCK_matchNr   = 4
P_BLOCK_1 = valeur du bloc 1
P_BLOCK_2 = valeur du bloc 2
P_BLOCK_3 = valeur du bloc 3
P_BLOCK_4 = valeur du bloc 4

et si pas de bloc alors P_BLOCK_matchNr   = 0

Cordialement
Vincent D.

jean.marie...@gmail.com

unread,
Sep 27, 2013, 5:17:37 AM9/27/13
to jmet...@googlegroups.com

onjour Vincent,
 
Tout grand merci pour l'info. C'EST GENIAL et cette solution est mieux que ce que je pouvais espérer.
De plus, dans cette requête j'ai essayé la valeur -1 pour les autres variables à extraire et j'ai même pu récupérer des variables qui étaient passées au travers du filet :)
 
Par ailleurs, j'ai quand même une autre question concernant l'injection des variables extraites dans les requêtes suivantes.
En effet, en revenant sur mon exemple j'ai le cas suivant :
 

Variables identifiées :

 Block = ${Block_1}
 Titre =  ${Titre_1}
 Auteurs =  ${Auteurs_1}
 Editeurs =  ${Editeurs_1}
 CodeEAN =  ${CodeEAN_1}
 
 Block =  ${Block_2}
 Titre =  ${Titre_2}
 Auteurs =  ${Auteurs_2}
 Editeurs =  ${Editeurs_2}
 CodeEAN =  ${CodeEAN_2}

 Block =  ${Block_3}
 Titre =  ${Titre_3}
 Auteurs =  ${Auteurs_3}
 Editeurs =  ${Editeurs_3}
 CodeEAN =  ${CodeEAN_3}
Que j'ai taper manuellement mais ma question est de savoir comment faire dans JMeter pour ajouter par exemple les variables relatives au block 4 c'est-à-dire ${Block_4}.... lorsque j'ai un client qui a acheté 4 livres voir plus. J'aurai ta technique pour l'extraction des variables mais je me trouverai dans la situation suivante :
 
Idem que précédement avec en plus un bloc supplémentaire et la question : "Comment dire à JMeter de prendre lui-même les variables ${Block_4}....
 
 Block =  
 Titre =  
 Auteurs = 
 Editeurs =  
 CodeEAN = 
J'ignore si cela est faisable mais d'avance je remercie tout ceux qui m'ont déjà aidé.
 
Amicalement,
 
 
 
 
 

Vincent Daburon

unread,
Sep 27, 2013, 7:05:19 AM9/27/13
to jmet...@googlegroups.com
Bonjour,

Je pense que pour les requêtes HTTP POST avec un nombre de paramètres variables (un coup 3 un coup 5 ...) il faut créer une chaine de caractères par Bean Shell ou javascript ou Groovy pour la passer dans un POST en mode POST Body

http://jmeter.apache.org/usermanual/component_reference.html#HTTP_Request

Pour voir à quoi ressemble la requête, il faut prendre un "Listener View Results Tree" et dans l'onglet "Request" prendre la partie
POST data:
parametre1=valeur1&parametre2=valeur2&parametre3=valeur3&parametre4=valeur4 ... parametre10= valeur10.

C'est ce type de chaine de caractères qui faut créer en faisant attention à l'encodage des paramètres pour les caractères spéciaux (comme le &)


Une autre solution est de prévoir quelques cas ou requêtes HTTP avec 1 ou 2 ou 3 ou 4 paramètres et tester le nombre de paramètre avec un IF et choisir la bonne requete en fonction du nombre de paramètres (donc autant de Sampler HTTP que de cas possibles).
C'est surement plus facile a faire mais limite le nombre de paramètres possibles ce qui dans la pratique n'est pas très grave.



Cordialement
Vincent D.

jean.marie...@gmail.com

unread,
Oct 24, 2013, 5:36:11 AM10/24/13
to jmet...@googlegroups.com
Bonjour à tous,
 
Je vous remercie beaucoup pour l'aide. De plus, je tiens quand même vous affirmer que l'ensemble des solutions apportées ont toutes été utilisées suivant le contexte à différent moment dans le même scénario.
 
Par ailleurs, je me retrouve avec un problème de variables et j'ignore comment l'aborder.
 
Dans mon scénario, je récupère les valeurs de toute une série de variables via les Extracteurs d'expressions régulières.
Lorsque je réinjecte ces valeurs par la suite dans d'autres Requêtes HTTP, je me trouve face à une erreur.
 
En comparant l'URL envoyée manuellement via l'IE avec l'URL envoyée par JMeter, j'ai constaté une différence de syntaxe :
 
Exemple :
 
URL JMeter :  Le Titre du Livre
URL I.E.  :       Le%20Titre%20du%20Livre
 
Donc, c'est simple : 
  • J'utilise l'Extracteurs d'expressions régulières pour récupérer la valeur. C'est OK
  • Je transforme les "espace" par  %20  -- Oui mais comment ?
  • Je remets à jour avec la valeur corrigée.
 
Le problème c'est que je n'ai aucune idée sur l'approche à suivre.
 
J'aurais souhaité que l'on me mette le pied à l'étrier.
 
Merci d'avance pour votre aide.
 
 
 
 
 
 

Milamber

unread,
Oct 24, 2013, 6:00:53 AM10/24/13
to jmet...@googlegroups.com

Le 24/10/2013 10:36, jean.marie...@gmail.com a ecrit :
Bonjour à tous,
 
Je vous remercie beaucoup pour l'aide. De plus, je tiens quand même vous affirmer que l'ensemble des solutions apportées ont toutes été utilisées suivant le contexte à différent moment dans le même scénario.
 
Par ailleurs, je me retrouve avec un problème de variables et j'ignore comment l'aborder.
 
Dans mon scénario, je récupère les valeurs de toute une série de variables via les Extracteurs d'expressions régulières.
Lorsque je réinjecte ces valeurs par la suite dans d'autres Requêtes HTTP, je me trouve face à une erreur.
 
En comparant l'URL envoyée manuellement via l'IE avec l'URL envoyée par JMeter, j'ai constaté une différence de syntaxe :
 
Exemple :
 
URL JMeter :  Le Titre du Livre
URL I.E.  :       Le%20Titre%20du%20Livre
 
Donc, c'est simple : 
  • J'utilise l'Extracteurs d'expressions régulières pour récupérer la valeur. C'est OK
  • Je transforme les "espace" par  %20  -- Oui mais comment ?

Tu peux utiliser la toute nouvelle fonction __urlencode (qui vient d'apparaître dans la version 2.10 de JMeter)
http://jmeter.apache.org/usermanual/functions.html#__urlencode

Mais bon, si jamais tu utilises la variable de ta regexp ("Le Titre du Livre") directement dans une requête HTTP en tant que paramètre, il y a la coche à cocher "Encodage" qui le fera pour toi.

A+


  • Je remets à jour avec la valeur corrigée.
 
Le problème c'est que je n'ai aucune idée sur l'approche à suivre.
 
J'aurais souhaité que l'on me mette le pied à l'étrier.
 
Merci d'avance pour votre aide.
 
 
 
 
 
 
--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes JMeter en français.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, envoyez un e-mail à l'adresse jmeter-fr+...@googlegroups.com.
Pour envoyer un message à ce groupe, adressez un e-mail à jmet...@googlegroups.com.
Visitez ce groupe à l'adresse http://groups.google.com/group/jmeter-fr .
Pour plus d'options, visitez le site https://groups.google.com/groups/opt_out .

jean.marie...@gmail.com

unread,
Oct 24, 2013, 7:05:38 AM10/24/13
to jmet...@googlegroups.com
Bonjour Milamber,
 
Merci pour ta réponse, je pense que c'est ce que je recherche.
 
Pour être plus précis, voici la séquence:
 
  • Requête HTTP
    • Extracteur d'expression Régulière :
      • Nom de la référence : VarTitre
  • Requête HTTP
    • Paramètres                         Valeur                           Encodage           Inclure égale ?
    •  pTitreLivre                        ${VarTitre}                              v                            v
 
A ce stade j'ai aussi vérifié en cochant la case Encodage  --->  Quelque soit le choix je n'ai eu aucun effet. comparaison entre JMeter et IE via le Tools Fiddler.
 
Je me trouve avec la variable ${VarTitre} :  Le Grand Bleu
 
Or je dois avoir : Le%20Grand%Bleu
 
En ce qui concerne ta solution, je vais essayer de remplacer dans la requête ${VarTitre}  par ${__urlencode(${VarTitre})}
 
Dès que j'aurai testé, je reviens pour un feedback
 
Encore tout grand merci pour le coup de main.
 

Milamber

unread,
Oct 24, 2013, 8:09:03 AM10/24/13
to jmet...@googlegroups.com

Le 24/10/2013 12:05, jean.marie...@gmail.com a ecrit :
Bonjour Milamber,
 
Merci pour ta réponse, je pense que c'est ce que je recherche.
 
Pour être plus précis, voici la séquence:
 
  • Requête HTTP
    • Extracteur d'expression Régulière :
      • Nom de la référence : VarTitre
  • Requête HTTP
    • Paramètres                         Valeur                           Encodage           Inclure égale ?
    •  pTitreLivre                        ${VarTitre}                              v                            v
 
A ce stade j'ai aussi vérifié en cochant la case Encodage  --->  Quelque soit le choix je n'ai eu aucun effet. comparaison entre JMeter et IE via le Tools Fiddler.
 
Je me trouve avec la variable ${VarTitre} :  Le Grand Bleu

C'est normal.


 
Or je dois avoir : Le%20Grand%Bleu

Si tu coches Encodage, et que tu exécutes ton test, dans l'arbre de résultats, au niveau de la requête, normalement tu as bien Le%20Grand%Bleu ? non?

A+

 
En ce qui concerne ta solution, je vais essayer de remplacer dans la requête ${VarTitre}  par ${__urlencode(${VarTitre})}
 
Dès que j'aurai testé, je reviens pour un feedback
 
Encore tout grand merci pour le coup de main.
 

Thomas RICOU

unread,
Oct 24, 2013, 8:23:59 AM10/24/13
to JMeter FR
Salut,

J'ai eu un truc similaire, je lis des url dans un fichier csv préalablement forgé par un script qui a mis parfois l'url "/webservice/param1/param avec des espaces". Le compostant "source de données CSV" remplit la variable "url" correctement que je donne dans le champ 'chemin' de la requête HTTP avec ${url} et JMeter convertit les espaces en "%20" automatiquement. Après, je n'ai pas essayé avec les paramètres mais en direct par le champ chemin de la requête HTTP, ça marche.

A+
Thomas

jean.marie...@gmail.com

unread,
Nov 4, 2013, 12:28:45 PM11/4/13
to jmet...@googlegroups.com
Bonjour à tous,
 
Comme promis je reviens à vous après avoir tester la nouvelle fonction de la version 2.10 :  ${__urlencode()}
 
Donc suivant vos conseil j'ai modifier mon scénario comme suit :
  • Requête HTTP
    • Paramètres                         Valeur                                                                           Encodage           Inclure égale ?
    •  pTitreLivre                        ${VarTitre}                                                                              v                            v
Remplacer par
  • Requête HTTP
      • Paramètres                         Valeur                                                                           Encodage           Inclure égale ?
      •  pTitreLivre                        ${__urlencode(${VarTitre})}                                                           
     
     
    A ce stade j'ai bien un encodage de l'URL, le problème c'est que je n'ai pas le résultat souhaité.
     
    Acrochez-vous
     
    Je me trouve avec la variable ${VarTitre} :  H/85463214 135K35
     
    Le résultats après encodage serait :            H%2F85463214%20135K35
     
    Le résultats après ${__urlencode()} H%2F85463214+135K35
     
    Et là où on peut devenir fou c'est que le résultat dans FIDDLER c'est : H/85463214%20135K35
     
    Donc en résumé, le / ne doit pas être encodé et la barre d'espace doit être %20 au lieu d'être un + 
     
    Je dois avouer qu'il y a bien encodage, ce que je n'avais pas en JMeter 2.9 même en cochant la case Encodage dans la reqête HTTP
     
    En revanche je ne vois pas où je fais l'erreur.
     
    Si vous avez une idée, n'hésitez pas à abréger mes souffrances :)

    jean.marie...@gmail.com

    unread,
    Nov 4, 2013, 6:03:41 PM11/4/13
    to jmet...@googlegroups.com
    Bonsoir à tous,
     
    Je pense que je viens de trouver la solution, je vous fait part de ma solution.
     
    dans la requête j'ai remplacer :
     
    ${__urlencode(${VarTitre})}  par  ${__javaScript(escape('${MyTemp}'))}
     
    De plus j'ai vu qu'il y avait des variantes d'encodage voici les 3 cas de figures
    • ${__javaScript(escape('${VarTitre}'))}               --->  escape() will not encode: @*/+
    • ${__javaScript(encodeURI('${VarTitre}'))}            --->  encodeURI() will not encode: ~!@#$&*()=:/,;?+'
    • ${__javaScript(encodeURIComponent('${VarTitre}'))}   --->  encodeURIComponent() will not encode: ~!*()'
     
    Par ailleurs, en essayant toutes les configurations, j'ai remarqué que la fonctionnalité : ${__urlencode(${VarTitre})}
    fournissait un résultat différent.
     
    Bonne soirée
     
     
    Reply all
    Reply to author
    Forward
    0 new messages