17 décembre 2013

JMeter - Tester la montée en charge d'un serveur


JMeter permet de faire des tests de performance et de montée en charge sur des serveurs.

Installation

JMeter s'installe à partir d'un fichier ZIP à télécharger à l'adresse suivante :

Utilisation

  • Démarrer JMeter en lançant le programme : bin/jmeter.bat
  • La fenêtre de JMeter apparaît :


    JMeter est composé d'un plan de test et d'un plan de travail.



    Remarque : Il faut faire attention à l'enregistrement :
    • Menu : Fichier > Enregistrer : 
      • Enregistre uniquement ce qu'il y a dans plan de test et non pas ce qu'il y a dans plan de travail.  
    • Clic droit sur plan de travail > Enregistrer sous : 
      • Enregistre ce qu'il y a dans plan de travail.

    Scénario

    Nous allons voir comment créer et tester un scénario de montée en charge et enfin établir un rapport.

    Choisir un scénario

    Le scénario de test doit être suffisamment pertinent pour simuler une vraie utilisation de l'application à tester. Il doit ainsi correspondre au cas d'utilisation prévue pour l'application.

    Il sera possible ensuite de créer d'autres scénarios pour des cas exceptionnels d'utilisation et de montée en charge.

    Créer un scénario de test

    Nous prenons comme exemple une application qui liste des livres. 
    Le scénario consistera à successivement afficher la page d'accueil, suivi de la page contenant la liste de tous les livres et enfin créer un livre.
    Au fur et à mesure que des livres seront créés, nous verrons comment se maintient le serveur notamment pour l'affichage de la page avec la liste de tous les livres.

    Groupe d'utilisateurs

    Le scénario commence par définir un Groupe d'unités de threads (Thread group) qui simule un groupe d'utilisateurs qui effectue en simultanée un lot de requêtes HTTP.
    • Créer un élément Groupe d'unités
      • Sélectionner : Plan de test
      • Menu : Editer / Ajouter / Moteurs d'utilisateurs / Groupe d'unités
      • Dans la section Propriétés du groupe d'unités :
        • Nombre d'unités : nombre d'utilisateurs en simultanée
        • Durée de montée en charge : durée avant lancement du scénario du prochain utilisateur
        • Nombre d'itérations: nombre de fois qu'est joué le scénario pour chaque utilisateur

    Requêtes HTTP

    Nous indiquons à l'aide de l'élément Paramètres HTTP par défaut (HTTP Request Defaults) les valeurs communes à toutes les requêtes HTTP de ce scénario. Nous pouvons ainsi définir qu'une seule le nom du serveur et le port utilisé.
    • Créer un élément Paramètres HTTP par défaut
      • Sélectionner : Groupe d'unités
      • Menu : Editer / Ajouter / Configuration / Paramètres HTTP par défaut
      • Dans la section Serveur web, définir l'adresse et le port du serveur à tester.
      • Dans le cas d'un serveur Tomcat en local, nous avons :
        • Nom ou adresse IP : localhost
        • Port : 8080

    Requêtes du scénario

    Nous pouvons maintenant définir notre série de requêtes HTTP à l'aide des éléments Requête HTTP (HTTP Request). Chaque élément Requête HTTP contient l'URI de la page, le mode HTTP (GET ou POST), les paramètres HTTP soumis ou passé dans l'URL.
    • Page d'accueil : Créer un élément Requête HTTP
      • Sélectionner : Groupe d'unités
      • Menu : Editer / Ajouter / Echantillons / Requête HTTP
      • Dans la section Requête HTTP :
        • Chemin : "[webapp]/" , avec [webapp] : le nom de la webapp sur le serveur, correspondant à : http://[adresse IP]:8080/[webapp]
        • Méthode : GET
    • Liste des livres : Créer un élément Requête HTTP
      • Sélectionner : Groupe d'unités
      • Menu : Editer / Ajouter / Echantillons / Requête HTTP
      • Dans la section Requête HTTP :
        • Chemin : "[webapp]/book"
        • Méthode : GET
    • Page de création d'un livre : Créer un élément Requête HTTP
      • Sélectionner : Groupe d'unités
      • Menu : Editer / Ajouter / Echantillons / Requête HTTP
      • Dans la section Requête HTTP :
        • Chemin : "[webapp]/book/create"
        • Méthode : GET
    • Créer un livre : Créer un élément Requête HTTP
      • Sélectionner : Groupe d'unités
      • Menu : Editer / Ajouter / Echantillons / Requête HTTP
      • Dans la section Requête HTTP :
        • Chemin : "[webapp]/book/create"
        • Méthode : POST
        • Envoyer les paramètres avec la requête :
          • avec en nom du paramètre / valeur
            • _method / PUT
            • title / book
            • author.id / 3
            • publisher.code / 1

    Tester le scénario

    Pour vérifier la validité du scénario, nous ajoutons un premier rapport Arbre de résultats pour voir les réponses pour chaque requête HTTP :
    • Créer l'élément Arbre de résultats
      • Sélectionner : Groupe d'unités
      • Menu : Editer / Ajouter / Récepteurs / Arbre de résultats
    Nous configurons le Groupe d'unités pour n'avoir qu'un seul utilisateur et une seule itération pour voir si tout se passe bien pour le cas nominal.
    • Sélectionner le Groupe d'unités
      • Propriétés du groupe d'unités :
        • Nombre d'unités : 1 utilisateur
        • Nombre d'itérations : 1 itération
    Maintenant, nous pouvons tester le scénario :
    • Sélectionner l'élément Arbre de résultats
    • Lancer le scénario 
      • Menu : Lancer / Lancer
    • Sur l'écran de l'élément Arbre de résultats, nous avons :
      • à gauche : la liste des requêtes HTTP
        • en vert : succès de la requête HTTP
        • en rouge : échec de la requête HTTP
      • à droite : les informations concernant une des requêtes HTTP sélectionnée
        • Résultat de l'échantillon : informations HTTP
        • Requête : informations HTTP
        • Données de réponse : code source HTML de la page retournée au navigateur
    Dans l'arbre de résultats, nous avons à vérifier que toutes les requêtes sont en succès (en vert).

    De plus, nous avons à regarder le code source HTML de la page retournée pour regarder que le contenu est correct et, dans notre exemple, que la création du livre s'est bien passée.

    Rapport de test

    Une fois que le scénario a été vérifié, nous pouvons effectuer notre scénario de montée en charge du serveur et définir les éléments nécessaires pour notre rapport de test, comme par exemple des graphiques :
    • Créer un élément pour notre rapport de test
      • Sélectionner : Groupe d'unités
      • Menu : Editer / Ajouter / Récepteurs / < Choisir l'élément voulu pour le rapport >
    Ces éléments du rapport sont remplis automatiquement au lancement du scénario de test.
    • Pour en effacer le contenu des graphiques et des éléments du rapport pour le prochain lancement du scénario de test :
      • Menu : Lancer / Nettoyer tout

    Voici quelques éléments possibles pour notre rapport de test :

    Graphique de résultats

    Ce graphique affiche l'évolution du débit et du temps de réponse des requêtes HTTP.

    Ceci permet de détecter si le temps de réponse du serveur reste constant dans le temps.

    Le fait que la durée des requêtes augmente indique que le serveur commence à avoir plus de mal à répondre à la charge.

    Il faudrait que le temps de réponse des requêtes devienne constant dans le temps lorsque dans le scénario le serveur reçoit les mêmes types de requêtes et sur les mêmes fréquences.

    Graphique aggrégé

    Ce graphique affiche un histogramme qui va mettre en évidence la requête HTTP qui mettra le plus de temps.

    De plus, un tableau de données indique le temps moyen, le plus élevé, ainsi que le débit pour chaque requête HTTP. Il contient également le taux d'erreur par page.

    Ce graphique permet d'identifier les pages qui posent problème dans le scénario de test de montée en charge

    Nous voyons dans notre exemple que c'est la requête book qui prend le plus de temps : il s'agit de la page d'affichage de tous les livres.

    Arbre de résultats

    L'arbre de résultat a stocké les résultats de toutes les requêtes HTTP.

    Il permet de voir ce qui est renvoyé par le serveur en cas d'erreur.

    Par exemple, une erreur de type"java.net.SocketException: socket closed" ou "java.lang.IllegalStateException: Connection is not open" indique que le serveur n'a pas pu répondre à la requête HTTP car il est en surcharge ou arrêté.


    Plugins

    Il existe également des plugins pour avoir davantage d'éléments dans notre rapport.

    Certains plugins sont disponibles sur les sites suivants :

    Utiliser JMeter à travers un proxy

    Dans le fichier jmeter.bat ajouter à la ligne de commande les paramètre -H et -P pour l'hôte et le port de proxy.

    %JM_START% %JM_LAUNCH% %JVM_ARGS% %ARGS%
     -jar "%JMETER_BIN%ApacheJMeter.jar" 
     %JMETER_CMD_LINE_ARGS% -H hostname -P 80

    Conclusion

    JMeter permet de simuler une montée en charge de plusieurs utilisateurs sur un même serveur. Cet outil permet de repérer les pages qui peuvent poser problème et qui pourraient présenter un problème de performance pour l'application.

    Cependant pour être réaliste, il est nécessaire que le serveur et JMeter se trouve sur deux machines séparées.

    Ressources sur Internet