IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Introduction à Apache JMeter, un outil de test de montée en charge - partie 1

Image non disponible

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ème, 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 ses plugins. Cet article est issu d'un billet du blog d'Aliecom qui a autorisé Developpez.com à le mettre à disposition pour ses membres. Pour réagir au contenu de cet article, un espace de dialogue vous est proposé sur le forum

4 commentaires Donner une note à l´article (5)

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

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.

II. Scénario à scripter

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 :
Image non disponible
  • sélectionner une catégorie d'articles :
Image non disponible
  • sélectionner un article :
Image non disponible

Ce scénario va se traduire dans JMeter par le processus détaillé ci-dessous.

III. É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.

Image non disponible

IV. É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.

Image non disponible

V. Étape 3 : Gestion des cookies à l'aide de « HTTP Cookie Manager »

Image non disponible

VI. Étape 4 : Gestion du cache à l'aide de « HTTP Cache Manager »

Image non disponible

VII. É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

Image non disponible

VIII. Étape 6 : Découpage du script en transaction

Image non disponible

Afin de faciliter la lecture des résultats, pour chaque Transaction Controller, on sélectionne Generate parent sample.

Image non disponible

IX. Étape 7 : Enregistrement du script à l'aide du proxy

Image non disponible

X. É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

Image non disponible

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)
Image non disponible
  • 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.
Image non disponible
  • Corrélons le reste des variables du formulaire.
Image non disponible
  • Commençons par la variable javax.faces.ViewState

Pour cela, nous allons récupérer à l'aide d'une expression régulière (Add -> PostProcessors -> 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.

 
Sélectionnez
<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 :

 
Sélectionnez
bannerform_SUBMIT.+?name="javax.faces.ViewState" id="javax.faces.ViewState" value="(.+?)"
Image non disponible
  • Puis, utilisons la variable ViewState_valeur dans le formulaire.
Image non disponible
  • Faisons de même avec la variable bannerform:_idcl

Réponse HTML à analyser :

 
Sélectionnez
<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 :
 
Sélectionnez
onclick="return myfaces.oam.submitForm\('bannerform','(.+?)',null,\[\['category','${categorie}'\]\]\);"
Image non disponible
  • Finalement, on aura :
Image non disponible

XI. Étape 9 : Variabilisation du choix de l'article

Cette fois-ci tout se passe dans la requête 40 /PlantsByWebSphere/shopping.jsf

Image non disponible
  • 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 :

 
Sélectionnez
<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 :
 
Sélectionnez
return myfaces.oam.submitForm\('shopping','(.+?)',null,\[\['itemID','(.+?)'\]\]
Image non disponible
  • De même pour la variable javax.faces.ViewState

Réponse HTML à analyser :

 
Sélectionnez
<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 :
 
Sélectionnez
shopping_SUBMIT.+?name="javax.faces.ViewState" id="javax.faces.ViewState" value="(.+?)"
  • Finalement, on aura :
Image non disponible

XII. É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 deux secondes plus ou moins une seconde.

Image non disponible

XIII. Étape 11 : Ajout des vérifications pour chaque réponse

Comme préconisé dans un de mes précédents articles, 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
Image non disponible
  • Pour l'affichage de la sélection de la catégorie, on va vérifier que la réponse affiche bien la catégorie :
Image non disponible

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 :

 
Sélectionnez
<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 :

 
Sélectionnez
\[\['category','${categorie}'\]\]\);" class="footer"&gt;(.+?)
Image non disponible
Image non disponible
  • 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 :
Image non disponible
  • ajout de l'assertion :
Image non disponible

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.

  • Voilà le script complet à l'étape finale :
Image non disponible
  • Si on exécute le script dix fois, on va obtenir :
Image non disponible

XIV. Conclusion

Dans cet article, nous avons vu une partie des possibilités de JMeter qui permet d'enregistrer et de variabiliser un ensemble de scripts. La suite de la démonstration dans la partie 2.

XV. Remerciements

Je remercie Aliecom et en particulier Stéphane pour sa relecture.

Je remercie FirePrawn pour sa relecture orthographique.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2012 Antonio Gomes Rodrigues. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.