JMeter - Variabilisation de données
Pour ce tutorial, nous allons voir comment variabiliser des données saisies par formulaire pour effectuer un tir de charges avec JMeter avec des données changeantes à chaque itération du tir. La variabilisation des données permet de mieux simuler la diversité de requêtes que l’on peut avoir sur un environnement réel. Notamment en évitant les effets de cache (navigateur, persistance, etc).
Pour ce tutorial, on suppose que vous avez déjà effectué le tutorial sur l’enregistrement d’un scénario fonctionnel dans JMeter.
Par ailleurs, on reprend les servlets d’exemples de Tomcat 5.5comme « site Web modèle », et on utilise la version 2.3 de JMeter.
Identification du scénario fonctionnel
La premier étape consiste à identifier le scénario fonctionnel.
Ecran 1 : la page d’accueil des servlets d’exemples de Tomcat

On fait défiler la page vers le bas, pour voir la liste des servlets disponibles.

On clique sur le lien Execute de la servlet d’exemple Request Headers pour arriver sur l’écran suivant.
Ecran 2 : Formulaire Request Headers

Ecran 3 : Saisie du nom et prénom.

Puis on clique sur le bouton Submit Query pour envoyer les données du formulaire.
Ecran 4 : Résultat du formulaire

Les données envoyées apparaissent en haut dans le formulaire. Ensuite on clique que la flèche de retour pour revenir à la page d’accueil des servlets de tests de Tomcat.
Ecran 5 : Retour à la page d’accueil

Et voilà, nous avons maintenant un scénario fonctionnel. Il reste simple et démonstratif. Il reste à le « Jmeteriser » en suivant la méthode de ce tutorial (utilisation de l’item HTTP Proxy).
Voici ci-dessous le résultat de la Jmeterisation.

Allons voir du coté du HTTP Request numéro 03, correspondant à l’envoi des données du formulaire.

On retrouve dans les paramètres envoyés à la requête, c’est-à-dire les champs Nom et Prénom. Ce sont ces paramètres que nous allons « variabiliser ».
Variabilisation du scénario
Pour variabliser le scénario, nous allons mettre de coté JMeter un instant, et commencer par préparer un fichier au format CSV (texte séparé par des virgules). Ce fichier sera « l’input » de JMeter pour faire tourner les champs Nom et Prénom.
Pour réaliser ce fichier, une méthode consiste à prendre un tableur comme Excel ou comme ici, Calc d’OpenOffice. La première colonne sera le prénom, et la deuxième colonne sera le nom. (Ici une liste de boxeurs)

Une fois sa liste prête, il faut l’enregistrer avec le format CSV, en changeant le type du fichier à partir de la liste déroulante dessous le nom du fichier.

OpenOffice Calc permet de choisir le charset, le délimiteur de champ et le délimiteur de texte. On choisira de préférence UTF-8, le délimiteur de champ est bien sûr la virgule et on laissera le champ délimiteur de texte à vide.

Nous avons donc maintenant un fichier CSV prêt pour être l’input de Jmeter.
Revenons donc vers JMeter, on sélectionne l’item Recording Controller, et on ajoute un item de configuration CSV Data Set Config.

L’item CSV Data Set Config permet de lire un fichier CSV et de mettre dans une ou plusieurs variables, chaque ligne dudit fichier. A chaque itération, la ligne suivante est sélectionnée.

On saisie les valeurs suivantes dans les champs :
- Filename : le chemin absolue et le nom du fichier. (ou bien juste le nom du fichier, auquel cas le fichier doit se trouver dans le classpath de Jmeter. Par exemple : JMETER_HOME/bin)
- File encoding : Lors de l’export du fichier CSV avec Calc, le format UTF-8 a été choisi, dont on reprend la même chose.
- Variable Names : le nom des variables dans lesquelles JMeter va insérer les éléments d’une ligne. Dans le fichier CSV, la première colonne était le prénom, la seconde était le nom, donc on saisie « PRENOM,NOM » pour avoir dans la variable PRENOM le prénom, et dans la variable NOM le nom.
- Delimiter : on travaille avec un fichier « pur » CSV, et donc c’est la virgule qui nous sert de séparateur de champ.
- Recycle on EOF ? : Est-ce qu’à la fin du fichier (End Of File), JMeter reprend la liste depuis le début pour variabiliser les variables ? Oui pour nous.
- Stop thread on EOF ? : Est-ce que l’item Thread Group dans lequel se trouve l’item CSV Data Set Config se stoppe à la fin du fichier, quelque soit le nombre d’itérations prévu ? Non pour nous
Maintenant que nous avons complété l’item CSV Data Set Config, nous disposons de deux variables pendant l’exécution d’un test de charge. Allons les utiliser dans notre scénario de tir. Pour cela, on se place sur l’item HTTP Request numéro 03, celui qui correspond à l’envoi de données de la servlet Request Param.

