JMeter : Déterminer automatiquement le chemin d’un fichier Source de données CSV en fonction de son système d’exploitation

Ce billet est inspiré ce commentaire de Vincent D. Merci à lui pour son commentaire et son autorisation d’utilisation dans ce billet.

Imaginez que vous devez faire un test de charge distribué avec un poste contrôleur et deux postes injecteurs. Malheureusement, vos injecteurs n’ont pas le même système d’exploitation que votre poste contrôleur. Ce dernier est sous Windows, et les injecteurs sont sous Linux.

Dans votre script JMeter, il y a un élément Source de données CSV qui vous permet (par exemple) d’avoir une liste d’identifiants/mot de passe de connexion.

Lors de la mise au point de votre script JMeter, vous utilisez seulement votre poste contrôleur, et la valeur du champ Nom de fichier dans votre Source de données CSV est :

c:/Temp/liste_login.csv

Ce chemin est valable sous Windows, mais bien entendu, ne sera pas valable sur vos injecteurs lorsque vous allez lancer le test distribué.

Juste avant ce test, il faut modifier le script JMeter pour changer la valeur du Nom de fichier par :

/tmp/liste_login.csv

Facile à faire, mais aussi facile à oublier de faire…

Voici un moyen de le faire automatiquement.

Ci-dessous un plan de test d’exemple :

Par rapport au commentaire de Vincent D. j’ajoute un élément Groupe d’unités de début. Ce dernier permet de réaliser l’opération de définition du chemin de fichier avant n’importe quel autre Groupe d’unités.

Donc, dans le Groupe d’unités de début, on place un Échantillon BeanShell qui va contenir un simple bout de code (Java) pour :

  1. Récupérer le nom du système d’exploitation (depuis les Propriétés Java)
  2. Faire un test sur le nom « windows », si oui on créé une propriété JMeter « CHEMIN » qui aura la valeur du chemin dans le poste Windows
  3. Sinon, ce sera le chemin Linux / Unix et Mac

Le code :

String sOs = System.getProperty("os.name").toLowerCase();
 if (sOs.contains("windows")) {
 props.setProperty("CHEMIN", "c:/Temp/");
 } else {
 // couvre Linux/Unix/Mac
 props.setProperty("CHEMIN", "/tmp/");
 }

On notera que le chemin est déposé dans une propriété JMeter (et non une variable JMeter), car la propriété JMeter se propage à travers les Groupes d’unités, ce qui n’est pas le cas de la variable JMeter.

Ensuite, on peut donc utiliser notre propriété CHEMIN dans l’élément Source de données CSV pour avoir un chemin adapté en fonction du système d’exploitation.

On utilisera la fonction JMeter __P() pour récupérer la valeur de la propriété CHEMIN :

${__P(CHEMIN)}