Bonjour, Habr ! Voici la suite de mon , où je vais parler des options de mise en file d'attente des messages avec JMeter.
Nous créons un bus de données pour une grande entreprise fédérale. Différents formats de requêtes, transformations, routage complexe. Pour les tests, il faut envoyer beaucoup de messages dans les files d'attente. À la main, c'est une douleur à laquelle peu de testeurs peuvent faire face.

Introduction
Bien qu'il ait fallu supporter cette douleur au début. Tout a commencé avec RFHUtil. Puissant, mais peu pratique et effrayant : vous savez de quoi je parle.

Indispensable dans certains cas, mais qui plante systématiquement en cas d'utilisation active.
Les tests pratiques avec lui sont impossibles.
Avec JMeter, tout est devenu plus simple. Après la première phase de familiarisation, l'espoir d'un test heureux a commencé à poindre.
J'utilise activement les échantillonneurs JMS Publisher et JMS Subscriber. Contrairement à JMS Point-to-Point, ce duo est plus pratique à utiliser. Par exemple, dans le sélectionneur JMS, le Subscriber peut utiliser une variable, alors que le Point-to-Point ne le peut pas (ou cette méthode n'est pas très évidente).
Préparation des échantillonneurs
JMS Publisher
- Configuration - Chaque Échantillon. Apache utiliser cette option si les files d'attente / sujets sont définis via des variables.
- Expiration (ms) = 120000. En cas d'échec, les requêtes de test disparaîtront de la file d'attente après 2 minutes.
- Utiliser le mode de livraison non persistant ? - vrai. IBM , ce qui signifie que le mode persistant garantit la sauvegarde fiable des messages en cas de panne soudaine. Et un échange plus rapide en mode non persistant. Pour les tests, la vitesse est plus importante.
Pour chaque Publisher, je définis une propriété JMS que le Subscriber utilisera dans le Sélecteur JMS. Pour chaque envoi, une valeur aléatoire est générée dans l'élément de plan de test Paramètres Utilisateur :

Ainsi, on peut être sûr que le bon message a été lu.
Le modèle final du JMS Publisher préconfiguré :

JMS Subscriber
- Configuration - Chaque Échantillon. Vous avez compris.
- Délai d'attente (ms) = 100000. Si la requête n'arrive pas dans la file d'attente après 100 secondes d'attente, cela signifie que quelque chose ne va pas.
- Arrêter entre les échantillons ? - vrai.
Sélecteur JMS - un instrument assez pratique Comment gérer la cyrillique dans les messages transmis. Dans JMeter, par défaut, après lecture, elle s'affiche de manière déformée. Pour éviter cela et profiter de la langue puissante et majestueuse toujours et partout, il faut :

Ajouter à la JVM de lancement JMeter l'argument :
- -Dfile.encoding=UTF-8
Ajouter un JSR223 PostProcessor dans le Subscriber avec la ligne en groovy : - prev.setDataEncoding("UTF-8")
Transmission de texte
Transmission de texte
La solution la plus paresseuse. Idéale pour le débogage de nouveaux tests. Ou dans les cas où il faut envoyer quelque chose de petit. Choisissez une option Source du message — Zone de texte et placer le corps du message dans le bloc de texte :

Transfert de fichier
La solution la plus courante. Idéale pour la plupart des scénarios. Choisissez une option Source du message — À partir d'un fichier et indiquer le chemin vers le message dans le champ Fichier — Nom du fichier :

Transfert de fichier dans le champ de texte
La solution la plus polyvalente. Idéale pour la plupart des scénarios + peut être utilisée dans JMS Point-to-Point, où il n'y a pas d'autre option d'envoi :

Transfert d'un tableau d'octets
La solution la plus complexe. Idéale pour vérifier une transmission de requêtes impeccablement précise, octet par octet, sans distorsion, SMS ou perturbation. Cela ne peut pas être réalisé dans le JMeter par défaut, on m'a clairement dit à ce sujet.
Il a donc fallu télécharger et modifier le JMS Subscriber.
J'ai remplacé dans la méthode extractContent(..) la ligne :
buffer.append(bytesMessage.getBodyLength() + " octets reçus dans BytesMessage");sur :
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);
}et j'ai reconstruit JMeter.
Reste à ajouter quelques JSR223 Samplers. Le premier — avant la paire Publisher/Subscriber pour créer un fichier DAT contenant des octets aléatoires :
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("fichier introuvable");
}Le second — à la fin du scénario, supprime le fichier :
import java.io.File;
File RESULT_FILE = new File(vars.get("PATH_TO_BYTES"));
RESULT_FILE.delete();Et n'oubliez pas d'ajouter le chemin du fichier au Publisher :

Ainsi qu'une vérification dans l'assertion JSR223 pour le Subscriber — comparer les octets d'origine avec ceux reçus dans la file d'attente de destination :
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("Échec de la comparaison");
SampleResult.setResponseData("Les octets ont changé","UTF-8");
IsSuccess=false;
}Conclusion
J'ai décrit quatre méthodes d'envoi de messages dans une file d'attente que j'utilise quotidiennement dans ma pratique. J'espère que ces informations vous faciliteront la vie. Dans la suite, je prévois de parler de mon expérience de test d'échange, où d'un côté se trouve la file d'attente, et de l'autre une base de données ou un système de fichiers.
Préservez votre temps. Merci de votre attention.

Source : habr.com