Dans la zone Send Parameters With the Request, on retrouve les noms HTML des champs du formulaire : firstname et lastname. Dans la colonne Value, nous allons remplacer les valeurs données lors de l’enregistrement du scénario par : ${PRENOM} et ${NOM}. Le ${…} indique à JMeter qu’il s’agit d’une variable, et que lors de l’exécution, il faut la remplacer par la valeur de la variable.
Allons un peu plus loin, autant vérifier que les données variabilisées envoyées (beaucoup de « ées » :-)) sont bien celles qui sont affichées dans la réponse. Pour cela on va chercher l’item Response Assertion (Check response) de l’item HTTP Request numéro 03.

En utilisant le bouton Add, on va ajouter deux Patterns to Test : ${PRENOM} et ${NOM} tout simplement. Si JMeter trouve les deux dans la réponse HTML reçue, alors l’assertion est OK.
Exécution du tir
Et voilà, maintenant nous sommes prêt pour exécuter le tir. On se place sur l’item Thread Group, on choisi les paramètres du Thread, ici un seul utilisateur virtuel, sur un ramp-up de 1 sec, qui va exécuter 400 fois le scénario.

On lance le tir, avec le raccourci clavier Ctrl + R (ou le menu Run > Start), le résultat (ci-dessous) visible sur l’item Summary Report :

On note qu’il n’y a pas d’erreurs dans le tir, notamment sur la HTTP Request numéro 03. On peut aussi vérifier que tout s’est bien passé en allant voir l’item View Results Tree.

En choisissant au hasard une requête 03, dans l’onglet Response data, on retrouve bien le nom d’un boxeur au lieu des variables ${PRENOM} et ${NOM}.

