Présentation de l’outil Apache JMeter – partie 1
Lors d'une campagne de tests de charges, l'objectif va être de simuler un grand nombre d'utilisateurs afin de tester le comportement global du système (applicatif, ressources systèmes, etc ...). Les tests manuels n'étant pas à l'ordre du jour pour ce type de test (trop complexes à mettre en œuvre, trop chers), il est fortement conseillé d'utiliser un outil de test de charge.
De nombreux outils existent et nous allons nous concentrer sur Apache JMeter et ces plugins.
Apache JMeter permet de tester de nombreux protocoles (HTTP, SOAP, FTP...) et tourne sur de nombreux systèmes d'exploitation car écrit en Java.
Pour la partie théorique et quelques exemples, je vous laisse aller sur le site officiel, sur le blog de Milamber et sur mon précédent article sur developpez.com.
Penchons-nous sur la création d'un scénario de test pour l'application démo PlantsByWebSphere (boutique en ligne) livrée avec IBM WebSphere 8.
Nous allons commencer par scripter le comportement d'un utilisateur qui va :
-
Appeler la page d'accueil ;
-
sélectionner une catégorie d'articles ;
-
sélectionner un article.
Ce scénario va se traduire dans JMeter par le processus détaillé ci-dessous.
Étape 1 : Paramétrage des utilisateurs et de la durée du test
Utilisons l'élément « jp@gc - Stepping Thread Group » (livré avec JMeterPlugins) et paramétrons le de la manière suivante.
Étape 2 : Paramétrage du serveur cible par défaut à l'aide de « HTTP Request Defaults »
Afin de simuler au mieux le comportement d'un navigateur Web récent, on va demander à JMeter de charger les ressources 4 par 4.
Étape 3 : Gestion des cookies à l'aide de « HTTP Cookie Manager »
Étape 4 : Gestion du cache à l'aide de « HTTP Cache Manager »
Étape 5 : Gestion des préférences du navigateur à l'aide de « HTTP Header Manager »
On ajoute la variable « User-Agent » avec pour valeur « Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.218 Safari/535.1 »
Étape 6 : Découpage du script en transaction
Afin de faciliter la lecture des résultats, pour chaque « Transaction Controller », on sélectionne « Generate parent sample ».
Étape 7 : Enregistrement du script à l'aide du proxy
Étape 8 : Variabilisation du choix de la catégorie des articles
On remarque que ce choix est transmis par une méthode POST avec le paramètre category de la requête HTTP "20 /PlantsByWebSphere/promo.jsf"
Le choix de la catégorie est un entier qui varie de 0 à 3.
-
Pour simuler ce choix, on va ajouter l'élément de configuration « Variable aléatoire » (Add -> Config Element -> Random Variable)
-
Maintenant, il suffit de remplacer la valeur entrée lors de l’enregistrement du scénario par ${categorie} pour que JMeter prenne en compte notre nouvelle variable.
-
Corrélons le reste des variables du formulaire.
-
Commençons par la variable javax.faces.ViewState
Pour cela, nous allons récupérer à l'aide d'une expression régulière (Add -> Post-Processors -> Regular Expression Extractor) dans la réponse à la requête précédente (la page d'accueil) la valeur de javax.faces.ViewState.
Réponse HTML à analyser.
<input type="hidden" name="bannerform_SUBMIT" value="1" /> <input id="javax.faces.ViewState" type="hidden" name="javax.faces.ViewState" value="FAIKyiIsvV64alZwI8LU39OZ2RaAcuUfAFca8Zk7H4BXXhIcUUqbUwUCBkLLDQ4t2ZBGr/zitaFohzcWRZPtQm9U6yCGZYZUmie5U1A+IOEWk3y2T2Fjy0349sM=" />
-
L'expression régulière utilisée sera la suivante.
bannerform_SUBMIT.+?name="javax.faces.ViewState" id="javax.faces.ViewState" value="(.+?)"
-
Puis, utilisons la variable ViewState_valeur dans le formulaire.
-
Faisons de même avec la variable bannerform:_idcl
Réponse HTML à analyser.
<a onclick="return myfaces.oam.submitForm('bannerform','bannerform:j_id1717086759_3a23d0b4',null,[['category','0']]);" href="#"> <img id="bannerform:menu1" class="aligncenter" style="border: 0px; height: 35px; width: 75px;" src="/PlantsByWebSphere/javax.faces.resource/tab_flowers_u.gif.jsf?ln=images" alt="Flowers" /> </a>
-
L'expression régulière utilisée sera la suivante.
onclick="return myfaces.oam.submitForm\('bannerform','(.+?)',null,\[\['category','${categorie}'\]\]\);"
-
Au final, on aura.
Étape 9 : Variabilisation du choix de l'article
Cette fois-ci tout se passe dans la requête « 40 /PlantsByWebSphere/shopping.jsf »
-
Commençons par la variable itemID qui défini le code de l'article choisi et la variable shopping.
Comme précédemment, on va récupérer avec une expression régulière un code d'item et la variable shopping au hasard.
Réponse HTML à analyser.
<a href="#" onclick="return myfaces.oam.submitForm('shopping','shopping:j_id164039580_461abf1d_7',null,[['itemID','1162']]);
-
L'expression régulière utilisée sera la suivante.
return myfaces.oam.submitForm\('shopping','(.+?)',null,\[\['itemID','(.+?)'\]\]
-
De même pour la variable javax.faces.ViewState
Réponse HTML à analyser.
<input type="hidden" name="shopping_SUBMIT" value="1" /> <input id="javax.faces.ViewState" type="hidden" name="javax.faces.ViewState" value="FAIKyiIsvV64alZwI8LU39OZ2RaAcuUfAFca8Zk7H4BXXhIcUUqbU5KFHlt3jwWxzAO1D+8ZS1STLfDTNKEhVVSfIKYKMgNzYvgMPpYyZG/B3GYGjjcL3+Oi0TY=" />
-
L'expression régulière utilisée sera la suivante.
shopping_SUBMIT.+?name="javax.faces.ViewState" id="javax.faces.ViewState" value="(.+?)"
-
Au final, on aura
Étape 10 : Ajout de pause variable entre chaque transaction
Pour cela, on va prendre un « Gaussian Random Timer » (Add->Timer->Gaussian Random Timer) et le configurer pour avoir un temps de pause de 2s plus ou moins 1s
Étape 11 : Ajout des vérifications pour chaque réponse
Comme préconisé dans un de mes précédant article, nous allons vérifier chaque réponse.
-
Pour la page d'accueil, on va vérifier que la réponse contient bien « Plants By WebSphere Promo »
-
Pour l'affichage de la sélection de la catégorie, on va vérifier que la réponse affiche bien la catégorie.
Pour cela, nous allons récupérer dans la page d'accueil le texte associé à la catégorie choisie.
-
Utilisons une expression régulière.
Réponse HTML à analyser.
<a class="footer" onclick="return myfaces.oam.submitForm('footerform','footerform:j_id1717086759_3a23d219',null,[['category','0']]);" href="#">Flowers </a> : <a class="footer" onclick="return myfaces.oam.submitForm('footerform','footerform:j_id1717086759_3a23d2da',null,[['category','1']]);" href="#">Fruits & Vegetables </a> : <a class="footer" onclick="return myfaces.oam.submitForm('footerform','footerform:j_id1717086759_3a23d29b',null,[['category','2']]);" href="#">Trees </a> : <a class="footer" onclick="return myfaces.oam.submitForm('footerform','footerform:j_id1717086759_3a23d324',null,[['category','3']]);" href="#">Accessories </a> :
L'expression régulière utilisée sera la suivante.
\[\['category','${categorie}'\]\]\);" class="footer">(.+?)
-
Il nous reste à ajouter l'assertion
-
Enfin pour la vérification de la dernière transaction, on fait de même :
-
récupération par une expression régulière de l'identifiant de l'article ;
-
ajout de l'assertion
On remarquera que dans l'expression régulière on récupère deux valeurs et donc il faut utiliser la variable ${choix_item_g2} afin d'accéder à la deuxième qui est celle qui nous intéresse.
Voila le script complet à l'étape finale :
Si on exécute le script dix fois, on va obtenir :
Conclusion
Dans cet article, nous avons vu une partie des possibilités de JMeter qui permet d’enregistrer et de viabiliser un ensemble de scripts. La suite de la démonstration dans la partie 2.
































[...] auteur de plusieurs tutoriels JMeter / Performances sur Developpez.com, qui présente l’utilisation de JMeter pour réaliser un test d’une application JSF, avec la particularité du suivi utilisant le fameux [...]