Hallo, Habr! Dies ist die Fortsetzung meines , in der ich ĂŒber die Möglichkeiten der Nachrichtenplatzierung in Warteschlangen mit JMeter berichten werde.
Wir erstellen eine Datenpipeline fĂŒr ein groĂes nationales Unternehmen. Verschiedene Anfrageformate, Transformationen, komplexe RoutenfĂŒhrungen. FĂŒr Tests mĂŒssen viele Nachrichten in die Warteschlangen gesendet werden. Manuell â ein Schmerz, mit dem nicht jeder Tester umgehen kann.

EinfĂŒhrung
Obwohl wir uns in den Anfangszeiten mit diesem Schmerz arrangieren mussten. Alles begann mit RFHUtil. Leistungsstark, aber unbequem und gruselig: Ihr wisst schon, wie es zu Russisch ist.

Unverzichtbar in bestimmten FĂ€llen, aber stabil abstĂŒrzend bei aktiver Nutzung.
Bequemes Testen ist damit unmöglich.
Mit JMeter wurde alles einfacher. Nach der ersten Phase des Lernens und Eingewöhnens dĂ€mmerte die Hoffnung auf glĂŒckliches Testen.
Ich nutze aktiv die JMS Publisher- und JMS Subscriber-Sampler. Im Gegensatz zu JMS Point-to-Point scheint dieses Duo angenehmer in der Anwendung zu sein. Zum Beispiel kann man beim Subscriber im JMS Selector eine Variable angeben, beim Point-to-Point - nicht (oder dieser Weg ist nicht besonders offensichtlich).
Vorbereitung der Sampler
JMS Publisher
- Setup - Jede Probe. Apache verwenden Sie diese Option, wenn Warteschlangen/Themen ĂŒber Variablen festgelegt sind.
- Ablauf (ms) = 120000. Im Falle eines Fehlers verschwinden die Testanfragen nach 2 Minuten aus der Warteschlange.
- Nicht-bestĂ€ndige Lieferart verwenden? - wahr. IBM , dass der bestĂ€ndige Modus eine zuverlĂ€ssige Speicherung der ĂŒbertragenden Nachrichten im Falle eines plötzlichen Ausfalls gewĂ€hrleistet. Und schnelleren Austausch im nicht-bestĂ€ndigen Modus. FĂŒr Testzwecke ist die Geschwindigkeit wichtiger.
In jedem Publisher lege ich eine JMS-Eigenschaft fest, die der Subscriber im JMS Selector verwenden wird. FĂŒr jede Sendung wird ein zufĂ€lliger Wert im Element des Testplans Benutzerparameter generiert:

So kann man sicher sein, dass die richtige Nachricht gelesen wird.
Die endgĂŒltige "Dummie" des vorkonfigurierten JMS Publishers:

JMS Subscriber
- Setup - Jede Probe. Ihr habt es verstanden.
- Timeout (ms) = 100000. Wenn die Anfrage nach 100 Sekunden Wartezeit nicht in der Warteschlange ankommt, ist etwas schief gelaufen.
- Zwischen den Proben stoppen? - wahr.
JMS Selector - eine recht praktische . Der endgĂŒltige JMS Subscriber:

Wie man mit der Kyrillik in ĂŒbertragenden Nachrichten umgeht. In JMeter wird sie standardmĂ€Ăig nach dem Auslesen schief angezeigt. Um dies zu vermeiden und die groĂe und mĂ€chtige Sprache jederzeit und ĂŒberall zu genieĂen, muss man:
- Einen JVM-Parameter zum "Launcher" JMeter hinzufĂŒgen:
-Dfile.encoding=UTF-8 - Einen JSR223 PostProcessor im Subscriber mit der Zeile in Groovy hinzufĂŒgen:
prev.setDataEncoding("UTF-8")
TextĂŒbertragung
Die faulste Option. Geeignet fĂŒr das Debuggen frisch geschriebener Tests. Oder in FĂ€llen, in denen man wenigstens etwas Kleines senden muss. Option auswĂ€hlen Nachrichtenquelle â Textbereich und den Nachrichtentext im Textblock platzieren:

DateiĂŒbertragung
Die hĂ€ufigste Option. Geeignet fĂŒr die meisten Szenarien. Option auswĂ€hlen Nachrichtenquelle â Von Datei und den Pfad zur Nachricht im Feld angeben Datei â Dateiname:

DateiĂŒbertragung im Textfeld
Die universellste Option. Geeignet fĂŒr die meisten Szenarien + kann in JMS Point-to-Point verwendet werden, bei dem es keine zweite Versandoption gibt:

Ăbertragung von Bytearrays
Die komplexeste Option. Geeignet fĂŒr die prĂ€zise ĂberprĂŒfung der AnfrageĂŒbertragung bis zum Byte, ohne Verzerrungen, SMS oder Störungen. Dies ist nicht mit dem Standard-JMeter möglich, wurde mir deutlich gesagt.
Deshalb musste ich herunterladen und modifizieren JMS Subscriber.
Ich habe in der Methode extractContent(..) die Zeile ersetzt:
buffer.append(bytesMessage.getBodyLength() + " Bytes erhalten in BytesMessage");auf:
byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
bytesMessage.readBytes(bytes);
try {
buffer.append(new String(bytes, "UTF-8"));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}und JMeter neu kompiliert.
Es bleibt, ein paar JSR223 Sampler hinzuzufĂŒgen. Der erste â vor dem Paar Publisher/Subscriber zur Erstellung einer DAT-Datei, die zufĂ€llige Bytes enthĂ€lt:
import org.apache.commons.lang3.RandomUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
vars.put("PATH_TO_BYTES", "C:temprandomBytes.dat");
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
byte[] arr = RandomUtils.nextBytes((int)(Math.random()*10000));
try {
FileOutputStream fos = new FileOutputStream(RESULT_FILE);
fos.write(arr);
fos.close();
} catch (IOException e) {
System.out.println("Datei nicht gefunden");
}Der zweite â am Ende des Szenarios, löscht die Datei:
import java.io.File;
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
RESULT_FILE.delete();Und nicht vergessen, den Datei-Pfad beim Publisher hinzuzufĂŒgen:

Und auch die ĂberprĂŒfung in der JSR223 Assertion fĂŒr Subscriber â um die ursprĂŒnglichen Bytes mit denen zu vergleichen, die in der Warteschlange des EmpfĂ€ngers ankommen:
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
Path path = Paths.get(vars.get("PATH_TO_BYTES"), new String[0]);
byte[] originalArray = Files.readAllBytes(path);
byte[] changedArray = ctx.getPreviousResult().getResponseData();
System.out.println(changedArray.length);
if (Arrays.equals(originalArray, changedArray))
{
SampleResult.setResponseMessage("OK");
} else {
SampleResult.setSuccessful(false);
SampleResult.setResponseMessage("Vergleich fehlgeschlagen");
SampleResult.setResponseData("Bytes haben sich geÀndert","UTF-8");
IsSuccess=false;
}Fazit
Ich habe vier Methoden zur Ăbermittlung von Nachrichten in Warteschlangen beschrieben, die ich tĂ€glich in der Praxis anwende. Ich hoffe, diese Informationen erleichtern Ihnen das Leben. Ich plane, in der Fortsetzung ĂŒber meine Erfahrungen beim Testen des Austauschs zu berichten, bei dem auf der einen Seite die Warteschlange und auf der anderen Seite die Datenbank oder das Dateisystem steht.
SchĂŒtzen Sie Ihre Zeit. Vielen Dank fĂŒr Ihre Aufmerksamkeit.

Quelle: habr.com