Et si on va sur une autre requête 03, le prénom et le nom sont bien différents. C’est gagné, la variabilisation marche ! (mais qui en doutait ?). Nous avons vu dans ce petit tutorial comment variabiliser les données entrées par formulaire dans un site Web.
Quelques remarques :
L’item CSV Data Set Config est très pratique pour cette action, mais d’autres moyens permettent de faire la même chose, cependant plus difficilement (en l’occurence, il s’agit des fonctions JMeter __CSVRead() et __StringFromFile()).
Ce tutorial montre la variabilisation à partir de données « connues » avant le tir. Il est aussi possible de variabiliser un scénario de tir avec des données
retrouvées (ou calculées) dynamiquement pendant l’exécution du tir. (On utilisera en autre l’item Regular Expression Extractor du groupe Post-Processors pour ce genre de cas)
La petite astuce de la fin :
JMeter possède un fichier principal de paramètres, placé dans JMETER_HOME/bin. Ce fichier s’appelle jmeter.properties. Vous trouverez dedans le paramètre proxy.number.requests qui permet d’avoir une numérotation automatique des items HTTP Request lors d’un enregistrement via l’item HTTP Proxy. Il faut donner la valeur true pour avoir la numérotation automatique, et redémarrer JMeter.
proxy.number.requests=true
A bientôt pour de nouvelles aventures…
25 août 2008 à 10:17
Bonjour à toi,
Tout d’abord merci pour cet article qui m’a été fort utile, pour les tests que j’effectue en ce moment sur une appli java.
J’ai tout de même une petite question :
J’ai un script qui me permet d’uploader un fichier sur un serveur.
En enregistrant le scénario avec JMeter, l’url du fichier apparait bien dans la section : “Send Files With The Request”.
Je souhaiterai en fait “variabiliser” cette url, via un fichier CVS (que j’ai ajouté à JMeter). Cependant, où dois-je renseigner ma variable pour rendre l’url dynamique ? (J’ai essayé de remplacer l’url par le nom de la variable, mais aucun résultat.)
Merci d’avance pour ta réponse.
@+
26 août 2008 à 8:44
Merci.
Oui tu dois mettre le nom de ta variable dans le champ “File Path:” de l’élément HTTP Request.
As-tu bien mis en POST (et non GET) la méthode de connexion dans cet élément?
26 août 2008 à 15:21
Oui, j’utilise bien la méthode ‘POST’. Mais c’est bon tout marche maintenant. En fait c’était une erreur toute bête!
Dans la config de mon CSV_DATA_CONFIG, mon champ “File encoding” était à “UTF_8″ au lieu de “UTF-8″ … -_-’
Merci tout de même pour tes petites indications
28 août 2008 à 10:32
Bonjour,
Quel plaisir de lire du francais a propos de Jmeter : MERCI.
Je me heurte a un probleme de path absolu/relatif dans l’envoi d’un fichier.
Mon csv contient juste le filename, et j’aimerais construire mon path selon le model /Corpus/${FILENAME}.
-> Problème, j’obtiens un java.io.FileNotFoundException: \Corpus\MonFileName
Je passe mon path csv en relatif : le répertoire du jmx faisant office de base, il le comprend bien, pourquoi n’en est il pas de même pour envoyer un fichier dans la requete ?
Tu dis dans ton article chemin absolu ou path jmeter… il n’y a pas une astuce pour construire en relatif (sans renseigner un path en variable globale en tout début bien sur…)
Merci pour tout
@+
Fabrice
30 août 2008 à 9:43
De rien
pour le français, j’espère que le mixte des captures en anglais et le texte en français n’est pas trop pénible. Pour ma part je préfère garder le vocabulaire anglais pour plus de faciliter dans les recherches de résolution de problème (via google.com)
Pour répondre à ta question, malheureusement les deux champs de “fichier” (celui du CSV Data Set Config et celui du HTTP Sampler (Send Files With the Request)) sont lus différemment dans JMeter.
Celui du CSV Data Set Config, est lu (ouvert) à travers un processus interne Jmeter de “serveur de fichiers” (un méchanisme de singleton) qui teste le nom de fichier (filename) passé en paramètre pour déterminer si c’est un chemin absolue ou relatif.
Celui du HTTP Sampler, est lu directement sans test de nom de fichier et contrôle particulier sur le filename donné (il faut juste qu’il soit non-vide - 0 caractère).
Ce qui explique le comportement différent des deux champs filename (celui de mon billet ci-dessus étant le CSV Data Set Config).
Il est donc obligatoire de fournir un chemin relatif pour ce filename (à moins de faire une demande d’évolution sur le bugzilla de Jmeter)
Je ne sais pas quelles sont tes contraintes sur ce/ces fichier(s) et leur chemin d’accès. Je suppose que ce n’est pas possible pour toi d’avoir le chemin absolu ?
Néanmoins, tu peux “variabiliser” la racine de chemin absolu à travers la mise en place d’une propriété Java (en ligne de commande (/usr/loca/bin/jmeter -Duser.monchemin=/home/milamber -n -t TestPlan.jmx -l resultats.jtl) ou dans le fichier user.properties (ex. user.monchemin=/home/milamber)
La valeur à mettre dans le champ “File Path:” du HTTP Request est alors :
${__P(user.monchemin,ERREUR_CHEMIN_ABSOLU_NON_DEFINI)}/${NOM_FICHIER}
(si tu es sous Linux/Unix/Cygwin), En combinant avec la commande `pwd` (sous unix, pwd renvoi le chemin courant) tu peux le rendre ‘dynamique’ :
/usr/local/bin/jmeter -Duser.monchemin=`pwd` -n -t TestPlan.jmx -l resultats.jtl
(je viens de tester avec succès :-))
A+
1 septembre 2008 à 7:27
Salut,
Merci pour cette confirmation. Ma contrainte est de livré clef en main a des gens qui ne sont pas forcement apte ou qui ne veulent pas avoir de paramétrage a faire, c’est pourquoi je voulais construire en relatif depuis le répertoire qu’ils dézippent et tout est jouable directement.
Bref ce n’est pas grave, il ont une variable a renseigner avant d’exécuter le jmx, c’est très simple ca devrait aller.
Merci de toutes ces informations, façons de faire : c’est parfait.
Bon courage
Fabrice