Hej, Habr! Detta Àr en sequel till min , dÀr jag kommer att berÀtta om olika alternativ för att publicera meddelanden i köer med hjÀlp av JMeter.
Vi skapar en databas för ett stort federalt företag. Olika begÀran format, transformationer, komplicerad routing. För testning behöver vi skicka mÄnga meddelanden till köer. Att göra det manuellt Àr en plÄga, vilket inte alla manualhanterare klarar av.

Introduktion
Ăven om man fick uthĂ€rda denna smĂ€rta i början. Allt började med RFHUtil. Kraftfull, men obekvĂ€m och skrĂ€mmande: Ni vet ju vem Đ ŃŃа.

OersÀttlig i vissa fall, men kraschar konsekvent vid aktiv anvÀndning.
BekvÀm testning med den Àr omöjlig.
Med JMeter blev allt enklare. Efter första steget med att lÀra sig och vÀnja sig, tÀndes hoppet för lyckad testning.
Jag anvÀnder aktivt JMS Publisher och JMS Subscriber. Till skillnad frÄn JMS Point-to-Point, verkar denna duo vara mer bekvÀm i arbetet. Till exempel, hos Subscriber i JMS Selector kan man ange en variabel, hos Point-to-Point gÄr det inte (eller sÄ Àr denna metod inte sÄ uppenbar).
Förberedelse av samplers
JMS Publisher
- Setup â Varje exempel. Apache anvĂ€nda detta alternativ om köerna/topicarna sĂ€tts via variabler.
- Expiration (ms) = 120000. Vid ett misslyckande kommer de testbegÀrningar som skickats att försvinna frÄn kön efter 2 minuter.
- AnvĂ€nd icke-bestĂ€ndig leveranslĂ€ge? â sant. IBM , att bestĂ€ndigt lĂ€ge sĂ€kerstĂ€ller tillförlitlig lagring av överförda meddelanden vid plötsligt fel. Och snabbare utbyte i icke-bestĂ€ndigt lĂ€ge. För testĂ€ndamĂ„l Ă€r hastighet viktigare.
I varje Publisher stÀller jag in jms-egenskapen som Subscriber kommer att anvÀnda i JMS Selector. För varje sÀndning genereras ett slumpmÀssigt vÀrde i testplanens User Parameters:

SÄ kan man vara sÀker pÄ att rÀtt meddelande lÀsts.
Den slutliga "dummy" av den förinstÀllda JMS Publisher:

JMS Subscriber
- Setup â Varje exempel. Ni förstĂ„r.
- Timeout (ms) = 100000. Om begÀran inte anlÀnder till kön efter 100 sekunders vÀntan, betyder det att nÄgot gÄtt fel.
- Stopp mellan exempel? â sant.
JMS Selector â ganska praktisk . Den slutliga JMS Subscriber:

Hur hantera kyrilliska tecken i skickade meddelanden. I JMeter visas de som standard snett nÀr de lÀses. För att undvika detta och njuta av den stora och mÀktiga alltid och överallt, mÄste man:
- LĂ€gga till ett JVM-argument i "startaren" JMeter:
-Dfile.encoding=UTF-8 - LĂ€gg till JSR223 PostProcessor i Subscriber med raden i groovy:
prev.setDataEncoding("UTF-8")
Ăverföring av text
Det mest latenta alternativet. Passar för att göra fel sökningar av nyss skrev tester. Antingen för situationer dĂ€r man behöver skicka nĂ„got litet. VĂ€lj alternativ Meddelande kĂ€lla â Textarea och placera meddelandets kropp i textblocket:

Filöverföring
Det vanligaste alternativet. Passar för de flesta scenarier. VĂ€lj alternativ Meddelande kĂ€lla â FrĂ„n fil och ange sökvĂ€gen till meddelandet i fĂ€ltet Fil â Filnamn:

Filöverföring i textfÀltet
Det mest universella alternativet. Passar för de flesta scenarier + kan anvÀndas i JMS Point-to-Point, dÀr det inte finns nÄgot andra överföringsalternativ:

Ăverföring av byte-array
Det mest komplexa alternativet. Passar för att kontrollera felfri överföring av förfrÄgningar till byte, utan förvrÀngning, sms och störningar. Detta kan inte göras i standard JMeter, det blev uttalat för mig.
DÀrför var jag tvungen att ladda ner och modifiera JMS Subscriber.
Jag ersatte i metoden extractContent(..) raden:
buffer.append(bytesMessage.getBodyLength() + " bytes received in BytesMessage");till:
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);
}och byggde om JMeter.
Bara att lĂ€gga till ett par JSR223 Sampler. Första â före paret Publisher/Subscriber för att skapa DAT-fil som innehĂ„ller slumpmĂ€ssiga byte:
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("file not found");
}Den andra â i slutet av scenariot, tar bort filen:
import java.io.File;
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
RESULT_FILE.delete();Och glöm inte att lÀgga till sökvÀgen till filen vid Publisher:

Samt kontroll i JSR223 Assertion för Subscriber â jĂ€mför de ursprungliga bytena med dem som kommer till mottagarens kö:
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("JÀmförelsen misslyckades");
SampleResult.setResponseData("Byten har Àndrats","UTF-8");
IsSuccess=false;
}Slutsats
Jag har beskrivit fyra sÀtt att skicka meddelanden i köer som jag anvÀnder i praktiken varje dag. Jag hoppas att denna information gör ditt liv enklare. Framöver planerar jag att berÀtta om mina erfarenheter av att testa utbyten, dÀr det i ena Ànden Àr en kö och i den andra en databas eller filsystem.
Spara din tid. Och tack för din uppmÀrksamhet.

KĂ€lla: habr.com
