Cozi și JMeter: schimbul între Publisher și Subscriber

Salut, Habr! Acesta este sequelul meu anterioare, î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.

Cozi și JMeter: schimbul între Publisher și Subscriber

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.

Cozi și JMeter: schimbul între Publisher și Subscriber

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 recomandă 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 susține, 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:

Cozi și JMeter: schimbul între Publisher și Subscriber

Astfel, mă pot asigura că a fost citit mesajul corect.

Modelul final al JMS Publisher-ului preconfigurat:

Cozi și JMeter: schimbul între Publisher și Subscriber

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ă . Modelul final de JMS Subscriber: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ă:

Cozi și JMeter: schimbul între Publisher și Subscriber

Adăugați în „launcher”-ul JMeter argumentul JVM:

  1. -Dfile.encoding=UTF-8
    Adăugați JSR223 PostProcessor în Subscriber cu linia în groovy:
  2. 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:

Cozi și JMeter: schimbul între Publisher și Subscriber

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:

Cozi și JMeter: schimbul între Publisher și Subscriber

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:

Cozi și JMeter: schimbul între Publisher și Subscriber

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, aici mi s-a spus cu adevărat despre asta.

Așa că a trebuit să descarc sursa și să modific cod 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:

Cozi și JMeter: schimbul între Publisher și Subscriber

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.

Cozi și JMeter: schimbul între Publisher și Subscriber

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster