Exemple de Scenario JDBC avec Apache JMeter

Apache JMeter est un outil simple pour écrire des tests fonctionnels et des tests de charge. Dans cet article, vous trouverez un exemple d’utilisation qui met en oeuvre des requêtes JDBC avec une base Oracle. L’objectif est d’illustrer l’utilisation de variables dans ces requêtes ; leurs valeurs peuvent, par exemple, être extraites :

  • d’un fichiers
  • d’un générateur 
  • d’un résultat collecté depuis d’une requête précédente

Bien sur, il ne s’agit pas de présenter Apache JMeter : son site web est le meilleur endroit pour ça ! L’objectif est d’illustrer son utilisation à travers un exemple qui reste simple et qui permette en même temps d’illustrer des enchainements des requêtes paramétrées à l’aide de variables.

Télécharger et installer JMeter

Pour installer JMeter, il suffit de le télécharger depuis le site d’Apache, de le décompresser, de positionner l’environnement Java (JAVA_HOME et PATH) et de lancer jmeter.sh ou jmeter.bat qui se situent dans le répertoire bin. Pour toute information utile, commencez par lire le manuel utilisateur.

Créer un plan de test pour JDBC

Vous pouvez téléchargez directement le plan de tests de cet exemple dans le fichier JDBCTestPlan.zip. Son contenu se présente comme ci-dessous :

Il est constitué des étapes suivantes :

  • La configuration de la connexion JDBC donne toutes les indications pour se connecter à la base de données Oracme
  • La configuration du jeu de données CSV pointe vers un fichier CSV d’où seront extraites des valeurs de variables
  • L’étape « Select Dual » exécute une requête avec un paramètre extrait du fichier CSV
  • L’étape « Insert Output » insère des données dans une table à partir d’une valeur retournée dans l’étape précédente
  • L’étape de « Visualisation des résultats sous forme d’un arbre » permet d’afficher les informations de chaque requête du plan, y compris les données en entrée et en sortie
  • L’étape de « Visualisation des Résultats sous la forme d’un Graphe Aggrégé » permet de créer un graphe qui donne une idées des performances du test

Avant de commencer, il vous faut ajouter le driver JDBC d’Oracle au projet; pour cela, naviguez sur votre plan de tests nommé ici « Test Plan » et ajoutez la bibliothèque Java de vos drivers. Dans notre cas, nous avons ajouté ojdbc6.jar de la version Oracle Database 11.2.

Configurer les Threads en parallèle

L’étape suivante consiste à paramétrer un groupe de threads qui fonctionnent en parallèle. Chaque thread représente un utilisateur ; chaque utiliseur peut exécuter sa suite d’opérations (les samplers) inclue dans son thread un certain nombre de fois ; dans ce exemple :

  • Number of Threads est positionné à 1, ce qui signifie qu’on 
  • Ramp-Up Period n’a pas de sens ici puisqu’il n’y a qu’un seul thread ; sinon il indiquerait le temps nécessaire pour démarrer l’ensemble des threads
  • Loop Count est positionné à 10; cette valeur indique le nombre de fois que l’utilisateur exécute la suite d’opérations située dans le groupe de threads ; dans ce cas chaque utilisateur exécutera 10 fois la séquence « select » puis « insert ».

Configurer le pool de connexions JDBC

Les éléments de « Configuration » ne sont pas des étapes à proprement parler. Il s’agit des informations de configuration utilisées par les étapes qui s’exécutent ensuite ; elles sont attachées au « Thread Group » directement et leur position dans ce groupe (en début, au milieu ou en fin) n’a pas d’importance. La configuration des connexions JDBC est utilisée par les étapes « Select Dial » et « Insert Output » détaillées ci-après. Les informations de configuration sont les suivantes :

  • Variable Name est le nom de la variable utilisée pour référencer le pool de connexions. Vous pouvez mettre le nom de votre choix, comme ici : myPool pour référencer ensuite le pool de connexion
  • Auto Commit indique si un commit automatique est réalisé après chaque opération. Si ce n’est pas le cas, vous devrez vous assurer qu’une étape spécifique termine la transaction ; pour simplifier notre exemple, nous avons mis « True » même si ce n’est probablement pas la meilleure chose
  • Validation Query est positionnée à « select dummy from dual ». Cette requête indique comment valider que les requêtes établies restent ouverte
  • Database URL indique la chaine de connexion à votre base de données ; ici « jdbc:oracle:thin:@pink:1521/WHITE »
  • JDBC Driver Class indique la classe du driver JDBC à utiliser ; ici « oracle.jdbc.Oracle Driver »
  • Username et Password indique l’utilisateur et le mot de passe de connexion à la base de données.

Configurer l’accès au fichier input.csv

L’élément de configuration, « CSV Data Set Config » indique un fichier utilisé pour alimenter des variables. Les informations associées sont :

  • Filename : le nom du fichier; ici /home/arkzoyd/input.csv
  • File encoding : le jeu de caractères d’encodage; ici UTF-8
  • Variables Names : le nom des variables associées aux colonnes du fichier; ici entry
  • Delimiter : le caractère utilisé comme délimiteur ; ici ,
  • Allow quoted data? : indique si les champs textes peuvent être inclus dans des guillemets; ici False
  • Recycle on EOF? : indique si le fichier est repris au début dans le cas où on atteind la fin du fichier ; ici True
  • Stop thread on EOF? : indique si le fichier les thread est stoppé quand la find du fichier est atteinte ; ici False
  • Sharing mode : indique si le même fichier est partagé entre tous les threads ; ici le fichier est partagé entre tous les threads « All threads »

