Automatisation des tests avec JMeter

JMeter est un outil open source permettant l’automatisation de tests de charge. Il peut également être utilisé pour automatiser les tests d’acceptation (appelés tests fonctionnels dans la documentation de JMeter).

JMeter est un outil adapté pour le test de sites Web, d’API Web et de services Web même si JMeter peut également être utilisé dans d’autres contextes (tests de base de données, FTP, mail…).

Installation et lancement

JMeter est téléchargeable à cette adresse :

JMeter est une application Java qui requière au minimum l’installation de Java 1.8. Pour finir l’installation, il suffit de désarchiver le fichier téléchargé n’importe où sur le disque.

À l’intérieur du répertoire créé, on trouve un répertoire bin qui contient un ensemble de scripts pour lancer JMeter avec une interface graphique ou sans interface graphique. Ce dernier mode est utile pour le lancement de campagnes de test de charge.

Les scripts bin/jmeter.bat et bin/jmeter.sh permettent de lancer l’interface graphique de l’outil respectivement sous Windows et sous MacOS / Linux.

Principe d’un plan de test

L’interface graphique de JMeter permet de concevoir et d’exécuter des plans de test. Un plan de test se présente sous la forme d’une arborescence contenant des composants qui vont définir les étapes à exécuter.

Généralement, un composant qui se trouve dans l’arborescence sous un autre composant ne s’applique que pour ce composant.

Plan de test d’exemple

Vous pouvez télécharger un plan de test d’exemple : duckduckgo.jmx. Ce plan de test exécute des requêtes HTTP vers le moteur DuckDuckGo.

Astuce

La documentation de JMeter propose une introduction pour la construction d’un plan de test pour le Web :

Vous pouvez vous y reporter pour une introduction aux principaux composants qui sont utiles pour réaliser ce type de plan de test.

Nous présentons dans les sections ci-dessous les familles des composants disponibles.

Les thread groups (moteurs d’utilisateurs)

Un thread group est l’élément de base d’un plan de test. Chaque utilisateur est représenté par un thread qui va exécuter l’ensemble du plan de test. Pour simuler la montée en charge d’un serveur, on peut configurer plusieurs threads, c’est-à-dire plusieurs utilisateurs réalisant le même plan de test en parallèle. Il est possible de répéter le plan de test un certain nombre de fois ou durant une période de temps.

Un thread group est généralement placé directement sous le plan de test dans l’arborescence des composants.

Les samplers (échantillons)

Les samplers réalisent une action avec le système à tester. Pour le test d’une application Web ou d’une API Web, le HTTP Request est le sampler le plus utile. Il permet de programmer une requête vers un serveur Web.

Les listeners (récepteurs)

Les listeners sont chargés de récupérer les données produites par les samplers afin de produire des résultats de tests. Il existe des listeners pour produire des rapports et des graphes de résultats.

Astuce

Certains listeners comme le View Results Tree ne doivent pas être utilisés lors d’une campagne de charge car leur utilisation pénalise les performances de l’outil.

Les logic controllers (les contrôleurs logiques)

Les contrôleurs logiques permettent de créer des plans de test complexes basés sur des conditions ou des répétitions. Par exemple, le Loop Controller permet d’exécuter plusieurs fois une partie du plan de test. Les contrôleurs logiques agissent sur les composants qui sont placés comme leur fils dans l’arborescence.

Les configuration elements (les configurations)

Les configuration elements permettent de réaliser des configurations centralisées. Pour le Web, on pourra utiliser :

  • le HTTP Cookie Manager qui permet de gérer automatiquement les cookies émis par un site. Il permet à JMeter d’avoir un comportement similaire à un navigateur Web.

  • le HTTP Header Manager qui permet de définir des en-têtes HTTP. Ces en-têtes seront ajoutés dans chaque requête émise. Il est ainsi possible de fournir un en-tête user-agent par défaut pour simuler un navigateur Web particulier.

  • le HTTP Request Defaults qui permet de fournir des informations par défaut pour les requêtes HTTP émises : le schéma, l’hôte, le port et éventuellement des paramètres de requête.

  • le User Defined Variables qui permet de définir des variables.

Les configuration elements sont appliqués à tous les composants situés au même niveau de l’arborescence ou à un niveau inférieur. Il est généralement conseillé de les placer directement comme fils du plan de test ou d’un thread group pour plus de lisibilité.

Les assertions

Les assertions permettent de valider les données récupérées par les samplers. Grâce à ce mécanisme, JMeter peut être utilisé comme un outil d’automatisation de tests d’acceptation (functional testing). Généralement, les assertions sont ajoutées comme filles d’un sampler pour valider sa réussite. L’assertion la plus simple à utiliser est la Response Assertion.

Un plan de test complet doit contenir au moins une assertion par sampler afin de valider les scénarios de tests.

Les pré-processeurs et les post-processeurs

Comme leur nom l’indique, les pré-processeurs et les post-processeurs sont des composants qui sont exécutés respectivement avant et après chaque sampler. Leur rôle est variable.

  • User Parameters permet de définir la valeur de variables pour chaque thread, c’est-à-dire pour chaque utilisateur simulé.

  • Les extracteurs permettent de créer des variables à partir de données extraites de la réponse obtenue par un sampler. On peut extraire une donnée à partir d’un sélecteur CSS dans une page Web grâce au CSS Selector Extractor. On peut extraire une donnée à partir d’un chemin XPath dans un document XML grâce au XPath2 Extractor. On peut extraire une donnée à partir d’un chemin JSON dans un document JSON grâce au JSON Extractor.

Les timers (compteurs de temps)

Les timers permettent d’introduire des pauses dans l’exécution du plan de test. La durée de ces pauses peut être fixe ou aléatoire. Cela permet d’éviter de surcharger un serveur lors de tests fonctionnels. Cela permet également de simuler une activité plausible des utilisateurs d’un site Web.

Une pause peut être appliquée à un sampler spécifique. Dans ce cas, le timer doit être fils du sampler. Si plusieurs timers sont applicables au même sampler alors JMeter additionne les effets de tous les timers.

Par exemple, le Constant Timer, comme son nom l’indique, permet de spécifier une pause en millisecondes.

Astuce

Pour simuler le temps de réflexion d’un utilisateur (think time) à un moment précis du plan de test, vous pouvez utiliser le sampler Flow Control Action. Il s’agit d’un sampler particulier car il n’interagit pas avec le système à tester et ne produit pas de résultat. Il permet simplement d’introduire une pause… voire même un arrêt du thread.

Utilisation des variables

Il est possible d’utiliser des variables dans un plan de test. On peut déclarer des variables directement sur le plan de test et rendre celui-ci configurable. On peut également déclarer des variables grâce au composant User Defined Variables et au composant User Parameters. Les extracteurs permettent également de créer des variables contenant les données extraites.

Les variables peuvent notamment être référencées dans les assertions et les samplers sous la forme :

${nomDeLaVariable}

Il est donc facile de créer des assertions ou de passer des paramètres à des requêtes HTTP à partir d’informations extraites d’une précédente réponse ou à partir d’un paramètre du plan de test lui-même.

Exécuter une campagne de test (mode sans IHM)

L’interface graphique de JMeter permet de créer et d’exécuter des plans de test. Cependant, l’exécution de plan de test (et spécifiquement des plans de test de charge) devrait se faire sans interface graphique pour ne pas subir de ralentissement dû à l’interface elle-même.

Il est possible de lancer une campagne de test sans interface graphique avec la commande :

jmeter -n -t [fichier jms de campagne] -l [fichier de résultat] -e -o [repertoire de sortie du rapport]

Note

Par convention, le fichier de résultat spécifié avec le paramètre -l devrait avoir une extension .jtl. Ce fichier peut ensuite être chargé dans l’interface graphique avec un listener comme le View Results Tree.

Astuce

Sous Windows, vous pouvez glisser/déposer un fichier .jmx sur le fichier jmeter-n.cmd pour lancer une campagne de test sans interface graphique.