loadrunner vugen scripting challenges
Introducció als reptes relacionats amb LoadRunner VuGen Scripting:
En aquest Sèrie informativa de formació LoadRunner , vam explorar Millores d’escriptura VuGen al nostre tutorial anterior. Des dels nostres tutorials anteriors fins ara, hem avançat molt amb VuGen.
Vam aprendre a gravar un script al protocol Web HTTP / HTML, com tenir cura de les dades / valors amb correlació i parametrització, com assegurar si la resposta és correcta amb els punts de control, com inserir transaccions que mesuren la velocitat i el temps de resposta de l'usuari. accions i altres coses.
Amb aquests, hauríem de ser capaços de crear scripts amb èxit per a gairebé totes les aplicacions web.
=> Feu clic aquí per obtenir una sèrie completa de tutorials de LoadRunner
Llenguatge LR
Pot haver-hi situacions en què haguem de fer tasques més difícils en un script VuGen. En aquest tutorial, parlarem d'alguns dels reptes de seqüència de comandaments juntament amb les tècniques disponibles per gestionar-los.
Abans de discutir-los, entenem algunes coses. VuGen (o Load Runner) només pot entendre el seu propi idioma (anomenem-ho com a llenguatge LR, sent LR la forma curta de Load Runner). Per tant, qualsevol script que generi es pot dir que està en llenguatge LR. En llenguatge LR, només hi ha un tipus de dades: la cadena (i, més exactament, 'la cadena LR').
Ara, per fer millores en un script VuGen, generalment fem servir llenguatge C.
Sabem que en llenguatge C hi ha molts tipus de dades com int, char, float, long, etc. Si definim i utilitzem directament els valors C en una sol·licitud, VuGen no ho entendrà (ja que només entén les 'cadenes LR') i llançarà un error. Per tant, hem de convertir qualsevol valor C (de qualsevol tipus de dades) a ‘cadena LR’ abans d’utilitzar-lo en una sol·licitud.
Havent entès això, anem a alguns escenaris difícils en temps real.
Escenari 1:Com s'utilitza una cadena C en una sol·licitud VuGen
Suposem que en un script VuGen tenim una sol·licitud que té un camp anomenat 'Nom del pla' (suposem que aquest script és per a alguna aplicació de planificació financera). Durant la gravació, vam introduir el valor com a '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 );
Suposem que volem utilitzar una cadena definida per l'usuari com a nom del pla.
Per tant, hem de declarar i definir una cadena com es mostra a continuació
char sPlanName() = ' MyFinancialPlan ';
El ‘sPlanName’ és una cadena C i, per tant, hem de convertir-la en cadena LR (per utilitzar-la a la sol·licitud).
Ho fem mitjançant la funció 'lr_save_string', tal com es mostra a continuació:
lr_save_string(sPlanName,”LRPlanName”);
Aquesta funció assigna un valor al paràmetre / variable LR. Pren dos atributs: el primer atribut és la font (cadena C) i el segon atribut és la destinació (paràmetre / variable LR).
Per tant, aquesta funció guarda el valor de la variable C que hem definit al paràmetre LR ‘LRPlanName’.
Ara podem substituir el 'LRPlanName' com qualsevol altre paràmetre de la sol·licitud 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 );
Tingueu en compte que quan executem aquest script, tots els Vusers i totes les iteracions prendran el mateix valor que el nom del pla. Per tant, per fer que el nom del pla sigui únic per a cada execució, podem fer alguna cosa així.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Aquí ‘pVuserId’ i ‘pIteration’ són els paràmetres ‘Vuser ID’ i ‘Iteration Number’ (que hem comentat en els tipus de paràmetres dels nostres tutorials anteriors). S’utilitzen al nom del pla per assegurar-nos que tinguem noms únics per a cada usuari i iteració.
El 'Lr_eval_string' La funció retorna la cadena d'entrada després d'avaluar els paràmetres incrustats. Per tant, en aquest cas, la sortida d’aquesta funció serà ‘MyFinancialPlan_1_1’ per a la primera iteració de Vuser, ‘MyFinancialPlan_1_2’ per a la segona iteració de Vuser, etc.
I, per descomptat, sabem què 'Lr_save_string' funció fa.
Ara podem substituir el paràmetre ‘LRPlanName’ tal com es mostra més amunt.
Escenari 2:Com convertir una variable runner de càrrega a C enter
A l’últim tutorial, vam veure un exemple per entendre com passem o fallem manualment una transacció en funció d’una condició.
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 ); }
Hem utilitzat la sentència 'if' aquí amb l'atribut 'SaveCount'. El paràmetre 'WelcomeCount' que desa el nombre d'ocurrències del text no es pot utilitzar directament en la condició 'si', ja que es tracta d'una cadena de corredor de càrrega. Per tant, aquest paràmetre s’ha de convertir primer en cadena C i després en C enter. 'Lr_eval_string' i 'Atoi' s'utilitzen funcions (respectivament) per tenir-ne cura.
El 'Atoi' La funció C converteix una cadena C en un enter C.
Després d'aquesta conversió, es pot utilitzar com qualsevol altre nombre enter C.
Escenari 3:Com s'envia un valor aleatori en una sol·licitud
Molt sovint ens plantegem situacions d’aplicació on hem de seleccionar un valor aleatori (per exemple, des d’un desplegable). Com ho gestionem amb els scripts VuGen? Com ens assegurem que se seleccioni un valor aleatori per a cada iteració? Vegem-ho en detall.
Prenguem l'exemple de la nostra aplicació 'Visites web'. Com hem vist anteriorment, tenim una pàgina 'Cerca vol' on hem de seleccionar un vol.
Suposem que seleccionem el primer de la llista. La sol·licitud corresponent a l'script és així (on es mostra el valor corresponent per al vol seleccionat).
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 );
Primer hem de capturar els valors corresponents per a tots els quatre vols d’una de les respostes anteriors. Ho podem fer mitjançant la funció de correlació (web_reg_save_param) amb l'atribut 'ORD = ALL' abans de la sol·licitud la resposta de la qual tingui aquest valor.
La sortida serà així, quan el paràmetre correlat 'cFlight' té una matriu de quatre valors corresponents als quatre vols.
El següent pas seria seleccionar a l'atzar un d'aquests valors i enviar-lo a la sol·licitud. Això es pot fer mitjançant 'Lr_paramarr_random' funció com es mostra a continuació.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
L'entrada a 'Lr_paramarr_random' La funció és una matriu de paràmetres i la sortida és un valor aleatori d'aquesta matriu. Així doncs, aquí la sortida d’aquesta funció és un dels quatre valors de vol. I com que aquest valor aleatori és una cadena LR, s’utilitza la funció ‘lr_eval_string’ (per convertir-la en cadena C).
'Strcpy' La funció C finalment copia aquest valor en una variable de cadena C 'flightVal'.
Ara de nou hem de convertir aquesta variable de cadena C en cadena LR per poder enviar la sol·licitud.
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 );
Escenari 4:Com es divideix una cadena en fitxes
Suposem que hi ha un escenari en què hem de dividir una cadena en trossos / fitxes. Prenguem l'exemple de la nostra aplicació 'Visites web' a partir del valor del vol 020 ; 338; 04/03/2018 diuen que només hem d’utilitzar ‘338’, llavors hem de dividir aquesta cadena i emmagatzemar-la en una variable.
Fer això 'Strtok' s'utilitza la funció.
'Strtok' La funció C retorna un testimoni d'una cadena delimitada per caràcters especificats. Després de la primera invocació, hem de passar ‘NULL’ com a valor de la cadena per obtenir el següent testimoni. L'exemple següent mostra com s'utilitza aquesta funció per dividir el valor del vol en funció del delimitador de punt i coma (;).
Exemple:
Suposem que el valor del vol es capta a partir de la resposta pertinent al paràmetre '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); }
La sortida d’aquest es pot veure al registre de reproducció.
Podem copiar el testimoni requerit en un paràmetre i utilitzar-lo.
Escenari 5:Com llegir i escriure dades en un fitxer de text
De vegades pot ser necessari llegir dades d'un fitxer extern o escriure dades en un fitxer extern. Vegem com ho fem en un script VuGen.
Vegem primer com llegir les dades d’un fitxer de text.
Exemple: Suposem que hem de llegir un XML des d’un fitxer de dades extern i fer-lo servir com a sol·licitud a l’script.
Per fer-ho, fem servir 'Fread' Funció C.
Aquesta funció té quatre atributs:
memòria intermèdia - El buffer on emmagatzemar el flux de dades.
mida - La mida del buffer.
comptar - El nombre de bytes a llegir.
file_pointer - El punter del fitxer
Exemple de codi (amb comentaris) per al mateix
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
Tingueu en compte que al codi que es mostra anteriorment llegim 500 bytes del fitxer de text. Viouslybviament, potser no sabem sempre la mida del fitxer. Així ho podem utilitzar 'Fseek' i 'Ftell' Funcions C (us ho deixaré explorar) per trobar la mida del fitxer i utilitzar el fitxer 'Comptar' atribut de la 'Fread' funcionar en conseqüència.
Ara veurem com escriure dades en un fitxer de text.
Exemple: Suposem que tenim un script que crea ordres i genera 'orderid'. Si volem conèixer tots els identificadors de comanda creats pel nostre script en una prova, podem fer que el nostre script copiï aquests identificadors de comanda a un fitxer de text extern.
'Fprintf' - La funció C escriu la sortida formatada a un fitxer.
Aquesta funció pren aquests atributs:
file_pointer - El punter del fitxer
format_corda - La cadena formatada per escriure al fitxer.
args - Un o més arguments d'impressió opcionals.
A continuació es mostra l'exemple de codi. Suposem que hem correlacionat i desat 'orderid' al paràmetre '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 */
Esperem que ara estiguem bé amb els conceptes de llegir dades o escriure dades en un fitxer extern (és clar que hi podria haver altres maneres de fer el mateix que el que hem comentat anteriorment). Seria molt útil fer un estudi exhaustiu sobre les operacions de fitxers en C (podeu fer referència a qualsevol bon tutorial o llibre C), ja que són molt necessaris en molts escenaris en temps real.
Escenari 6:Com gestionar la correlació quan els límits canvien
Al tutorial de correlacions, hem utilitzat funcions de correlació basades en límits per capturar els valors dinàmics de la resposta. Però, i si tenim un escenari en què els límits canvien? Hi ha diverses maneres de gestionar aquestes situacions. Vegem-ho en detall.
a) Utilitzant els senyaladors 'IC', 'DIG' i 'ALNUM':
I C - Aquest indicador indica a VuGen que ignori majúscules i minúscules al límit esquerre / dret.
Exemple: Si el límit esquerre de vegades apareix en majúscula i de vegades en minúscula, fem servir aquesta marca.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
VOSTÈ - Aquest indicador indica a VuGen que consideri qualsevol número on s’utilitzi el caràcter salvatge ‘#’ al límit esquerre / dret.
bones pràctiques d'automatització en proves de programari
Exemple: Si el límit esquerre (o el límit dret) canvia així (només un número en una posició determinada).
GJHi3rty
1GJHi8rty
GJHi7rty
Podem utilitzar el senyalador 'DIG' com es mostra a continuació, ja que s'encarregarà del número canviant.
LB / DIG = GJHi # rty
vern - Aquesta bandera indica a VuGen que consideri qualsevol caràcter alfanumèric on el caràcter salvatge '^' s'utilitzi al límit esquerre / dret.
Exemple: Si el límit esquerre (o el límit dret) canvia així (només un caràcter alfanumèric en una posició determinada).
GJHi3rty
GJHiKrty
GJHitrty
Podem utilitzar el senyalador 'ALNUM' com es mostra a continuació, ja que s'encarregarà del caràcter alfanumèric canviant
LB / ALNUM = GJHi ^ rty
A més, podem utilitzar dues marques juntes, com ara 'ALNUMIC', que és 'ALNUM' i 'IC'.
b) Utilització dels atributs 'SaveLen' i 'SaveOffset':
Podem utilitzar aquests dos atributs del 'Web_reg_save_param' funcioni adequadament per introduir només la part estàtica dels límits esquerra / dreta.
c) Utilitzar expressions regulars:
Podem utilitzar 'Web_reg_save_param_regexp' funció de correlació per desar el valor dinàmic (en un paràmetre) que coincideix amb una expressió regular.
Exemple: Diguem que el valor dinàmic que volem capturar és '3959339' del text donat,
PriceControl_ctl01 'Nom = presa', saldo 'Refid = 3959339'
Aquí no podem utilitzar la funció de correlació basada en límits perquè el valor i la longitud del camp, com ara 'Nom', poden canviar (i, per tant, no el podem utilitzar al límit esquerre o dret).
Podem utilitzar el 'Web_reg_save_param_regexp' funció de correlació que es mostra a continuació per solucionar aquest problema.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Els grups d’expressions regulars es posen entre parèntesis i l’atribut ‘Grup’ decideix quin grup s’ha de considerar per desar la coincidència corresponent al paràmetre especificat (al primer atribut).
A continuació es mostren algunes coincidències d’expressions regulars:
d - coincideix amb un sol dígit
w - coincideix amb una sola paraula
(A-Z) +: coincideix amb qualsevol paraula en majúscula
(a-z) +: coincideix amb qualsevol paraula en minúscula
(0-9) +: coincideix amb qualsevol valor numèric
Escenari 7:Com escriure i utilitzar una funció en un script VuGen
Com en qualsevol altre llenguatge de programació, podem escriure / definir una funció manualment (normalment anomenada funció definida per l’usuari) i utilitzar-la en qualsevol lloc de l’escriptura VuGen.
Suposem que hem d’enviar un nom de pla únic a cada sol·licitud d’un script concret. Per tant, en lloc d’escriure el codi requerit (que genera un nom únic) diverses vegades, podem definir una funció (que genera un nom únic) i trucar sempre que sigui necessari (i on sigui) a l’escriptura VuGen.
Tot i que la funció en un script VuGen es pot escriure dins de qualsevol acció, generalment s'escriu dins del fitxer ‘globals.h’ (a la secció Fitxers addicionals de l’escriptura VuGen) o dins d’un fitxer de nova creació (sota la mateixa secció ‘Fitxers addicionals’). Un cop escrita, la funció es pot cridar des de qualsevol (s) Acció (s).
La imatge següent mostra una funció definida per l'usuari 'MyFunction' escrita dins del fitxer 'globals.h'.
Com s'ha comentat anteriorment, l'altra manera és crear un fitxer nou i escriure la funció al seu interior.
L’únic que cal recordar quan es crea un fitxer nou és que l’hem d’incloure al fitxer ‘globals.h’ (sense el qual VuGen no reconeixerà aquest fitxer).
Conclusió
Així, en aquest tutorial, vam veure com gestionar alguns desafiaments en temps real en les seqüències d’ordres de VuGen i evidentment ens trobaríem amb molts altres escenaris quan treballem en diverses aplicacions.
A més, us haureu adonat que les funcions de cadena C i les operacions de fitxers C són molt necessàries (i útils) per gestionar diversos escenaris. Tanmateix, us recomanaria que dediqueu un temps a dominar-los.
Al nostre següent tutorial, veurem i comprendreem algunes funcions predefinides importants que s’utilitzen en els scripts VuGen (ja hem vist algunes de les funcions).
=> Visiteu aquí per obtenir una sèrie completa de tutorials de LoadRunner
Lectura recomanada
- Proves de rendiment dels serveis web mitjançant LoadRunner VuGen Scripting
- Scripts avançats de Shell Unix: matrius, operadors de proves de fitxers i cadenes, variables especials
- Prova de càrrega amb tutorials HP LoadRunner
- Opcions de gravació de VUGen a LoadRunner
- Com configurar els fitxers de scripts de LoadRunner VuGen i la configuració del temps d'execució
- Funcions importants de LoadRunner utilitzades en scripts VuGen amb exemples
- Introducció a Micro Focus LoadRunner: proves de càrrega amb LoadRunner Tutorial # 1
- JMeter BeanShell Scripting Part 2