Vous devrez ensuite créer le fichier input.csv comme ci-dessous :

$ cd /home/arkzoyd
$ cat input.csv
1
2
3
4
5
1
2
3
4
5

Requête Select

L’étape suivante consiste à ajouter un Sampler de type JDBC Request ; Ses paramètres sont les suivants :

  • Variable Name Bound to Pool indique
    le nom du pool de connexion ; ici on référence myPool configuré précédemment.
  • Query Type indique le type de requête; si vous voulez utiliser un SELECT avec des paramètres avec la syntaxe ?, utiliser « Prepared Select Statement« .
  • La requête SQL de votre choix ; ici select « count(*) from dual connect by level <= ? »
  • Parameter values indique les valeurs des paramètres ; pour référencer la variable entry alimentée depuis le fichier CSV, on l’encadre dans la chaine ${} ; ici ${entry} indique donc la valeur de la variable entry. On peut ajouter plusieurs paramètres en les séparant par des ,
  • Parameter types indique le type des paramètres de la requête; ici entry contient un « INTEGER »
  • Variable names indique les noms des variables alimentées par le select; ici le résultat du select alimente la variable « out1 ».

Ordre Insert

L’étape suivante consiste à ajouter un Sampler de type JDBC Request pour faire un insert ; Ses paramètres sont les suivants :

  • Variable Name Bound to Pool indique le nom du pool de connexion ; ici on référence myPool configuré précédemment.
  • Query Type indique le type de requête; si vous voulez utiliser un INSERT avec des paramètres avec la syntaxe ?, utiliser « Prepared Update Statement« .
  • La requête SQL de votre choix ; ici insert into output(id, entry_time, p1) values (output_seq.nextval, systimestamp, ?)
  • Parameter values indique les valeurs des paramètres ; pour référencer la valeur de la variable out1 extraite de la première ligne du SELECT, on la suffixe par _1 et on l’encadre dans la chaine ${} ; ici ${out1_1} indique donc la valeur de la variable out1 à la première ligne du select précédent. Pour plus d’informations, reportez-vous au manuel de référence de JMeter à propos des JDBC Request.
  • Parameter types indique le type des paramètres de la requête; ici out1_1 contient un « INTEGER »
  • Variable names indique les noms des variables alimentées ; ici l’insert ne renvoie aucune valeur et donc aucune variable n’est alimentée

Pour que l’étape fonctionne, il vous faudra au préalable créer la table et la séquence ci-dessous dans le schéma utilisé par le pool de connexion JDBC ; voici le script à lancer avant de démarrer votre test :

create table output(id number primary key, 
entry_time timestamp,
p1 number);

create sequence output_seq;

Collecte des informations d’exécution détaillées

L’élément « View Result Tree » permet d’afficher les résultats détaillés de l’exécution de vos tests :

Collecte des informations d’exécution aggrégées

L’élément « Aggregate Graph » permet d’afficher un résultat aggrégé de vos tests et de constituer des graphes à partir de ces informations. 

Exécution du plan de tests

Vous pourrez exécuter votre plan de test à l’aide du menu :

  • « run > clear all » pour effacer les résultats obtenu préalablement
  • « run > start » pour démarrer les tests

Une fois vos tests réalisés, vous pourrez vous assurer qu’ils fonctionnent correctement en retrouvant le contenu de votre fichier input.csv dans la table output à l’aide de la requête ci-dessous :

set tab off
col ENTRY_TIME format a35
col p1 format 999
select ENTRY_TIME, p1
from output
order by id;

ENTRY_TIME P1
----------------------------------- ----
31-JUL-11 09.09.55.074323 AM 1
31-JUL-11 09.09.55.099443 AM 2
31-JUL-11 09.09.55.101537 AM 3
31-JUL-11 09.09.55.103571 AM 4
31-JUL-11 09.09.55.105485 AM 5
31-JUL-11 09.09.55.142589 AM 1
31-JUL-11 09.09.55.145009 AM 2
31-JUL-11 09.09.55.147158 AM 3
31-JUL-11 09.09.55.149371 AM 4
31-JUL-11 09.09.55.186095 AM 5

Conclusion

Il est peu probable que vous utilisiez un jour Apache JMeter pour tester une base de données Oracle, quoique … Cet article illustre en revanche bien comment stocker ses jeux de données de tests dans une base de données et intercaler les tests de votre applications à des requêtes qui construiront l’enchainement des valeurs utilisées en fonction de valeurs testées. De quoi construire des tests très compliqués en combinant JMeter à vos bases de données.

Et si après avoir manipulé les fonctions de scripting, extensions et assertions, vous n’y arrivez pas à faire ce que vous voulez avec JMeter ou que vous ayez besoin d’une plateforme plus complète capable d’analyser les indicateurs ou de descendre jusqu’au code de l’application, jetez un oeil intéressé du côté de Eclipse Test and Performance Tools Platform