# Apache JMeter

Apache JMeter est un projet de logiciel libre permettant d'effectuer des tests de performance d'applications et de serveurs selon différents protocoles ainsi que des tests fonctionnels. Il est développé au sein de la Fondation Apache (ASF).
JMeter est écrit en Java et un peu en Kotlin depuis la version 5.5, ce qui lui permet d'être utilisé sur tout système d'exploitation supportant une machine virtuelle Java (JVM).
Il permet de simuler le comportement de plusieurs utilisateurs agissant de manière simultanée sur une application Web. Au fur et à mesure de ses développements, il a été étendu et permet de tester d'autres types d'applications : serveurs ftp, serveurs de services Web, bases de données accessible via jdbc, serveurs TCP/IP, LDAP, etc.
Il mesure le temps de réponse de chaque requête et produit des statistiques de ces temps de réponse.
Il contient les principales fonctionnalités de ce type d'outil : Utilisation d'un jeu de données externalisées (fichiers CSV), enregistrement de scénarios web, scénarios "dynamiques", s'adaptant aux réponses des serveurs, détection d'erreurs, extensibilité, gestion des cookies et des réécritures (en) d'URL, lancement des tests sur plusieurs serveurs JMeter, etc. Il est également possible, à partir de la version 2.4, de faire de l'"IP spoofing" (simulation de plusieurs adresses IP à partir du même poste de test) en utilisant les requêtes HTTP HTTPClient (HttpClient version 4 minimum).
Des pré/post processeurs de tests sont disponibles, permettant par exemple de modifier dynamiquement une requête avant son exécution ou d'extraire des données de résultats de test. Les résultats des tests peuvent être visualisés de différentes manières et peuvent également être enregistrés sous fichier au format XML ou CSV.
JMeter peut également faire des tests fonctionnels d'une application, permettant ainsi de valider les fonctionnalités d'une application de manière automatisée.

## Points intéressants

Le spectre des tests de performances réalisables est assez large. Il y a moyen de tester les performances de scripts SQL, de requêtes HTTP/SOAP/REST/EJB, d'appels à des classes Java et autres encore. L'interface graphique de JMeter offre des possibilités de faire des tests multi-threads, de créer des boucles et contrôleurs de tests plus spécifiques.
Ses principales fonctionnalités sont :
* Test de performance ;
* Test de robustesse : Simulation de trafic pour vérifier la robustesse selon le niveau de trafic ;
* Test de rupture ;
* Réalisation de résultats statistiques sous plusieurs formes graphiques et textuelles ;
* etc.
JMeter est un outil générique de tests, il n'est pas limité à une seule nature de types de tests, c'est le métrologue qui, en créant son scénario de tests, définit le type de tests. On peut également mélanger des protocoles dans le même test (http et ftp par exemple). Par ailleurs, JMeter est extensible avec des plugins, c'est-à-dire qu'il est possible de créer de nouveaux types d'échantillons (requêtes) implémentant d'autres protocoles ou des récepteurs (Listeners).

## Composants de base de Apache JMeter

* Plan de test : Emplacement à partir duquel on définit ce que l'on teste.
* Groupe d'unités : Emplacement à partir duquel on définit les paramètres de la simulation :
* Nombre d'unités : nombre d'utilisateurs qui se connectent.
** Durée de montée en charge : intervalle de temps où ces utilisateurs se connectent progressivement.
** Nombre d'itérations : nombre d'itérations que fera chaque unité (utilisateur).
*** L'option Infini : spécifie que les unités itèrent indéfiniment (souvent dans ce cas, l'arrêt est manuel ou au bout d'une durée en seconde).
* Gestionnaire SSL : Composant permettant de gérer des clés SSL pour s'authentifier via un certificat SSL.
Apache JMeter contient les éléments suivants :
* Échantillons : requêtes que l'on peut envoyer à un serveur ou une application Web pour tester ses ressources. Apache JMeter inclut les requêtes FTP, les requêtes HTTP, les requêtes JDBC, les requêtes JMS, les requêtes objet Java, les requêtes LDAP, les requêtes SOAP/XML-RPC/REST-JSON et les requêtes WebService (SOAP).
* Contrôleurs : permet la spécification des paramètres du test à effectuer. Apache JMeter inclut plusieurs types de contrôleurs :
** Contrôleur interleave et Contrôleurs aléatoire : composants permettant d'envoyer des requêtes dans un ordre aléatoire.
** Contrôleur boucle : composant permettant d'envoyer plusieurs fois les requêtes spécifiées.
** Contrôleur d'exécution unique : composant permettant de lancer une seule fois les requêtes spécifiées quel que soit le nombre d'itérations prévues.
** Contrôleur transaction : composant permettant de consolider les résultats (temps de réponse) d'un ensemble de requêtes.
** Contrôleur enregistreur : composant destinée à capter les requêtes HTTP interceptées par le composant Proxy HTTP.
Apache JMeter permet de gérer les paramètres de certains sites ou serveurs (cookies, sites sécurisés). Les composants disponibles pour gérer ces paramètres sont les suivants :
* HTTP, FTP, LDAP, JDBC et Java Request Defaults : Composants permettant de définir des paramètres par défaut, ils seront utilisés pour toutes requêtes.
* Gestionnaire d'autorisation HTTP : Composant fournissant un identifiant et un mot de passe pour les sites où l'accès est restreint.
* Gestionnaire de cookies HTTP : Composant permettant de stocker, d'envoyer et de spécifier des cookies à envoyer au serveur.
* Gestionnaire d'entêtes HTTP : Composant permettant de définir l'entête HTTP des requêtes envoyées.
Apache JMeter donne la possibilité d'insérer une pause entre chaque requête envoyée à travers les éléments Compteurs de temps ou Action de contrôle d'exécution avec action = Pause. Les différents Compteurs disponibles sont :
* Compteur de temps fixe : Composant permettant d'insérer un temps constant entre chaque requête envoyée.
* Compteur de temps aléatoire gaussien : Composant permettant d'insérer un temps aléatoire selon la logique Gaussienne entre chaque requête envoyée.
* Compteur de débit constant : Composant permettant de contrôler la fréquence d'exécution d'une requête.
* Compteur de synchronisation : Composant permettant d'attendre un certain nombre d'unités pour exécuter la prochaine requête en même temps.
L'analyse des réponses des serveurs se fait par des assertions, il en existe plusieurs types :
* Assertion réponse : Vérifie si une ou plusieurs chaînes de caractères se trouvent dans la réponse reçue.
* Assertion durée : Vérifie si la réponse a été reçue avant ou après un temps prédéfini.
* Assertion taille : Vérifie si la taille de réponse (en octets) est supérieure, inférieure, égale, ... à une taille prédéfinie.
* Assertion XML : Vérifie que la page de réponse est un document XML valide.
* Assertion MD5 : Vérifie si l'empreinte MD5 de la réponse (entête et corps) correspond à une empreinte MD5 prédéfinie.
* Assertion JSON : Vérifie un chemin au format JSON
* Assertion XPATH : Vérifie une expression XPATH pour un flux XML
Pour l'acquisition et l'affichage des résultats des tests, Apache JMeter inclut des récepteurs. Plusieurs récepteurs sont disponibles :
* Graphique de résultats : Composant fournissant un graphique présentant les temps de réponse, la moyenne, la médiane, l'écart-type des différentes requêtes effectuées.
* Moniteur de courbe (spline) : Composant fournissant un graphique du temps de réponse des différentes requêtes exécutées, selon la logique Spline.
* Résultats d'assertion : Composant fournissant les résultats des assertions sous forme textuelle de toutes les requêtes exécutées.
* Visualiseur de courrier : Composant permettant l'envoi d'un mail à l'administrateur en cas de trop nombreux échecs aux requêtes exécutées.
* Arbre de résultats : Composant affichant la liste des requêtes exécutées, leur type et leurs données de réponses formatées ou non pour faciliter l'affichage (XML, JSON, HTML formaté ou affiché, Texte brute). Il permet aussi de tester directement sur la réponse les extractions JSON Path, Expression régulière, CSS Path ou par bornes.
* Tableau de résultats : Composant créant une table de l'ensemble des requêtes exécutées, leur type, leur temps de réponse et leur validité.
* Rapport agrégé : Composant créant une table de l'ensemble des statistiques des tests effectués.
* Enregistreur de données simple : Composant qui enregistre les résultats des tests vers un fichier donné.
JMeter propose un élément hors-test appelé "HTTP(S) Test Script Recorder" (ancien nom : "HTTP Proxy Server") qui permet l'enregistrement d'une session d'utilisation d'une application Web effectuée depuis son navigateur. Les requêtes sont interceptées par le proxy recoder, et créées en sous éléments d'un contrôleur Enregistreur, prêtes à être réexécutées. Ceci accélère la réalisation d'un scénario de test de performance.

## Livres de référence

* Master JMeter from Load Testing to DevOps, Livre en Anglais par Antonio Gomes Rodrigues, Bruno Demion (Milamber) et Philippe Mouawad, Octobre 2018
* Maîtriser JMeter : Du Test de charge à Devops, Livre en français par Antonio Gomes Rodrigues, Bruno Demion (Milamber) et Philippe Mouawad, Novembre 2015
* JMeter Cookbook, Livre en anglais par Bayo Erinle Octobre 2014
* Performance Testing with JMeter, Livre en anglais par Bayo Erinle Juillet 2013
* Apache JMeter, Livre en anglais par Emily H. Halili Juin 2008