Comment passer une variable d’un groupe de threads à un autre dans JMeter

J’ai un test JMeter avec 2 groupes de threads – le premier est un thread unique (qui crée un inventaire) et le second a plusieurs threads (qui achètent tout l’inventaire). J’utilise BeanShell Assertions et XPath Extractors pour parsingr la valeur renvoyée (qui est XML) et stocker les variables (telles que les identifiants des éléments à acheter).

Cependant, les valeurs créées dans le premier groupe de threads, qu’elles soient extraites dans des variables de type ${jmeter} standard ou ${__BeanShell(vars.get("jmeter"))} , ne sont pas disponibles dans le deuxième groupe de threads. Y a-t-il un moyen de créer une variable dans le premier groupe de threads et de la rendre visible au second?

Je n’ai pas pu faire cela avec des variables (puisque celles-ci sont locales à des threads individuels). Cependant, j’ai pu résoudre ce problème avec les propriétés!

Encore une fois, mon premier groupe ThreadGroup exécute toute la configuration et certaines informations de ce travail doivent être disponibles pour chacun des threads du deuxième groupe ThreadGroup. J’ai une assertion BeanShell dans le premier ThreadGroup avec les éléments suivants:

 ${__setProperty(storeid, ${storeid})}; 

Le $ {storeid} a été extrait avec un XPath Extractor. L’assertion BeanShell fait d’autres choses, comme vérifier que storeid a été renvoyé de l’appel précédent, etc.

Quoi qu’il en soit, dans le deuxième ThreadGroup, je peux utiliser la valeur de la propriété “storeid” dans Samplers avec les éléments suivants:

 ${__property(storeid)} 

Fonctionne comme un charme!

Selon la documentation de JMeter:

16.12 Partage de variables entre les threads et les groupes de threads

Les variables sont locales à un thread, une variable définie dans un thread ne peut pas être lue dans un autre. C’est par conception. Pour les variables pouvant être déterminées avant le démarrage d’un test, voir Tests de paramétrage (ci-dessus). Si la valeur n’est pas connue avant le début du test, plusieurs options sont possibles:

  1. Stocker la variable en tant que propriété – les propriétés sont globales à l’instance JMeter
  2. Ecrire des variables dans un fichier et les relire.
  3. Utilisez l’espace de noms bsh.shared – voir 16.8.2 Partage des variables
  4. Écrivez vos propres classes Java

Une autre façon de passer des variables entre les threads consiste à utiliser jmeter-plugins comme mentionné par Andrey Botalov ci-dessous .

Mais je trouve que c’est un peu déroutant de l’utiliser la première fois mais cela donne un contrôle total de la variable lors du passage du thread au thread. Suivez mon exemple avec l’utilisation de BeanShell et vous voyez comme c’est facile:

Structure du projet Se référant ensuite aux sections de l’image ci-dessous:

(1.1) Ici, j’ai créé une variable personnalisée dans les variables définies par l’utilisateur (ou vous pouvez le faire avec BSF Proccessor – désactivé dans cet exemple (1.2))

(2.1) (2.4) J’ai utilisé avec succès une variable dans le premier thread – rien de spécial 🙂

(2.2) Ajouté BeanShell PostProcessor et personnalisé ma variable

(2.3) l’a ajouté à la queue

(3.1) Dans le second thread – la variable est extraite de la queue – avec n’importe quel nom que vous voulez. Mais soyez prudent, utilisez judicieusement Timeout, car ce thread attendra jusqu’à la fin précédente pour pouvoir modifier la variable (expérimenter avec une réponse longue)

(3.2) (3.3) (3,4) Répéter les étapes d’utilisation et de modification de la variable

(3.5) La variable est envoyée à nouveau dans la nouvelle queue – donnez-lui un nouveau nom

(4.1) (4.2) (4.3) La variable modifiée saisie de la nouvelle queue fonctionne comme du charme

Attention

  1. Si vous ajoutez plus de threads, ajoutez un Counter to Thread Group avec une variable et ajoutez ce nom de variable au nom de la queue – faites la même chose dans Thread Group où vous essayez d’attraper une queue. besoin d’une explication plus claire)

  2. Si vous avez plus d’une requête http dans un groupe de threads, ajoutez le pré-processeur de la communication par thread en tant qu’enfant de la requête HTTP précédente (ou autre si vous voulez obtenir quelque chose de personnalisé).

