webentwicklung-frage-antwort-db.com.de

Wie kann ich in JMeter eine Variable von einer Thread-Gruppe zu einer anderen übergeben?

Ich habe einen JMeter-Test mit 2 Thread-Gruppen - der erste ist ein einzelner Thread (der etwas Inventar erstellt) und der zweite hat mehrere Threads (die das gesamte Inventar kaufen). Ich verwende BeanShell-Assertions und XPath-Extraktoren, um den zurückgegebenen Wert (XML) zu analysieren und Variablen zu speichern (z. B. die IDs der zu kaufenden Elemente). 

Werte, die in der ersten Thread-Gruppe erstellt werden, unabhängig davon, ob sie in Standardvariablen des Typs ${jmeter} oder ${__BeanShell(vars.get("jmeter"))}-Typ extrahiert wurden, sind in der zweiten Thread-Gruppe nicht verfügbar. Gibt es überhaupt eine Variable in der ersten Thread-Gruppe zu erstellen und für die zweite sichtbar zu machen?

45
Todd R

Ich konnte dies nicht mit Variablen machen (da diese lokal für einzelne Threads sind). Ich konnte dieses Problem jedoch mit Eigenschaften lösen!

Meine erste ThreadGroup führt alle Einstellungen durch, und ich benötige einige Informationen aus dieser Arbeit, um für jeden Thread in der zweiten ThreadGroup verfügbar zu sein. Ich habe eine BeanShell-Assertion in der ersten ThreadGroup mit den folgenden:

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

Das $ {storeid} wurde mit einem XPath-Extraktor extrahiert. Die BeanShell-Assertion führt andere Dinge aus, z. B. die Überprüfung, dass storeid vom vorherigen Anruf zurückgegeben wurde usw.

Wie auch immer, in der zweiten ThreadGroup kann ich den Wert der "storeid" -Eigenschaft in Samplers mit folgendem verwenden:

${__property(storeid)}

Klappt wunderbar!

64
Todd R

Laut JMeter-Dokumentation: 

16.12 Gemeinsame Verwendung von Variablen zwischen Threads und Threadgruppen 

Variablen sind lokal für einen Thread. Eine in einem Thread festgelegte Variable kann nicht in .__ gelesen werden. Ein weiterer. Dies ist beabsichtigt. Für Variablen, die bestimmt werden können Bevor ein Test gestartet wird, siehe Parametrieren von Tests (oben). Wenn der Wert ist nicht bekannt, bis der Test startet, es gibt verschiedene Möglichkeiten:

  1. Speichern Sie die Variable als Eigenschaft - Eigenschaften sind global für JMeter-Instanz
  2. Schreiben Sie Variablen in eine Datei und lesen Sie sie erneut.
  3. Verwenden Sie den Namespace bsh.shared - siehe (16.8.2. Gemeinsame Nutzung von Variablen
  4. Schreiben Sie Ihre eigenen Java-Klassen

Eine andere Möglichkeit, Variablen zwischen den Threads zu übergeben, ist die Verwendung von jmeter-plugins als unten von Andrey Botalov erwähnt .

Ich fand es jedoch etwas verwirrend, es beim ersten Mal zu verwenden, aber es gibt die vollständige Kontrolle der Variablen beim Übergang von Thread zu Thread. __ Folgen Sie meinem Beispiel mit BeanShell und Sie sehen, wie einfach es ist:

Project stucture Als nächstes verweisen wir auf Abschnitte im Bild unten:

(1.1) Hier habe ich eine benutzerdefinierte Variable in Benutzerdefinierten Variablen erstellt (oder Sie können dies mit BSF Proccessor tun - in diesem Beispiel deaktiviert (1.2))

(2.1) (2.4) Ich habe erfolgreich Variable im ersten Thread verwendet - nichts Besonderes :)

(2.2) BeanShell PostProcessor hinzugefügt und meine Variable angepasst

(2.3) Der Warteschlange hinzugefügt

(3.1) Im zweiten Thread - Variable wird aus der Warteschlange genommen - mit einem beliebigen Namen. Aber seien Sie vorsichtig, verwenden Sie weise das Zeitlimit, da dieser Thread bis zum vorherigen Ende warten wird, um eine modifizierte Variable zu erhalten (experimentieren Sie mit einer langen Antwort).

(3.2) (3.3) (3,4) Wiederholte Schritte der Verwendung und Änderung von Variablen 

(3.5) Die Variable wird erneut in der neuen Warteschlange gesendet. Geben Sie ihr also einen neuen Namen

(4.1) (4.2) (4.3) Die modifizierte Variable aus der neuen Warteschlange wurde übernommen und wirkt wie ein Zauber

Warnung

  1. Wenn Sie weitere Threads hinzufügen, fügen Sie der Variablengruppe einen Zähler mit Variable hinzu und fügen Sie diesen Variablennamen zum Warteschlangennamen hinzu - tun Sie dies auch in der Threadgruppe, in der Sie versuchen, die Warteschlange abzufangen, so dass die Warteschlange für jeden Thread einen eindeutigen Namen hat brauche eine klarere Erklärung)

  2. Wenn Sie mehr als eine http-Anfrage in einer Thread-Gruppe haben, fügen Sie den Thread-Kommunikationsvorprozessor als untergeordnetes Element der letzten (oder anderen, wenn Sie eine benutzerdefinierte Sache ausführen möchten) http-Request hinzu

