loadrunner vugen scripting challenges
Introduction aux défis impliqués dans les scripts LoadRunner VuGen:
Dans ce Série de formation informative LoadRunner , nous avons exploré Améliorations apportées au script VuGen dans notre tutoriel précédent. Depuis nos tutoriels précédents jusqu'à maintenant, nous avons fait de grands progrès avec VuGen.
Nous avons appris comment enregistrer un script dans le protocole Web HTTP / HTML, comment prendre en charge les données / valeurs avec corrélation et paramétrage, comment s'assurer que la réponse est correcte avec des points de contrôle, comment insérer des transactions qui mesurent le taux et le temps de réponse de l'utilisateur actions et autres choses.
Avec ceux-ci, nous devrions être en mesure de créer avec succès des scripts pour presque toutes les applications Web.
=> Cliquez ici pour une série complète de didacticiels LoadRunner
Langue LR
Il peut y avoir des situations où nous devons effectuer des tâches plus difficiles dans un script VuGen. Dans ce didacticiel, nous discuterons de certains des défis de script ainsi que des techniques disponibles pour les gérer.
Avant d’en discuter, comprenons quelques points. VuGen (ou Load Runner) ne peut comprendre que son propre langage (appelons cela le langage LR, LR étant la forme courte de Load Runner). Ainsi, quel que soit le script qu'il génère, on peut dire qu'il est en langage LR. En langage LR, il n’existe qu’un seul type de données - String (et plus précisément «LR String»).
Maintenant, afin de faire des améliorations dans un script VuGen, nous utilisons généralement le langage C.
Nous savons qu'en langage C, il existe de nombreux types de données comme int, char, float, long etc. Si nous définissons et utilisons directement des valeurs C dans une requête, VuGen ne comprendra pas (car il ne comprend que les `` chaînes LR '') et lancera une erreur. Nous devons donc convertir toute valeur C (de tout type de données) en «chaîne LR» avant de l’utiliser dans une requête.
Après avoir compris cela, passons à quelques scénarios difficiles en temps réel.
Scénario 1:Comment utiliser une chaîne C dans une requête VuGen
Supposons que dans un script VuGen, nous ayons une requête qui a un champ appelé «PlanName» (supposons que ce script est pour une application de planification financière). Lors de l’enregistrement, nous avons saisi la valeur «NewPlan».
web_submit_data('MyPlan', 'Action= {pURL} ', 'Method= POST ', 'TargetFrame=', 'RecContentType= text/html ', 'Snapshot= t21.inf ', 'Mode= HTML ', ITEMDATA , 'Name= PlanId ', 'Value= 67213 ', ENDITEM , 'Name= PlanName ', 'Value= NewPlan ', ENDITEM , 'Name= Age ', 'Value= 57 ', ENDITEM , 'Name= MaritalStaus ', 'Value= Married ', ENDITEM , LAST );
Supposons que nous souhaitons utiliser une chaîne définie par l'utilisateur comme nom de plan.
Donc, nous devons déclarer et définir une chaîne comme indiqué ci-dessous
char sPlanName() = ' MyFinancialPlan ';
Le ‘sPlanName’ est une chaîne C et nous devons donc le convertir en chaîne LR (pour l’utiliser dans la requête).
Nous faisons cela en utilisant la fonction «lr_save_string» comme indiqué ci-dessous:
lr_save_string(sPlanName,”LRPlanName”);
Cette fonction affecte une valeur au paramètre / variable LR. Il prend deux attributs - Le premier attribut est la source (chaîne C) et le deuxième attribut est la destination (paramètre / variable LR).
Donc, cette fonction enregistre la valeur de la variable C que nous avons définie dans le paramètre LR «LRPlanName».
Nous pouvons maintenant remplacer le ‘LRPlanName’ comme n’importe quel autre paramètre dans la requête VuGen.
web_submit_data('MyPlan', 'Action= {pURL} ', 'Method= POST ', 'TargetFrame=', 'RecContentType= text/html ', 'Snapshot= t21.inf ', 'Mode= HTML ', ITEMDATA , 'Name= PlanId ', 'Value= 67213 ', ENDITEM , 'Name= PlanName ', 'Value= {LRPlanName} ', ENDITEM , 'Name= Age ', 'Value= 57 ', ENDITEM , 'Name= MaritalStaus ', 'Value= Married ', ENDITEM , LAST );
Notez que lorsque nous exécutons ce script, tous les Vusers et toutes les itérations prendront la même valeur que le nom du plan. Afin de rendre le nom du plan unique à chaque exécution, nous pouvons faire quelque chose comme ça.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Ici, «pVuserId» et «pIteration» sont les paramètres «Vuser ID» et «Iteration Number» (dont nous avons parlé dans les types de paramètres dans nos didacticiels précédents). Ceux-ci sont utilisés dans le nom du plan pour garantir que nous avons des noms uniques pour chaque Vuser et itération.
Le «Lr_eval_string» La fonction renvoie la chaîne d'entrée après avoir évalué les paramètres incorporés. Ainsi, dans ce cas, la sortie de cette fonction sera 'MyFinancialPlan_1_1' pour la première itération de Vuser première, 'MyFinancialPlan_1_2' pour la première deuxième itération de Vuser et ainsi de suite.
Et bien sûr, nous savons quoi «Lr_save_string» fonction fait.
Nous pouvons maintenant remplacer le paramètre «LRPlanName» comme indiqué ci-dessus.
Scénario 2:Comment convertir une variable Load Runner en entier C
Dans le dernier didacticiel, nous avons vu un exemple pour comprendre comment nous réussissons ou échouons manuellement une transaction en fonction d'une condition.
Exemple:
web_reg_find('Text= Welcome ','SaveCount= WelcomeCount ', LAST ); web_submit_data('login.pl', 'Action= http://127.0.0.1:1080/cgi-bin/login.pl ', 'Method= POST ', 'TargetFrame= body ', 'RecContentType= text/html ', 'Referer=http://127.0.0.1:1080/cgi-bin/nav.pl?in= home ', 'Snapshot= t2.inf ', 'Mode= HTML ', ITEMDATA , 'Name= userSession ', 'Value= {corUserSession} ', ENDITEM , 'Name= username ', 'Value= jojo ', ENDITEM , 'Name= password ', 'Value= bean ', ENDITEM , 'Name= JSFormSubmit ', 'Value= off ', ENDITEM , 'Name= login.x ', 'Value= 66 ', ENDITEM , 'Name= login.y ', 'Value= 12 ', ENDITEM , LAST ); if( atoi (lr_eval_string('{WelcomeCount}'))>0) { lr_end_transaction('Login', LR_PASS ); } else { lr_end_transaction('Login', LR_FAIL ); }
Nous avons utilisé 'if statement' ici avec l'attribut 'SaveCount'. Le paramètre ‘WelcomeCount’ qui enregistre le nombre d’occurrences du texte ne peut pas être utilisé directement dans la condition ‘if’ car il s’agit d’une chaîne de chargement. Donc, ce paramètre doit d'abord être converti en chaîne C, puis en entier C. «Lr_eval_string» et «Atoi» des fonctions sont utilisées (respectivement) pour s'en occuper.
Le «Atoi» La fonction C convertit une chaîne C en un entier C.
Après cette conversion, cela peut être utilisé comme n'importe quel autre entier C.
Scénario 3:Comment envoyer une valeur aléatoire dans une requête
Très souvent, nous arrivons à des scénarios d'application où nous devons sélectionner une valeur aléatoire (par exemple dans une liste déroulante). Comment gérons-nous cela dans les scripts VuGen? Comment pouvons-nous nous assurer que la valeur aléatoire est sélectionnée pour chaque itération? Voyons cela en détail.
Prenons l’exemple de notre application ‘Web Tours’. Comme nous l'avons vu précédemment, nous avons une page 'Rechercher un vol' dans laquelle nous devons sélectionner un vol.
Disons que nous sélectionnons le premier dans la liste. La requête correspondante dans le script est comme ceci (où la valeur correspondante pour le vol sélectionné).
web_submit_data('reservations.pl_2', 'Action= http://127.0.0.1:1080/cgi-bin/reservations.pl ', 'Method= POST ', 'TargetFrame=', 'RecContentType= text/html ', 'Referer= http://127.0.0.1:1080/cgi-bin/reservations.pl ', 'Snapshot= t5.inf ', 'Mode= HTML ', ITEMDATA , 'Name= outboundFlight ', 'Value= 020 ;338;04/03/2018', ENDITEM , 'Name= numPassengers ', 'Value= 1 ', ENDITEM , 'Name= advanceDiscount ', 'Value= 0 ', ENDITEM , 'Name= seatType ', 'Value= Coach ', ENDITEM , 'Name= seatPref ', 'Value= None ', ENDITEM , 'Name= reserveFlights.x ', 'Value= 39 ', ENDITEM , 'Name= reserveFlights.y ', 'Value= 10 ', ENDITEM , LAST );
Nous devons d'abord capturer les valeurs correspondantes pour les quatre vols de l'une des réponses précédentes. Nous pouvons le faire en utilisant la fonction de corrélation (web_reg_save_param) avec l’attribut «ORD = ALL» avant la requête dont la réponse a ces valeurs.
La sortie de ceci sera comme ceci où le paramètre corrélé «cFlight» a un tableau de quatre valeurs correspondant aux quatre vols.
L'étape suivante consisterait à sélectionner au hasard l'une de ces valeurs et à la soumettre dans la demande. Cela peut être fait en utilisant «Lr_paramarr_random» fonction comme indiqué ci-dessous.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
L'entrée de «Lr_paramarr_random» function est un tableau de paramètres et la sortie est une valeur aléatoire de ce tableau. Donc, ici, la sortie de cette fonction est l'une des quatre valeurs de vol. Et comme cette valeur aléatoire est une chaîne LR, la fonction «lr_eval_string» est utilisée (pour la convertir en chaîne C).
«Strcpy» La fonction C copie enfin cette valeur dans une variable de chaîne C «flightVal».
À nouveau, nous devons convertir cette variable C String en chaîne LR pour pouvoir envoyer la requête.
lr_save_string(flightVal,'randomFlight'); web_submit_data('reservations.pl_2', 'Action= http://127.0.0.1:1080/cgi-bin/reservations.pl ', 'Method= POST ', 'TargetFrame=', 'RecContentType= text/html ', 'Referer= http://127.0.0.1:1080/cgi-bin/reservations.pl ', 'Snapshot= t5.inf ', 'Mode= HTML ', ITEMDATA , 'Name= outboundFlight ', 'Value= {randomFlight} ', ENDITEM , 'Name= numPassengers ', 'Value= 1 ', ENDITEM , 'Name= advanceDiscount ', 'Value= 0 ', ENDITEM , 'Name= seatType ', 'Value= Coach ', ENDITEM , 'Name= seatPref ', 'Value= None ', ENDITEM , 'Name= reserveFlights.x ', 'Value= 39 ', ENDITEM , 'Name= reserveFlights.y ', 'Value= 10 ', ENDITEM , LAST );
Scénario 4:Comment diviser une chaîne en jetons
Disons qu'il y a un scénario où nous devons diviser une chaîne en morceaux / jetons. Prenons l'exemple de notre application 'Visites Web' d'où la valeur du vol 020 ; 338; 04/03/2018 disons que nous devons utiliser uniquement «338», puis nous devons diviser cette chaîne et la stocker dans une variable.
Pour faire ça «Strtok» la fonction est utilisée.
«Strtok» La fonction C renvoie un jeton à partir d'une chaîne délimitée par des caractères spécifiés. Après le premier appel, nous devons passer «NULL» comme valeur de la chaîne pour obtenir le jeton suivant. L'exemple ci-dessous montre comment cette fonction est utilisée pour diviser la valeur de vol en fonction du délimiteur point-virgule (;).
Exemple:
Supposons que la valeur de vol soit capturée à partir de la réponse pertinente dans le paramètre «cFlight».
char string(100); char *token; int i=1; strcpy(string,lr_eval_string('{cFlight}')); token=(char *)strtok(string,';'); lr_output_message('Token %d is %s',i,token); while(token != NULL) { i=i+1; token=(char *)strtok(NULL,';'); lr_output_message('Token %d is %s',i,token); }
Le résultat de ceci peut être vu dans le journal de relecture.
Nous pouvons copier le jeton requis dans un paramètre et l'utiliser.
Scénario 5:Comment lire et écrire des données dans un fichier texte
Parfois, il peut être nécessaire de lire des données à partir d'un fichier externe ou d'écrire des données dans un fichier externe. Voyons comment nous procédons dans un script VuGen.
Voyons d'abord comment lire les données d'un fichier texte.
Exemple: Supposons que nous devions lire un XML à partir d'un fichier de données externe et l'utiliser comme requête dans le script.
Pour ce faire, nous utilisons «Fread» Fonction C.
Cette fonction prend quatre attributs:
amortir - Le tampon dans lequel stocker le flux de données.
Taille - La taille du tampon.
compter - Le nombre d'octets à lire.
file_pointer - Le pointeur de fichier
Exemple de code (avec commentaires) pour le même
char buffer(1000); //The buffer to store the read data stream char *filename = 'C:\Temp\mysamplefile.txt'; /* name and path of the file to be read from */ char * accessmode = 'r'; /* access mode r /r+ = open for reading , w /w+ = open for writing ,a /a+ = open for appending */ /* '+' sign indicates that the file must already exist */ long filepointer; /* declaring a file pointer */ int count=500; /* number of bytes to be read */ filepointer = fopen (filename, accessmode); /* open file in read mode */ fread (buffer,sizeof(char),count,filepointer); /* read from output file */ lr_save_string(buffer,'requestbody'); //we can use this as a LR parmeter and can use in the script now fclose (filepointer); //close the file pointer
Notez que dans le code ci-dessus, nous lisons 500 octets du fichier texte. De toute évidence, nous ne connaissons pas toujours la taille du fichier. Nous pouvons donc utiliser «Fseek» et «Ftell» Fonctions C (je vous laisse l'explorer) pour trouver la taille du fichier et utiliser le 'compter' attribut du «Fread» fonctionner en conséquence.
Voyons maintenant comment écrire des données dans un fichier texte.
Exemple: Supposons que nous ayons un script qui crée des commandes et génère un «orderid». Si nous voulons connaître tous les ID de commande créés par notre script dans un test, nous pouvons faire en sorte que notre script copie ces ID de commande dans un fichier texte externe.
«Fprintf» - La fonction C écrit la sortie formatée dans un fichier.
Cette fonction prend ces attributs:
file_pointer - Le pointeur de fichier
format_string - La chaîne formatée à écrire dans le fichier.
args - Un ou plusieurs arguments d'impression facultatifs.
L'exemple de code est illustré ci-dessous. Supposons que nous ayons corrélé et enregistré «orderid» dans le paramètre «cOrderId».
Exemple:
char *filename = 'C:\Temp\mysamplefile.txt'; /* name and path of the file to be created or edited */ char * accessmode = 'a+'; /* access mode r /r+ = open for reading , w /w+ = open for writing ,a /a+ = open for appending */ /* '+' sign indicates that the file must already exist */ long filepointer; /* declaring a file pointer */ filepointer = fopen (filename, accessmode); /* open file in append mode */ fprintf (filepointer, '%s
', lr_eval_string('{cOrderId}')); /* write orders id to output file */ fclose (filepointer); /* close the file pointer */
J'espère que nous maîtrisons maintenant les concepts de lecture ou d'écriture de données dans un fichier externe (bien sûr, il pourrait y avoir d'autres façons de faire la même chose que ce que nous avons discuté ci-dessus). Il serait très utile de faire une étude approfondie sur les opérations sur les fichiers en C (vous pouvez vous référer à tous les bons tutoriels ou livres C) car ceux-ci sont très nécessaires dans de nombreux scénarios en temps réel.
Scénario 6:Comment gérer la corrélation lorsque les limites changent
Dans le didacticiel sur les corrélations, nous avons utilisé des fonctions de corrélation basées sur les limites pour capturer les valeurs dynamiques de la réponse. Mais que se passe-t-il si nous avons un scénario où les limites changent? Il existe plusieurs façons de gérer de telles situations. Voyons cela en détail.
a) En utilisant les indicateurs «IC», «DIG» et «ALNUM»:
IC - Cet indicateur demande à VuGen d'ignorer la casse dans la limite gauche / droite.
Exemple: Si la limite gauche est parfois en majuscules et parfois en minuscules, nous utilisons ce drapeau.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
TU - Cet indicateur demande à VuGen de prendre en compte tout nombre unique où le caractère sauvage «#» est utilisé dans la limite gauche / droite.
exemples de cas de test pour une demande d'assurance
Exemple: Si la limite gauche (ou la limite droite) change comme ceci (un seul nombre à une position particulière).
GJHi3rty
1GJHi8rty
GJHi7rty
Nous pouvons utiliser le drapeau «DIG» comme indiqué ci-dessous, car cela prendra en charge le changement de numéro.
LB / DIG = GJHi # rty
aulne - Cet indicateur demande à VuGen de prendre en compte tout caractère alphanumérique unique où le caractère sauvage «^» est utilisé dans la limite gauche / droite.
Exemple: Si la limite gauche (ou la limite droite) change comme ceci (un seul caractère alphanumérique à une position particulière).
GJHi3rty
GJHiKrty
GJHitrty
Nous pouvons utiliser l'indicateur «ALNUM» comme indiqué ci-dessous, car cela prendra en charge le changement de caractère alphanumérique
LB / ALNUM = GJHi ^ rty
De plus, nous pouvons utiliser deux drapeaux ensemble - comme 'ALNUMIC' qui est à la fois 'ALNUM' et 'IC'.
b) Utilisation des attributs «SaveLen» et «SaveOffset»:
Nous pouvons utiliser ces deux attributs du «Web_reg_save_param» fonctionnent correctement pour n'entrer que la partie statique des limites gauche / droite.
c) Utilisation d'expressions régulières:
On peut utiliser «Web_reg_save_param_regexp» fonction de corrélation pour enregistrer la valeur dynamique (dans un paramètre) qui correspond à une expression régulière.
Exemple: Supposons que la valeur dynamique que nous voulons capturer soit '3959339' à partir du texte donné,
PriceControl_ctl01 «Name = jack», «Refid = 3959339» solde
Nous ne pouvons pas utiliser la fonction de corrélation basée sur les limites ici car la valeur et la longueur du champ comme «Nom» ci-dessus peuvent changer (et nous ne pouvons donc pas l’utiliser dans la limite gauche ou droite).
Nous pouvons utiliser le «Web_reg_save_param_regexp» fonction de corrélation comme indiqué ci-dessous pour résoudre ce problème.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Les groupes d’expressions régulières sont mis entre parenthèses et l’attribut «Groupe» décide du groupe à prendre en compte pour enregistrer la correspondance correspondante avec le paramètre spécifié (dans le premier attribut).
Quelques correspondances d'expressions régulières sont présentées ci-dessous:
d - correspond à un seul chiffre
w - correspond à un seul mot
(A-Z) + - correspond à n'importe quel mot en majuscules
(a-z) + - correspond à n'importe quel mot en minuscules
(0-9) + - correspond à n'importe quelle valeur numérique
Scénario 7:Comment écrire et utiliser une fonction dans un script VuGen
Comme dans tout autre langage de programmation, nous pouvons écrire / définir une fonction manuellement (généralement appelée fonction définie par l'utilisateur) et l'utiliser n'importe où dans le script VuGen.
Supposons que nous devions envoyer un nom de plan unique dans chaque requête d'un script particulier. Ainsi, au lieu d'écrire le code requis (qui génère un nom unique) plusieurs fois, nous pouvons définir une fonction (qui génère un nom unique) et appeler chaque fois (et où) cela est requis dans le script VuGen.
Bien que la fonction d'un script VuGen puisse être écrite à l'intérieur de n'importe quelle action, elle est généralement écrite à l'intérieur du «Globals.h» fichier (sous la section Extra Files du script VuGen) ou dans un fichier nouvellement créé (sous la même section «Extra Files»). Une fois écrite, la fonction peut être appelée à partir de n'importe quelle (s) action (s).
L’image ci-dessous montre une fonction définie par l’utilisateur «MyFunction» écrite dans le fichier «globals.h».
Comme indiqué ci-dessus, l'autre méthode consiste à créer un nouveau fichier et à écrire la fonction à l'intérieur.
La seule chose à retenir lors de la création d’un nouveau fichier est que nous devons l’inclure dans le fichier ‘globals.h’ (sans lequel VuGen ne reconnaîtra pas ce fichier).
Conclusion
Ainsi dans ce tutoriel, nous avons vu comment gérer certains défis en temps réel dans les scripts VuGen et nous tomberions évidemment sur de nombreux autres scénarios lorsque nous travaillons sur diverses applications.
En outre, vous auriez réalisé que les fonctions de chaîne C et les opérations de fichier C sont très nécessaires (et utiles) dans la gestion de divers scénarios. Cependant, je vous recommanderais de passer du temps à les maîtriser.
Dans notre prochain didacticiel, nous verrons et comprendrons certaines fonctions prédéfinies importantes utilisées dans les scripts VuGen (nous avons déjà vu certaines des fonctions).
=> Visitez ici pour une série complète de didacticiels LoadRunner
Tutoriel PREV | Tutoriel SUIVANT
lecture recommandée
- Test des performances des services Web à l'aide du script LoadRunner VuGen
- Scriptage avancé du shell Unix: tableaux, opérateurs de test de fichiers et de chaînes, variables spéciales
- Test de charge avec les didacticiels HP LoadRunner
- Options d'enregistrement VUGen dans LoadRunner
- Comment configurer les fichiers de script LoadRunner VuGen et les paramètres d'exécution
- Fonctions LoadRunner importantes utilisées dans les scripts VuGen avec des exemples
- Introduction à Micro Focus LoadRunner - Test de charge avec LoadRunner Tutorial # 1
- Script JMeter BeanShell, partie 2