web-dev-qa-db-fra.com

Comment passer d'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 seul thread (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 analyser la valeur renvoyée (XML) et stocker des variables (telles que les identifiants des éléments à acheter). 

Toutefois, les valeurs créées dans le premier groupe de threads, qu'elles soient extraites dans des variables de type ${jmeter} standard ou des vars de type ${__BeanShell(vars.get("jmeter"))}, ne sont pas disponibles dans le deuxième groupe de threads. Est-il possible de créer une variable dans le premier groupe de threads et de le rendre visible pour le second?

45
Todd R

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

Encore une fois, mon premier ThreadGroup se charge de toute la configuration et j'ai besoin que certaines informations de ce travail soient disponibles pour chaque thread du second 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 extracteur XPath. L'assertion BeanShell effectue d'autres tâches, comme par exemple vérifier que l'ID de magasin a été renvoyé lors de l'appel précédent, etc.

Quoi qu'il en soit, dans le second ThreadGroup, je peux utiliser la valeur de la propriété "storeid" dans Samplers avec les éléments suivants:

${__property(storeid)}

Fonctionne comme un charme!

64
Todd R

Selon la documentation de JMeter: 

16.12 Partager des variables entre threads et groupes de threads 

Les variables sont locales à un thread dans lequel une variable définie dans un thread ne peut pas être lue un autre. C'est par conception. Pour les variables pouvant être déterminées avant le début 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 s'offrent à vous:

  1. Stocke la variable en tant que propriété - les propriétés sont globales pour le Instance JMeter
  2. Ecrivez des variables dans un fichier et relisez-les.
  3. Utilisez l'espace de noms bsh.shared - voir 16.8.2 Variables de partage
  4. Écrivez vos propres classes Java

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

Mais j’ai trouvé qu’il était un peu déroutant de l’utiliser pour la première fois, mais cela donne un contrôle total sur les variables lors du passage de thread à thread . Suivez mon exemple avec l’utilisation de BeanShell et vous verrez comme il est facile

Project stucture Suivant en se référant aux sections dans l'image ci-dessous:

(1.1) Ici, j'ai créé une variable personnalisée dans des 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 variable dans le premier thread - rien de spécial :)

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

(2.3) ajouté à la file d'attente

(3.1) Dans le deuxième thread - la variable est extraite de la file d'attente - avec le nom de votre choix. Mais soyez prudent, utilisez sagement Timeout, car ce fil attendra jusqu'à la fin précédente pour pouvoir être modifié (expérience avec une réponse longue)

(3.2) (3.3) (3,4) Que les étapes répétées d’utilisation et de modification de variable 

(3.5) La variable est à nouveau envoyée dans la nouvelle file d'attente. Vous devez donc lui attribuer un nouveau nom.

(4.1) (4.2) (4.3) La variable modifiée saisie de la nouvelle file d'attente fonctionne à merveille

Attention

  1. Si vous ajoutez plus de threads, ajoutez ensuite un compteur à groupe de threads avec variable et ajoutez ce nom de variable au nom de la file d'attente. Procédez de la même manière dans le groupe de threads dans lequel vous essayez de capturer la file d'attente. besoin d'explications plus claires)

  2. Si vous avez plus d'une requête http dans un groupe de threads, ajoutez un préprocesseur de communication de thread en tant qu'enfant du dernier (ou autre si vous souhaitez obtenir quelque chose de personnalisé) http Request

Jouez, modifiez, personnalisez pour obtenir le meilleur résultat :) L'ajout de discussions peut entraîner un comportement indésirable et vous devez donc être vigilant. 

Information about project structure

13
pbaranski

J'ai trouvé ce qui, à mon avis, est le moyen le plus simple d'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"));

Ensuite, dans l’autre groupe de discussions, lisez-le via ( http://jmeter.Apache.org/usermanual/functions.html#__property )

${__property(PC_CREATED_PROMO_CODE)}
9
joviano dias

JMeter Plugins a Inter-Thread Communication à cet effet.

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

  • Postprocesseur/préprocesseur
  • Fonctions __fifoPut et __fifoPop

À mon avis, le postprocesseur/préprocesseur est plus facile à utiliser.

8
Andrei Botalov

Ce n'est pas possible dans JMeter, car ce n'est pas un comportement client normal (partage de paramètres entre Threads) Au lieu de cela, utilisez un groupe de discussions avec des contrôleurs:

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

Eh bien c'est une façon de le faire; suivez ces étapes et cela fonctionnera, vous pourrez l’adapter ultérieurement à vos besoins! Les variables ne sont pas partagées entre les threads (JMeter appelle probablement cette fonctionnalité :)). Mais les propriétés sont! Donc 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 permet aux groupes de threads de s'exécuter de manière ordonnée et non aléatoire. (Vous pourrez l’ajuster plus tard, mais pour le moment, faites-le fonctionner ..)

2) créez un groupe de discussion 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 déjà (variable définie par l'utilisateur ou variable reqex par exemple), vous pouvez effectuer les opérations suivantes:

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

3) ajoutez un groupe de tests '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"));

Alors maintenant, vous avez créé une variable dans ce fil, nommée theNameOfYourNewProperty, qui a la valeur de votre propriété système theNameOfYourNewProperty. Dans votre test, vous pouvez maintenant y accéder comme ceci: 

${theNameOfYourNewProperty}

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

4
Fico

Laissons 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

1
olyv

Une autre solution consiste à utiliser Simple Table Server pour gérer le jeu de données . Cette fonctionnalité a été ajoutée aux 1.2 plug-ins JMeter.

"L'idée principale est d'utiliser un petit serveur http dans les plugins JMeter pour gérer les fichiers de données avec de simples commandes pour obtenir/ajouter lignes de données dans des fichiers"

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

Cordialement.

1
Vincent Daburon

JMeter Bean Shell Assertion

Ajoutez simplement une assertion de bean. Utilisez une fonction property pour attribuer la valeur à une variable (comme une variable globale) qui conservera la valeur même après son passage à un autre thread.

groupe de fil >> Ajouter >> Assertions >> Assertion de shell de haricot

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

puis dans l'autre fil, vous pouvez appeler cette variable globale et l'utiliser

vous trouverez ci-dessous la fonction à utiliser pour appeler la valeur stockée:

${__property(global_variable_name)}

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

0