Spielen, ändern, anpassen, um das beste Ergebnis zu erzielen :) Das Hinzufügen weiterer Threads kann zu unerwünschtem Verhalten führen, sodass Sie wachsam sein müssen. 

Information about project structure

13
pbaranski

Ich habe festgestellt, dass dies der einfachste Weg ist, dies zu erreichen.

Benutzen 

Bean Shell PostProcessor

um die Variable einzustellen ( http://jmeter.Apache.org/usermanual/best-practices.html#bsh_variables )

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

ODER wenn Sie aus einer Variablen lesen

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

Und dann von der anderen Thread-Gruppe lesen Sie es über ( http://jmeter.Apache.org/usermanual/functions.html#__property )

${__property(PC_CREATED_PROMO_CODE)}
9
joviano dias

JMeter Plugins bietet Inter-Thread-Kommunikation für diesen Zweck.

Es gibt zwei Methoden, um es zu benutzen:

  • Postprozessor/Vorprozessor
  • Funktionen __fifoPut und __fifoPop

Meiner Meinung nach ist PostProcessor/PreProcessor einfacher zu bedienen.

8
Andrei Botalov

Dies ist in JMeter nicht möglich, da es sich nicht um normales Clientverhalten handelt (gemeinsame Verwendung von Parametern zwischen Threads). Verwenden Sie stattdessen eine Thread-Gruppe mit Controllern:

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

Nun, das ist eine Möglichkeit, dies zu tun. Folgen Sie diesen Schritten und es wird funktionieren, später können Sie es an Ihre Bedürfnisse anpassen! Variablen werden nicht von Threads gemeinsam genutzt (JMeter nennt dies wahrscheinlich eine Funktion :)). Aber Eigenschaften sind! Stellen Sie also Ihre Variable wie folgt ein:

1) Klicken Sie auf Ihren Testplan und aktivieren Sie "Threadgruppen nacheinander ausführen" -> Dadurch werden die Threadgruppen nach dem Zufallsprinzip geordnet. (Sie können es später anpassen, aber erst jetzt, damit es funktioniert.)

2) Erstellen Sie zum Beispiel eine Threadgruppe namens 'setup'; Fügen Sie in dieser Thread-Gruppe einen BeanShell-Sampler mit dem folgenden Code hinzu:

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

Nun ist die Immobilie eingestellt! Wenn der Wert, den Sie als Eigenschaft speichern möchten, eine Variable ist, die bereits vorhanden ist (vom Benutzer definierte oder reqex-Variable), können Sie Folgendes tun:

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

3) Fügen Sie eine Testgruppe 'actual test' hinzu, zum Beispiel mit einer höheren Anzahl von Threads als 1; Fügen Sie einen Test hinzu und fügen Sie diesem Test einen BeanShell-Präprozessor mit dem folgenden Code hinzu:

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

Jetzt haben Sie in diesem Thread eine Variable namens nameOfYourNewProperty erstellt, die den Wert Ihrer Systemeigenschaft theNameOfYourNewProperty hat. In Ihrem Test können Sie jetzt darauf zugreifen: 

${theNameOfYourNewProperty}

Und es wird für jeden Thread funktionieren, nicht nur nur den ersten Thread.

4
Fico

Geben Sie einem Thema ein zweites Leben :) Eine weitere Möglichkeit, Variablen zwischen Threads zu übertragen, ist das Schreiben/Lesen in eine Datei. Variablen zwischen Threads übergeben

1
olyv

Eine andere Lösung ist die Verwendung des Simple Table Server zum Verwalten der Datenmenge. Diese Funktion wurde durch Hinzufügen der JMeter-Plugins 1.2 erweitert.

"Die Hauptidee ist die Verwendung eines winzigen http-Servers in JMeter Plugins, um die Dataset-Dateien mit einfachen Befehlen für get/add Datenzeilen in Dateien zu verwalten.

Sehen Sie sich die Dokumentation an: http://jmeter-plugins.org/wiki/HttpSimpleTableServer/

Grüße.

1
Vincent Daburon

JMeter Bean Shell Assertion

Fügen Sie einfach eine Bean-Shell-Assertion hinzu. Verwenden Sie eine Eigenschaftsfunktion, um den Wert einer Variablen zuzuweisen (wie einer globalen Variablen), die den Wert auch dann enthält, wenn er an einen anderen Thread übergeben wird.

thread-Gruppe >> Hinzufügen >> Assertions >> Bean Shell Assertion

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

und dann im anderen Thread können Sie diese globale Variable aufrufen und verwenden

nachfolgend finden Sie die Funktion, die Sie zum Abrufen des gespeicherten Werts verwenden müssen:

${__property(global_variable_name)}

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

0