Files d'attente et JMeter: échange avec Publisher et abonné

Bonjour, Habr!

Il s'agit d'une suite à ma publication précédente , dans laquelle je parlerai des options pour placer des messages dans des files d'attente à l'aide de JMeter.

Nous fabriquons un bus de données pour une grande entreprise fédérale. Différents formats de requête, conversions, routage complexe. Pour les tests, vous devez envoyer un grand nombre de messages dans la file d'attente. Manuellement - une douleur à laquelle tous les ingénieurs manuels ne pourront pas faire face.



Présentation


Même si je devais d'abord supporter cette douleur. Tout a commencé avec RFHUtil. Puissant, mais inconfortable et effrayant: Eh bien, vous connaissez Rus.



Indispensable dans certains cas, mais en baisse stable en cas d'utilisation active.
Des tests pratiques avec lui sont impossibles.

Avec JMeter, les choses sont devenues plus faciles. Après la première étape de la maîtrise et de l'accoutumance, l'espoir d'un heureux test est venu.

J'utilise activement les échantillonneurs JMS Publisher et JMS Subscriber. Contrairement à JMS Point-to-Point, ce couple semblait plus pratique à travailler. Par exemple, vous pouvez spécifier une variable pour Subscriber dans JMS Selector, pour Point-to-Point - no (ou cette méthode n'est pas trop évidente).

Préparation de l'échantillonneur


Éditeur JMS


  • Configuration - Chaque échantillon. Apache recommande d' utiliser cette option si les files d'attente / rubriques sont spécifiées via des variables.
  • Expiration (ms) = 120000. En cas d'échec, les demandes de test disparaîtront de la file d'attente après 2 minutes.
  • Utiliser le mode de livraison non persistant? - vrai. IBM affirme que le mode persistant fournit une persistance fiable des messages en cas de panne soudaine. Et un partage plus rapide en mode non persistant. À des fins de test, la vitesse est plus importante.

Dans chaque éditeur, j'ai défini la propriété jms que l'abonné utilisera dans le sélecteur JMS. Pour chaque expédition, une valeur aléatoire est générée dans l'élément de plan de test des paramètres utilisateur:



Vous pouvez donc être sûr que le bon message a été lu.

Le "blanc" final de l'éditeur JMS préconfiguré:



Abonné JMS


  • Configuration - Chaque échantillon. Eh bien, vous obtenez le point.
  • Timeout (ms) = 100000. Si la demande ne vient pas dans la file d'attente après 100 secondes d'attente, alors quelque chose s'est mal passé.
  • Arrêter entre les échantillons? - vrai.


JMS Selector est une chose assez pratique. Résumé de l'abonné JMS:



Comment gérer l'alphabet cyrillique dans les messages transmis. Dans JMeter, par défaut, après soustraction, il est affiché de travers. Pour éviter cela et profiter des grands et des puissants toujours et partout, il vous faut:

  1. Ajoutez l'argument JVM au «lanceur» JMeter:
    -Dfile.encoding=UTF-8 
  2. Ajoutez JSR223 PostProcessor à Subscriber avec une ligne sur groovy:
     prev.setDataEncoding("UTF-8") 

Transfert de texte


L'option la plus paresseuse. Convient pour déboguer des tests fraîchement écrits. Ou pour les cas où vous devez envoyer au moins quelque chose de petit. Sélectionnez l'option Source du message - Zone de texte et placez le corps du message dans un bloc de texte:



Transfert de fichiers


L'option la plus courante. Convient à la plupart des scénarios. Sélectionnez l'option Source du message - Du fichier et spécifiez le chemin d'accès au message dans le champ Fichier - Nom du fichier:



Transférer le fichier dans le champ de texte


L'option la plus polyvalente. Convient à la plupart des scénarios + peut être utilisé dans JMS Point-to-Point, dans lequel il n'y a pas de deuxième option d'envoi:



Transfert de tableau d'octets


L'option la plus difficile. Convient pour vérifier le transfert infailliblement précis des requêtes vers l'octet, sans distorsion, SMS et perturbation. Je ne peux pas faire ça dans le JMeter par défaut, ici ils m'ont définitivement parlé de ça.

Par conséquent, j'ai dû télécharger les sources et modifier le code d' abonné JMS.

Remplacement de la ligne dans la extractContent(..) :

 buffer.append(bytesMessage.getBodyLength() + " bytes received in BytesMessage"); 

le:

 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 reconstruit JMeter.

Il reste à ajouter quelques échantillonneurs JSR223. Le premier est 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:\\temp\\randomBytes.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"); } 

Le second, à la fin du script, 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 pour Publisher:



Et aussi une vérification dans l'assertion JSR223 pour l'abonné - comparez les octets source avec ceux qui viennent dans la file d'attente du récepteur:

 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("Comparison failed"); SampleResult.setResponseData("Bytes have changed","UTF-8"); IsSuccess=false; } 

Conclusion


Il a décrit quatre façons d'envoyer des messages dans une file d'attente, que j'utilise quotidiennement dans la pratique. J'espère que ces informations vous faciliteront la vie. Dans la suite, je prévois de parler de mon expérience dans le test des échanges, où d'un côté il y a une file d'attente et de l'autre il y a une base de données ou un système de fichiers.

Prenez soin de votre temps. Et merci d'avoir regardé.

image

Source: https://habr.com/ru/post/fr446536/


All Articles