Salut, Habr! Acesta este sequelul meu , în care voi vorbi despre opțiunile de plasare a mesajelor în cozi cu ajutorul JMeter.
Construim un bus de date pentru o mare companie federală. Diferite formate de cereri, transformări, rutare complicată. Pentru testare, trebuie să trimitem multe mesaje în cozi. Manual — este o durere de care nu se ocupă oricine.

Introducere
Deși la început am fost nevoit să suport această durere. Totul a început cu RFHUtil. Puternic, dar incomod și înfricoșător: Știți bine despre Rus.

Indispensabil în unele cazuri, dar se prăbușește constant în cazul utilizării active.
Testarea confortabilă cu el este imposibilă.
Cu JMeter, totul a devenit mai simplu. După prima etapă de învățare și acomodare, a apărut speranța unei testări fericite.
Folosesc activ sampler-ele JMS Publisher și JMS Subscriber. Spre deosebire de JMS Point-to-Point, această pereche mi s-a părut mai convenabilă de utilizat. De exemplu, la Subscriber, în JMS Selector, pot specifica o variabilă, la Point-to-Point — nu (sau acest mod nu este prea evident).
Pregătirea samplerelor
JMS Publisher
- Setup — Each Sample. Apache folosiți această opțiune dacă cozile/topicele sunt definite prin variabile.
- Expiration (ms) = 120000. În caz de eroare, cererile de test dispar din coadă după 2 minute.
- Utilizați modul de livrare non-persistent? — true. IBM , că modul persistent asigură păstrarea fiabilă a mesajelor transmise în caz de defecțiuni bruște. Și un schimb mai rapid în modul non-persistent. Pentru scopuri de testare, viteza este mai importantă.
În fiecare Publisher setez proprietatea jms, pe care Subscriber-ul o va folosi în JMS Selector. La fiecare trimitere se generează o valoare aleatoare în elementul planului de testare User Parameters:

Astfel, mă pot asigura că a fost citit mesajul corect.
Modelul final al JMS Publisher-ului preconfigurat:

JMS Subscriber
- Setup — Each Sample. Ați înțeles.
- Timeout (ms) = 100000. Dacă cererea nu ajunge în coadă după 100 de secunde de așteptare, înseamnă că ceva a mers prost.
- Stop between sample? — true.
JMS Selector — o unealtă destul de convenabilă Cum să gestionăm caracterele chirilice în mesajele transmise. În JMeter, în mod implicit, după citire se afișează strâmb. Pentru a evita acest lucru și pentru a ne bucura de marele și puternicul mereu și pretutindeni, trebuie să:

Adăugați în „launcher”-ul JMeter argumentul JVM:
- -Dfile.encoding=UTF-8
Adăugați JSR223 PostProcessor în Subscriber cu linia în groovy: - prev.setDataEncoding("UTF-8")
Transmiterea textului
Передача текста
Cea mai leneșă opțiune. Potrivită pentru depanarea testelor recent scrise. Sau pentru cazurile când trebuie trimis măcar ceva mic. Alege opțiunea Sursa mesajului — Textarea și plasează corpul mesajului în blocul de text:

Transmiterea fișierului
Cea mai frecventă opțiune. Potrivită pentru majoritatea scenariilor. Alege opțiunea Sursa mesajului — Din fișier și indică calea către mesaj în câmp Fișier — Nume fișier:

Transmiterea fișierului în câmpul text
Cea mai versatilă opțiune. Potrivită pentru majoritatea scenariilor + poate fi folosită în JMS Point-to-Point, în care nu există a doua opțiune de trimitere:

Transmiterea unui array de bytes
Cea mai complexă opțiune. Potrivită pentru verificarea unei transmisii perfect exacte a cererilor până la byte, fără distorsiuni, SMS și perturbări. Aici nu se poate face folosind JMeter-ul standard, mi s-a spus cu adevărat despre asta.
Așa că a trebuit să descarc și să modific JMS Subscriber.
Am înlocuit în metoda extractContent(..) linia:
buffer.append(bytesMessage.getBodyLength() + " bytes received in BytesMessage");la:
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);
}și am recompilat JMeter.
Rămâne de adăugat câteva JSR223 Sampler. Primul — înainte de perechea Publisher/Subscriber pentru a crea un fișier DAT, care conține bytes aleatorii:
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");
}Al doilea — la sfârșitul scenariului, șterge fișierul:
import java.io.File;
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
RESULT_FILE.delete();Și să nu uit să adaug calea către fișier la Publisher:

De asemenea, să fac o verificare în JSR223 Assertion pentru Subscriber — comparând bytes originali cu cei care ajung în coada receptorului:
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("Compararea a eșuat");
SampleResult.setResponseData("Bytes au fost modificate","UTF-8");
IsSuccess=false;
}Concluzie
Am descris patru metode de trimitere a mesajelor în coadă, pe care le folosesc zilnic în practică. Sper ca aceste informații să îți facă viața mai ușoară. În continuare, intenționez să povestesc despre experiența mea de testare a schimbului, unde la un capăt se află o coadă, iar la celălalt - o bază de date sau un sistem de fișiere.
Economisiți-vă timpul. Și mulțumim pentru atenție.

Sursa: habr.com
