Fonctions natives de JMeter (Partie 2)
Sommaire
intermédiaire - This article is part of a series.
Bienvenue dans la deuxième partie des fonctions natiques de JMeter. Je vous suggère que cette publication conclue à l’explication des fonctionnalités qui peuvent nous aider à résoudre les logiciels complexes pour nos besoins de tests sans plus, en laissant le tableau des fonctionnalités que nous couvrirons dans cette publication:
4 - Fonctions de programmation #
Ces fonctions sont probablement les plus controversées de JMeter car elles sont trop vagues et peuvent conduire à une infinité de possibilités. Nous ne pouvons pas y faire référence, car il existe tellement d’approches possibles que nous ne pourrions jamais aborder cette question. Cependant, je vous montrerai quelques cas où ces fonctions fonctionnent bien avec IF et WHILE.
Les options pour les langages de programmation sont : Beanshell, Groovy, JavaScript et JEXL. C’est pourquoi nous pouvons choisir notre arme préférée pour traiter n’importe quel logique complexe ou simple. Cependant, probablement nous utiliserons seulement quelques lignes de code à la plus grande partie. Pourquoi ? Parce que si vous voulez utiliser plus qu’une certaine quantité, je recommande d’utiliser un pré-processeur, un moustreador ou un post-processor.
BeanShell #
BeanShell est une interpréteur Java créée il y a 20 ans et la dernière mise à jour était sortie en 2003. Obsolete mais fonctionnelle toujours, je l’ai appris avec JMeter au début de 2012 jusqu’en 2017 lorsque Groovy s’est imposé et ses performances et sa vitesse ont rapidement surpassé BeanShell, surtout si le code compilé est cache. Plus de 5 ans que j’utilisais BeanShell pour traiter presque tous les besoins logiciels dans les flux, principalement en tant qu’interpréteur pré-ou post-processeur, rares fois comme mule car il ne lui plaisait pas sur mes résultats.
Java #
Il peut sembler bizarre, mais Groovy a été lancé dans le même année que la dernière version stable de Beanshell, qui a été lancée en 2003. Depuis lors, Groovy est devenu la langue scripturale la plus populaire pour JMeter. Parmi ses avantages clés figurent :```
- Il s’agit d’une langue orientée objet.
- Compile directement en bytecode aussi rapidement que le code Java.
- Cache la compilation.
- Maintient et met à jour constamment.
Aujourd’hui il n’y a pas de place à la comparaison entre Groovy et BeanShell car BeanShell n’a été mis à jour que plus de 16 ans. Cependant, seule une situation où je recommanderais l’utilisation de BeanShell serait lorsque vous devez traiter des scripts JMeter anciens qui ne peuvent pas être migrés vers les versions plus récentes de JMeter. Dans ces cas-là, je recommanderais d’effectuer la migration vers Groovy car il est plus rapide et ne nécessite que peu de changements de code ; car Groovy reconnaît presque tous les syntaxes de BeanShell.
Javascript #
JavaScript ou ECMAScript est une autre langue interprétée qui peut être utilisée dans JMeter. Généralement, les contrôleurs IF et WHILE évaluent la statement avec cette langage pour permettre aux threads de continuer, d’arrêter les boucles ou de se jeter à certaines branches. Bien que ce soit un excellent langage, le sampler JSR223 seulement autorise le stockage pour Groovy, rendant JavaScript moins efficace pour des répétitions importantes. Dans ma opinion, il est mieux d’utiliser cela pour des évaluations petites mais pas pour les tâches complexes.
JEXL #
JEXL signifie Langage de Expression Java. Il s’agit du langage le plus limité mais c’est précisément ce qui rend ce langage si populaire ; sa simplicité. Le code est petit et rapide, évaluant une expression booléenne, et probablement la plus grande utilisation de JEXL dans JMeter, bien que cela puisse également être utilisé dans les modèles de chargement ou pour des expressions d’évaluation.
exemples de fonctions des langages de programmation:
Fonction | Exemple | Résultat attendu |
---|---|---|
Groovy | ${__groovy(props.get(“START.MS”).substring(0\,2),)} | Affiche la sous-chaine 0-2 de la propriété START.MS |
BeanShell | ${__BeanShell(123*456,)} | Affiche le résultat de multiplier 123x456 |
JavaScript | ${__javaScript(new Date(),)} | Affiche une nouvelle date dans un format étendu |
Jexl2 | ${__jexl2(1 < 1,)} | Affiche le résultat de l’évaluation: False |
Jexl3 | ${__jexl2(1 >= 1,)} | Affiche le résultat de l’évaluation: True |
Tous les langages de programmation ont accès aux ressources de JMeter. La table suivante décrit la relation entre les ressources et les langages de programmation :
Utilisés Populaires:
Si vous utilisez des contrôles IF
ou WHILE
, ces contrôles nécessitent une condition booléenne sur laquelle décider de continuer ou d’éliminer, donc les options les meilleures pour ce travail seraient JavaScript
et JEXL
, bien que nous puissions utiliser n’importe quel autre. Cependant, toujours soyez prudent lorsqu’il s’agit de sélectionner l’option pour évaluer la condition comme une variable d’expression. Des utilisations populaires seraient :
Voici un exemple du script WebTours qui utilise une modèle de chargement avec des contrôles IF. Le script pour JMeter avec des exemples d’utilisation de contrôles IF pour modéliser et distribuer les charges nécessite Java 1.8+, JMeter 5+ et des plugins JMeter.
Pourquoi utiliser le Controleur Conditionnel (If) plutôt que le Controleur de Flux (Throughput)? #
C’est une bonne question, mais répondre à cette question n’est pas facile. Personnellement, je pense que le Controleur de Flux effectue de nombreux calculs pour déterminer si un certain élément du flux doit ou ne doit pas être exécuté, en fonction des executions précédentes, en comptant les itérations parmi les propriétés et évaluations pour corriger les valeurs. Cette consommation de ressources CPU et mémoire est beaucoup plus grande si plusieurs Controleurs de Flux sont utilisés dans la même script pour modéliser le débit d’essai. De plus, le Controleur Conditionnel effectuera uniquement une évaluation en utilisant JEXL pour calculer et décider s’il y a un nombre aléatoire généré qui correspond à la plage ou non. De plus, tandis que le Controleur de Flux nécessite un nombre initial d’exécutions pour corriger la tendance si vous arrêtez le test avant l’heure prévue, il ne peut pas se réparer lui-même. En revanche, avec un Controleur Conditionnel à tout moment, les nombres aléatoires générés devraient soit correspondre ou non à leur distribution uniforme.
5.- Fonctions de propriété #
Dans JMeter, les propriétés sont comme des variables mais dans un environnement global. Cela signifie que toutes les threads peuvent accéder ces valeurs et également les mettre à jour. La plupart de ces “propriétés” sont définies via les fichiers .properties situés dans le répertoire bin, sous le nom de user.properties et jmeter.properties. Remarquez que vous devez redémarrer JMeter si vous modifiez certaines de ces valeurs.
N’aucun paramètre ne devrait être modifié sans connaître précisément ce qu’il sert. Cela pourrait avoir un effet négatif sur la comportement de JMeter et ses résultats, même si il existe une dangerosité latente à modifier ces propriétés. Bien que l’avantage de les utiliser soit très large, on peut noter qu’une des utilisations les plus courantes est de configurer le nombre de threads, la ramp-up ou la durée du script, comme nous pouvons le voir dans cet article.
jmeter.sh -n -t TestPlan.jmx -Jthreads=100 -Jrampup=100 -Jduration=600 -l TestPlan.jtl
Autre exemple excellent est de configurer des objets globalement, et je ne parle pas seulement des chaînes, les entiers ou les booléens. Nous pouvons également configurer des matrices, des vecteurs, des files d’attente, des listes et toute structure de données de type que vous pourriez avoir besoin pour votre logique de test. J’ai publié des articles sur Grafana pendant une longue période où j’utilisais une liste pour collecter plusieurs résultats et les envoyer à InfluxDB dans une seule requête HTTP, ici vous pouvez consulter l’article article.
Exemples de fonctions de propriétés : propriétés threads : 1 rampup : 1 duree : 60
Fonction | Exemple | Résultat attendu |
---|---|---|
estPropDefini | ${__isPropDefined(threads)} | Affiche la valeur booléenne si le propriété est définie, dans ce cas true |
propriété | ${__property(threads)} | Affiche le valeur de la propriété threads : 1 |
P | ${__P(duration)} | Affiche le valeur de la propriété: 60 |
P | ${__P(duration,90)} | Met à jour la valeur de la propriété à 90 |
assignerPropriété | ${__setProperty(propname,propvalue,)} | Assigne une valeur à une propriété |
De même, nous incluons des images de l’exemple et vous pouvez les télécharger ci-dessous :
Le script de JMeter avec des exemples d’fonctions propres nécessite Java 1.8+ , JMeter 5+ et les extensions de JMeter.
6 - Fonctions des variables #
Dans JMeter, les variables sont simplement des variables locales. Cela signifie qu’elles sont créées et détruites pendant chaque itération de la boucle thread. La plupart des données que nous utilisons dans l’exécution d’une boucle thread (comme les corrélations) sont stockées dans des propriétés qui disparaîtront une fois que la boucle thread est terminée et qu’elle commence une nouvelle itération. Si vous avez besoin de sauvegarder un certain nombre, le meilleur option est de l’enregistrer dans une propriété ; cependant, les valeurs dans les propriétés aussi disparaitront lorsque le test se termine, donc il vaut mieux enregistrer-les dans un archivage.
Examples of variable functions: variables Test_1: Flood Test_2: io Vars: 12345|67890|10293848576|5647382910 Variable: Test_1 es “${Test_1}” y Test_2 es “${Test_2}” Numero: 2
Fonction | Exemple | Résultat attendu |
---|---|---|
séparer | ${__split(${Vars},splitVar,|)} | Divise la variable Vars avec le délimiteur pipe, et les résultats sont stockés dans splitVar |
évaluer | ${__eval(Test_1 es “${Test_1}” y Test_2 es “${Test_2}”)} | Affiche la chaîne: Test_1 est “Flood” et Test_2 est “io” |
évaluer une variable | ${__evalVar(Variable)} | Affiche l’évaluation de Variable: Test_1 est “Flood” et Test_2 est “io” |
vérifier si une variable existe | ${__isVarDefined(Variable)} | Affiche le booléen en cas où la variable existe, dans ce cas true |
V | ${__V(Test_${Numero})} | Affiche la chaîne: io qui est le contenu de la variable Test_2 |
V | ${__V(splitVar_${Numero})} | Affiche la chaîne: 67890 qui est le contenu de la variable splitVar_2 |
De même, nous incluons des images de l’exemple et vous pouvez la télécharger ci-dessous :
Le script de JMeter avec des exemples d’fonctions variables nécessite Java 1.8+ , JMeter 5+ et les extensions de JMeter.
7.- Fonctions de chaîne #
C’est très courant dans l’environnement des tests de modifier et mettre à jour les valeurs de chaîne. Il est également possible d’exécuter des transformations, conversions, coupures ou divisions sur ces mêmes éléments. Parmi les utilisations les plus fréquentes se trouvent la codification et la décodage des URL avec les fonctions urlencode et urldecode, deux fonctions vraiment utiles lors de la manipulation des pages web et des paramètres publiés. Bien que les fonctions string soient destinées à la conversion, nous avons deux fonctions qui ne sont pas directement liées à ces tâches. Par exemple, la fonction regexFunction est une extrémetrice régulière très similaire à l’extraction post-processing, et la fonction dateTimeConvert aide à transformer différents formats de temps.
Exemples de Fonctions de Chaine :
Fonction | Exemple | Résultat |
---|---|---|
char | ${__char(165)} | Affiche le caractère 165 : ¥ |
char | ${__char(182)} | Affiche le caractère 182 : ¶ |
changeCase | ${__changeCase(Mayusculas,UPPER,Tmp)} | Change la casse en majuscules et stocke dans la variable Tmp |
changeCase | ${__changeCase(Minusculas,LOWER,Tmp)} | Change la casse en minuscules et stocke dans la variable Tmp |
escapeOroRegexpChars | ${__escapeOroRegexpChars([0-9].+?,)} | Affiche le string : [0-9].+? |
escapeXml | ${__escapeXml(“Valor”+&+’Value’)} | Affiche le string: "Valor"+&+?Value? |
regexFunction | ${__regexFunction(min(.+),$1$,1,,,,Tmp)} | Retourne l’évaluation de la fonction régulière dans la variable Tmp : sculas |
escapeHtml | ${__escapeHtml(“Comillas Dobles”+‘sencillas’)} | Affiche le string: "Comillas Dobles"+‘sencillas’ |
unescapeHtml | ${__unescapeHtml("Comillas Dobles"+‘sencillas’)} | Affiche le string: “Comillas Dobles”+‘sencillas’ |
unescape | ${__unescape(\ttabulador)} | Affiche le string: tabulador |
urlencode | ${__urldecode(%5Bflood%5D%3D%28element%29)} | Affiche le string: [flood]=(element) |
urldecode | ${__urlencode([flood]=(element))} | Affiche le string: %5Bflood%5D%3D%28element%29 |
De même, nous incluons des images de l’exemple et vous pouvez la télécharger ci-dessous :
Le script de JMeter avec des exemples d’fonctions de chaîne nécessite Java 1.8+ , JMeter 5+ et les extensions de JMeter.
Concluison #
Les fonctions de JMeter ont évolué et augmenté en valeur, bien que certaines fonctionnalités supplémentaires puissent être incluses via l’addon Custom JMeter Functions et sont extrêmement utiles, surtout pour la Base64 lorsqu’il s’agit de calculer les headers d’autorisation basiques. Je n’ai pas couvert ces fonctionnalités dans cette publication mais cela semble nécessaire de faire preuve de patience plutôt que de donner simplement le poisson en lui-même, simplement par installation des addons, sélectionnant Custom JMeter Functions du menu et redémarrage. J’espère que cet information a été d’une aide. Profitez-en avec les fonctions de JMeter!