Ecrire son scénario fonctionnel dans JMeter
Avec JMeter, on peut bien sûr, définir son scénario de test manuellement pour chaque requête HTTP avec le ou les paramètres associés… cela sera long et fatiguant. Surtout cela va donner lieu à une phase de vérification de son scénario « jmeterisé » importante car il risque d’y avoir des « bugs », normal, c’est du travail « manuel ».
JMeter propose une fonctionnalité « Enregisteur script de test HTTP(S) » qui peut enregistrer une session de navigation, effectuée avec son navigateur, directement dans des échantillons Requête HTTP. Du coup, la « jmeterisation » devient plus facile et rapide. Après l’enregistrement de la session de navigation, on aura juste des ajustements à faire afin notamment de rendre dynamique les données de tests.
La session de navigation est donc une exécution unitaire du scénario fonctionnel cible, sur son navigateur. La session est enregistrée par JMeter en même temps.
Comment faire ?
Lancer JMeter. Sous Windows, on utilisera le fichier JMETER_HOME\bin\jmeterw.cmd, sous Linux/Unix : JMETER_HOME/bin/jmeter.
Sélectionner l’item Plan de travail, puis clic droit sur la souris, et ajouter un élément hors test > Enregistreur script de test HTTP(S).
Dessous, on ajoute également un élément de type Récepteurs > Arbre de résultats afin de pouvoir voir les requêtes HTTP enregistrées lors de la future session de navigation. L’ajout du récepteur Arbre de résultats va permettre donc de voir les échanges HTTP (entre son navigateur et l’Enregistreur script de test HTTP(S), et si besoin, nous permettre de les consulter plus tard (à froid) lors de l’affinage du scenario de tir de charges.
Puis on se place sur l’item Plan de test, un clic droit sur la souris, et ajouter un élément Groupe d’unités.
Ensuite, sélectionner le nouvel élément Groupe d’unités, un clic droit sur la souris, et ajouter un élément Contrôleurs Logiques > Contrôleur Enregistreur.
Le Enregistreur script de test HTTP(S) et le Contrôleur Enregistreur sont les deux seuls éléments nécessaires pour l’enregistrement d’une session de navigation. Cependant nous allons y ajouter quelques autres éléments pour répondre à quelques contraintes et/ou pour nous faciliter le travail.
L’élément de configuration Paramètres HTTP par défaut va nous permettre de ‘variabiliser’ le nom du serveur web, son port, etc., c’est-à-dire que les requêtes HTTP (qui seront créées automatiquement lors de la session de navigation par l’Enregistreur script de test HTTP(S)), verront leur champ nom du serveur Web, Port, etc. vides. Ces derniers seront remplacés à l’exécution par les valeurs situées dans cet élément Paramètres HTTP par défaut.
Ensuite, dans l’élément de configuration, nous paramétrerons les champs suivants Nom ou adresse IP par la valeur du nom du serveur à tester, et le champ Port par la valeur du port du serveur (ici 8080) :
ATTENTION : si vous utilisez un Tomcat sur la même machine que votre JMeter, il y aura certainement un conflit sur le port 8080 (car Tomcat, par défaut utilise le 8080 et l’élément Enregistreur script de test HTTP(S) de JMeter utilise également le port 8080). Il convient donc de mettre des ports différents. Par exemple mettre 8081 dans le champ Port sur l’élément Enregistreur script de test HTTP(S) de JMeter (et dans le configuration du navigateur au niveau du proxy, cf. plus bas).
L’élément Gestionnaire de cookies HTTP va nous permettre de faire du suivi de cookie (en particulier le suivi de session). C’est-à-dire que JMeter va se comporter comme un navigateur Internet au niveau des cookies, en envoyant la valeur du cookies quand les conditions sont remplies.
On va cocher l’option Nettoyer les cookies à chaque itération ? afin d’avoir un effacement des cookies (et autre identifiant de session) à chaque itération lors du test de charges.
Au final, on a donc les éléments suivants :
Avant de faire le démarrage de l’Enregistreur script de test HTTP(S) de JMeter, on ira cocher le paramètre Ajouter une Assertion Réponse dans cet élément. Ce paramètre ajoutera pour chaque Requête HTTP un sous-élément assertion qui nous servira pour vérifier la validité de la réponse reçue lors du test de charges.
On va ensuite exclure les images GIF de l’enregistrement. Pour cela, dans la partie URL : motifs à exclure, on va ajouter la valeur suivante « .*\.gif » qui est l’expression régulière pour les URL qui contiennent un nom de fichier GIF.
A noter : l’exclusion des éléments associés à une page, c’est-à-dire les images, feuilles de style, etc. est un choix à faire en fonction du type de test de charge voulu. Par exemple pour un test de charges dont l’objectif est la validation de la tenue de performance du serveur d’applications et des temps de réponse, il est préférable de ne pas inclure les images dans le scénario de tir. Par contre, si l’objectif est la validation de la bande passante, les images et autres éléments sont à inclure.
=> Le bouton Ajouter exclusions proposées permet d’ajouter, en un clic, dans les motifs à exclure les éléments généralement associés à une pages tel que les images, feuilles de style, javascript, etc.
Démarrage de l’Enregisteur script de test HTTP(S) de JMeter
Par défaut l’Enregistreur script de test HTTP(S) n’est pas lancé, il faut donc le démarrer pour qu’il puisse répondre aux demandes (requêtes) du navigateur qui seront faites pendant l’enregistrement de la session de navigation. Pour cela, on se place sur l’élément Enregistreur script de test HTTP(S) et on clique sur le bouton Lancer situé en bas.
On notera que depuis la version 2.10 de JMeter, le premier lancement de l‘Enregistreur script de test HTTP(S) effectue la création d’une autorité de certification (AC) temporaire sur votre poste. Cette AC sera utilisé pour signer les « faux » certificats SSL produits par JMeter lors de vos sessions de navigations sur des sites en HTTPS. La fenêtre ci-dessous apparait pour indiquer la bonne exécution de la création et vous invite à installer la clé publique de cette AC dans votre navigateur (afin de ne pas avoir de messages d’avertissement de la part de votre navigateur lors des visites de sites HTTPS via JMeter). Plus de détails ici (section Installing the JMeter CA certificate for HTTPS recording ).
Configuration du navigateur
Il faut ensuite configurer le navigateur pour qu’il utilise JMeter comme proxy HTTP/HTTPS. Par exemple avec le navigateur SeaMonkey, menu Edition > Préférences.
On renseigne les champs suivants :
- Configuration manuelle du proxy choisi
- Proxy : localhost (correspondant à l’adresse IP loopback 127.0.0.1)
- Port : 8080 (ce numéro de port doit être le même que la valeur du champ Port dans l’élément Enregistreur script de test HTTP(S) de JMeter, si par exemple, vous avez mis 8081 car le Tomcat est aussi le poste JMeter, alors, il faut mettre 8081 sur la configuration proxy de votre navigateur)
Également on configurera le navigateur pour ne pas avoir de cache, ainsi on videra son cache de navigateur avant la session d’enregistrement. Si on ne fait pas cela, on aura pour certains éléments des codes de retours HTTP 304 (i.e. Déjà dans le cache du navigateur) lors de leur premier appel. Et donc le test de charges sera faussé, car le robot ne récupéra pas « réellement » les éléments.
Et hop, tout est maintenant prêt pour démarrer sa navigation en suivant le scénario fonctionnel établi.
On prend donc son navigateur Internet (ici SeaMonkey) et on reproduit le scénario fonctionnel étape par étape, en étant calme et concentré, car tout ce l’on fait est enregistré par JMeter.
Pendant cette navigation, on remarquera dans la fenêtre JMeter que de nouveaux éléments de type Requête HTTP viennent s’ajouter en sous-éléments du Contrôleur Enregistreur.
Une fois sa session de navigation finie, on clique sur le bouton Arrêter de l’élément Enregistreur script de test HTTP(S).
Et voilà le résultat de l’enregistrement au niveau de JMeter : 6 requêtes HTTP dans le Contrôleur Enregistreur.
Passons à l’étape suivante, l’affinage du scénario.
bonjour
et merci pour toutes ces informations !
Savez vous s’il possible de « variabiliser » avec cette technique, le nom/port du serveur web afin de passer les tests par exemple sur plusieurs installations différentes ?
Encore merci
Merci de remplacer nom/port par racine du chemin : nomduhost:port/ma variable/le reste du site
Oui c’est possible, il suffit d’ajouter au début (avant l’activation du proxy) un élément User Defined Variables (Config Element). Dedans, il faut déclarer les variables (par exemple : NOM_HOST = http://www.google.fr).
Ensuite JMeter lors de la session d’enregistrement proxy, va remplacer automatiquement les « www.google.fr » par ${NOM_HOST}
(tu peux aussi le faire manuellement à posteriori dans les éléments HTTP Request).
Tout cela est valable pour tout champ (port, variable utilisaeur, etc).
salut, cela fonctionne nickel ! J’attendais de le mettre en oeuvre avant de répondre.
Merci et encore bravo pour toutes ces infos !
Bonjour,
tres bon tutoriel!
Petite question: mon site passe la jsessionid dans la ligne de commande.
Cette sessionid est crée au moment du login.
Est ce qu’il est possible de variabiliser cette valeur?
Merci encore pour ce tutoriel!
Merci.
Oui c’est possible de variabiliser, et même très simple avec l’élément Post-processor Regular Expression Extractor. Ce dernier te permettant de récupérer via une expression régulière une chaîne.
Par exemple si ton URL est
http://www.toto.com/index.jsp;jsessionid=1234131243124DSFDZREZ
Tu peux utiliser cette expression réguilière :
jsessionid=(.*)
Plus d’infos :
http://jakarta.apache.org/jmeter/usermanual/component_reference.html#Regular_Expression_Extractor
Bon courage
Milamber
Je souhaite faire une chose un peu identique. j’ai une requête de connexion qui s’exécute et un extracteur d’expression régulière configuré comme ceci :
Nom de référence : JSESSIONID
Expression régulière : jsessionid=(.*)
Canevas : $0$
Correspondant au num : 1
Valeur par défaut : ** Erreur**
puis dans la requête suivante :
j’utilise http://;jsessionid=${JSESSIONID}
Mon problème est que la requête transmise est prends toujours la valeur par défaut pour JSESSIONID : http://;jsessionid=** Erreur**
OU est-ce que je me plante ?
Pour info, le message de retour de ma première requête (celle qui contient l’extracteur) est du html avec un champ :
Version : indéfinie
Bonjour,
La réponse sur :
http://groups.google.com/group/jmeter-fr/browse_thread/thread/b075f75f55ac9485
A+
Bonjour,
Bravo encore pour ce site, qui fait gagner pas mal de temps dans la compréhension de cet outil.
Je rencontre aussi un pb, après avoir suivi cette procédure:
– Jmeter fonctionne lorsque je paramètre manuellement des requêtes HTTP
– puis, j’ai paramétré le proxy sur le port 8081
– j’ai paramétré internet explorer pour qu’il utilise ce proxy
et à l’invocation de mon site depuis le navigateur, j’obtiens l’erreur:
java.net.ConnectException: Connection refused: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(Unknown Source) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at sun.net.NetworkClient.doConnect(Unknown Source) at sun.net.www.http.HttpClient.openServer(Unknown Source) at sun.net.www.http.HttpClient.openServer(Unknown Source) at sun.net.www.http.HttpClient.(Unknown Source) at sun.net.www.http.HttpClient.New(Unknown Source) at sun.net.www.http.HttpClient.New(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) at org.apache.jmeter.protocol.http.sampler.HTTPSampler.sample(HTTPSampler.java:457) at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:889) at org.apache.jmeter.protocol.http.proxy.Proxy.run(Proxy.java:163)
Avez-vous une idée ?
Merci d’avance,
Cdlt,
Christian.
Bonjour,
Est-ce que le proxy JMeter est bien démarré ? (bouton Start)
Pour le vérifier, tu peux aussi faire dans une invite de commande :
netstat -an
où tu devrais trouver une ligne avec le port 8081 marqué en LISTEN (ou ECOUTE)
A+
A priori oui, puisque j’ai effectivement une ligne avec le port 8081 marqué en LISTENING…
Bonjours,
Je teste actuellement un webservice SOAP avec Junit.
Est-t’il possible d’enregistrer un scénario de test Junit comme une session de navigation ?
Comment paramétrer mes requêtes SOAP pour qu’elles prennent en compte le proxy ?
Eric.
Bonjour Haran,
Pourrais-tu basculer ta demande sur le groupe Jmeter-fr http://groups.google.com/group/jmeter-fr/
Tu pourrais ainsi joindre une capture d’ecran de la fenêtre de configuration du proxy Internet Explorer (Atl+Impr Ecran pour juste avoir la fenêtre) à ta demande.
Tu as aussi peut-être un firewall qui bloque le port ? (est ce que c’est le firewall de Windows ou un firewall avec ton antivirus ?) (normalement si tu mets bien 127.0.0.1 comme IP du proxy, le firewall n’est pas censé agir, mais bon je vérifie)
A+
Bonjour Eric,
Malheureusement je ne connais pas bien les api soap, tu pourrais renvoyer ta requête dans le groupe Jmeter-fr http://groups.google.com/group/jmeter-fr/ (ou je suis dessus), peut-être que quelqu’un peu t’aider.
Pour ma part, je dirais qu’il faut recherche dans la doc (api) si on peut préciser un proxy…
A+
Bonjour à tous,
je suis nouveau dans l’utilisation de JMeter et je dois dire que le tutoriel est excellent!
Je voudrais juste soulever un petit détail pendant mon étude sur JMeter:
J’utilise un Proxy en port 8080 pour accéder à Internet. Comme l’indique le tutoriel, JMeter utilise également le port 8080. J’ai donc reconfigurer mon navigateur Internet (IE) en port 8081 en localhost et redéfini au niveau de l’item « Serveur Proxy HTTP » le port 8080 en port 8081. J’ai donc défini le port 8080 au niveau de l’item « Paramètres HTTP par défaut ». Mon avantage est que j’accède à mon site en réseau local mais je ne peux faire aucun test via Internet. Jusqu’ici tous mes tests fonctionnent car je suis en réseau local. Comment puis-je configurer JMeter afin d’effectuer mes tests futurs via le Web? Merci d’avance encore pour ce formidable travail.
Cordialement.
DaddyP
Bonjour,
La réponse est dans la documentation de JMeter :
http://jakarta.apache.org/jmeter/usermanual/get-started.html
Paragraphe 2.4.2
Au lancement :
jmeter.bat -H IP_OU_NOM_PROXY -P PORT_PROXY
A+
Milamber
Merci d’avoir répondu aussi rapidement et merci pour le conseil.
j’ai ce message qui s’affiche après exécution de la commande:
Exception in thread « main » java.lang.UnsupportedClassVersionError: org/apache/jmeter/NewDriver (Unsupported major.minor version 48.0)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
errorlevel=1
Appuyez sur une touche pour continuer…
Je précise que je ne suis pas expert en langage de programmation encore moins en java 🙁
Merci encore de votre aide 😉
DaddyP
Bonjour,
En général une erreur ClassVersion signifie un problème de compatibilité de JVM.
C’est quoi la version de Java que tu utilises (commande « java -version »)
A+
Bonjour,
merci je viens de trouver mon erreur… Effectivement il s’agit bien d’une erreur de version.
Merci encore d’avoir répondu 🙂
DaddyP
bonjour,
je voulais tester de créer des scripts donc avec jmeter, seulement je dois à un moment télécharger un fichier sur mon bureau pour l’appli. et a ce moment là, j’ai un problème:
voici l’erreur qui s’affiche:
java.io.FileNotFoundException: fichier.txt (Le fichier sp�cifi� est introuvable)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(Unknown Source)
at java.io.FileInputStream.(Unknown Source)
at org.apache.jmeter.protocol.http.sampler.PostWriter.writeFileToStream(PostWriter.java:406)
at org.apache.jmeter.protocol.http.sampler.PostWriter.sendPostData(PostWriter.java:115)
at org.apache.jmeter.protocol.http.sampler.HTTPSampler.sendPostData(HTTPSampler.java:159)
at org.apache.jmeter.protocol.http.sampler.HTTPSampler.sample(HTTPSampler.java:514)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1037)
at org.apache.jmeter.protocol.http.proxy.Proxy.run(Proxy.java:195)
je ne sais pas du tout comment faire pour télécharger mon fichier, si je dois le mettre ailleur, et si une fois le script terminé, je pourrais le relancer, sans jmeter configuré en proxy, et si cela marchera?
est-il possible de m’aider?
merci beaucoup!!!
Bonjour,
J’ai l’impression que tu ne donnes pas dans JMeter le chemin complet du fichier « fichier.txt » au niveau du champ pour le nom du fichier à uploader ?
A+
ben, quand je créé le script avec jmeter, je ne donne rien a jmeter en lui meme, dans le site, il y a un bouton parcourir, valider, et lorsque je choisi mon fichier, il y a bien le chemin pour y accéder.
bon, effectivement, le chemin du fichier n’apparait pas dans jmeter. mais meme si je lui fait passer après, je ne peux plus avancer dans ma page internet, je suis toujours coincé avec mon erreur. et si j’actualise la page, cela rajoute juste une ligne a jmeter toujours sans le chemin. n’y a t-il pas un moyen de euh, ‘mettre a jour’ la page internet à partir des info que j’ai rajouté a jmeter?
merci d’avoir répondu si vite en tout cas
Bonjour,
Il y a trois étapes : d’abord enregistrer ton scénario dans Jmeter (tu ne travailles qu’avec ton navigateur sauf pour lancer et arrêter le proxy), puis tu fais l’affinage du scénario (c’est à ce moment là qu’il faut bien préciser à JMeter le chemin exacte sur la machine jmeter du fichier à uploader, le tout en modifiant l’échantillon Requête HTTP correspondant à l’envoi du formulaire) et la troisième étant le test de charges avec JMeter.
Pour les prochaines questions et la suite, si tu peux essayer de passer par le Groupe JMeter en français, cela permet un meilleur suivi et tracabilité des messages pour les internautes. Merci
A+
Milamber
Bonjour,
J’ai suivi l’ensemble des opérations mais sans succes:
1° Mon site est sur le port 8081
2° je lance le démarage de Jmeter (port 8080) je lance mon site dans un browser (IE8) « http://localhost:8081/yyy »
3° Rien ne se passe sur Jmeter au niveau du « contrôleur enregistreur » par contre si j’ouvre un second onglet et que je lance n’importe quelle recherche le controleur enregistre toutes mes opérations .
Un peu d’aide svp .
As-tu bien configurer ton navigateur pour qu’il utilise le proxy JMeter sur le port 8080 ? (dans les paramètres Internet de IE, section réseau je crois)
oui pas pas soucis de ce côté par contre j’ai installé m appli et jmeter sur une VM et j’ai modifié les paramètres IE de ma VM du coup je me dis qu’il y a peut-être des interactions de la configuration Internet de la machine qui hébèrge la VM avec les paramètre internet de la VM elle-même.
Je vais regarder de ce côté .
Pas d’améliorations : Mon proxy server jmeter est sur le port 8080 ; mon, appli sur le port 8081 et le Lan Setting de IE passe par le proxy : localhost en port 8080 sans aucuns Bypass .
Les paramètres entre la machine qui héberge ma VM et ma VM en sont pas en interactions.
Mon HTTP par defaut est en localhost en port 8080 .
Et malgré cela le contrôleur enregistreur ne « capte » rien sur le port 8081.
Ce que je ne comprend pas c’est que si j’ouvre un autre onglet et que je tape par exemple : »www.google.fr » et bien la le contrôleur enregistreur s’active.
Le problème doit être entre le clavier et la chaise … masi bon si vous voyez un truc qui cloche dans ma démarche ….
Tu as dû oublier de décocher « ne pas utiliser le proxy pour les adresses locales »
Même pas
Bonjour,
J’ai un petit souci avec JMETER 2.5.1.
Actuellement, au bureau je suis derrière un proxy.
Il faut donc que je configure :
Mon navigateur pour qu’il se connecte sur le procy de JMETER : OK
Mon proxy JMETER pour qu’il passe par le proxy de mon bureau : KO
Je ne trouve pas la méthode pour configurer le « chainage » des proxy.
J’ai trouvé un exemple en ligne de commande. Mais ca ne passe pas.
Example : jmeter -H my.proxy.server -P 8000 -u username -a password -N localhost
J’ai toujours des timeout avec mon navigateur (ci-dessous) :
ava.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at org.apache.jmeter.protocol.http.sampler.HTTPJavaImpl.sample(HTTPJavaImpl.java:483)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:62)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1018)
at org.apache.jmeter.protocol.http.proxy.Proxy.run(Proxy.java:236)
Pouvez-vous m’aider?
Merci
Il faut donner un peu plus de détails concernant le proxy (c’est un Microsoft ISA? un Squid?), il faut apparemment une authentification?
Je suppose que tu es certain de l’adresse IP du proxy et du port.
Le site ciblé est en http ou https ?
A+
Bonjour,
En fait c’est passé avec la commande : jmeter.bat -H 192.168.1.3 -P 8080 -u “User” -a “Mot de passe”
Il y a du y avoir un bug sur le proxy hier.
Merci quand même
Bonjour,
J’ai le même problème qu’elma.
Mon serveur tomcat est sur la même machine que JMeter donc
Tomcat : port 8090
JMeter : port 8080
j’ai bien configuré comme il faut et rien.
Des fois ça enregistre seulement si les paramètres d’échantillon http des requêtes http par défaut est sur java
et le proxy aussi sur java. De plus, ça n’enregistre pas tout le scénario au complet
J’ai vraiment besoin que ça marche car ça fait parti de mon travail de diplôme.
Merci d’avance
Bonjour,
D’abord bravo pour ce tutoriel.
J’ai le même problème qu’elma.
Il n’y a rien qui s’enregistre je ne sais plus quoi faire.