Jouez, modifiez, personnalisez pour obtenir le meilleur résultat 🙂 L’ajout de plus de threads peut entraîner un comportement indésirable, vous devez donc être vigilant.

Informations sur la structure du projet

JMeter Plugins a la communication inter-thread à cette fin.

Il y a 2 méthodes pour l’utiliser:

  • PostProcessor / PreProcessor
  • Fonctions __fifoPut et __fifoPop

À mon avis, PostProcessor / PreProcessor est plus facile à utiliser.

J’ai trouvé ce qui, à mon avis, est le moyen le plus simple pour y parvenir.

Utilisation

 Bean Shell PostProcessor 

définir la variable ( http://jmeter.apache.org/usermanual/best-practices.html#bsh_variables )

 import org.apache.jmeter.util.JMeterUtils; JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", "value"); 

OU si vous lisez une variable

 import org.apache.jmeter.util.JMeterUtils; JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", vars.get("Extracted_PC_CREATED_PROMO_CODE")); 

Et puis à partir de l’autre groupe de threads, lisez-le via ( http://jmeter.apache.org/usermanual/functions.html#__property )

 ${__property(PC_CREATED_PROMO_CODE)} 

Ce n’est pas possible dans JMeter, car ce n’est pas le comportement normal du client (partage des parameters entre les threads). Au lieu de cela, utilisez un groupe de threads avec des contrôleurs:

 Thread Group + Create inventory + + XPath + Loop + + Purchase inventory 

Eh bien c’est une façon de le faire; suivez ces étapes et cela fonctionnera, plus tard vous pourrez l’ajuster à vos besoins! Les variables ne sont pas partagées entre les threads (JMeter appelle cela une fonctionnalité probablement :)). Mais les propriétés sont! Alors, définissez votre variable comme une propriété comme ceci:

1) Cliquez sur votre plan de test et activez «Exécuter les groupes de threads consécutivement» – cela rend les groupes de threads exécutés de manière ordonnée et non aléatoire. (vous pouvez plus tard l’ajuster, mais pour le moment pour le faire fonctionner)

2) créer un groupe de fils appelé «setup» par exemple; dans ce groupe de threads, ajoutez un échantillonneur BeanShell avec le code suivant:

 import org.apache.jmeter.util.JMeterUtils; JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery"); 

Alors maintenant, la propriété a été définie! Si la valeur que vous souhaitez stocker en tant que propriété est une variable allready (variable définie par l’utilisateur ou variable reqex par exemple), vous pouvez le faire:

 JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable")); 

3) append un groupe de test “test réel” par exemple avec un nombre de threads supérieur à 1; ajoutez un test et à ce test ajoutez un préprocesseur BeanShell avec le code suivant:

 import org.apache.jmeter.util.JMeterUtils; vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty")); 

Donc, maintenant, vous avez créé une variable dans ce thread appelé NameOfYourNewProperty qui a la valeur de votre propriété système theNameOfYourNewProperty. Dans votre test, vous pouvez maintenant y accéder comme:

 ${theNameOfYourNewProperty} 

Et cela fonctionnera pour chaque thread, pas seulement le premier thread.

Donnons une seconde vie à un sujet 🙂 Un autre moyen de transférer des variables entre les threads consiste à écrire / lire dans un fichier. Passer des variables entre les threads

Une autre solution consiste à utiliser le serveur de table simple pour gérer le jeu de données. Cette fonctionnalité a été ajouté les plugins 1.2 JMeter.

“L’idée principale est d’utiliser un petit serveur http dans JMeter Plugins pour gérer les fichiers de jeux de données avec des commandes simples pour obtenir / append des lignes de données dans des fichiers”

Regardez la documentation: http://jmeter-plugins.org/wiki/HttpSimpleTableServer/

Cordialement.

JMeter Bean Shell Assertion

Ajoutez simplement une assertion de shell bean utilisez une fonction de propriété pour atsortingbuer la valeur à une variable (comme une variable globale) qui contiendra la valeur même après son passage à un autre thread.

groupe de threads >> Ajouter >> Assertions >> Assertion Bean Shell

 ${__setProperty(Global_variable_Name,${Variable_name_whose_Value_to_be_Passed})} 

et puis dans l’autre thread, vous pouvez appeler cette variable globale et peut l’utiliser

ci-dessous est la fonction que vous devez utiliser pour appeler la valeur stockée:

 ${__property(global_variable_name)} 

https://medium.com/@priyank.it/jmeter-passing-variables-between-threads-a4dc09903b59