loadrunner vugen scripting challenges
Introducere în provocările implicate în LoadRunner VuGen Scripting:
In acest Seria informativă LoadRunner Training , am explorat despre Îmbunătățiri ale scriptului VuGen în tutorialul nostru anterior. De la tutorialele noastre anterioare până acum, am făcut progrese mari cu VuGen.
Am învățat cum să înregistrăm un script în protocolul HTTP HTTP / HTML, cum să avem grijă de date / valori cu corelație și parametrizare, cum să ne asigurăm dacă răspunsul este corect cu punctele de control, cum să introducem tranzacții care măsoară rata și timpul de răspuns al utilizatorului acțiuni și alte lucruri.
Cu acestea, ar trebui să putem crea cu succes scripturi pentru aproape toate aplicațiile web.
=> Faceți clic aici pentru o serie completă de tutoriale LoadRunner
Limbajul LR
Pot exista situații în care trebuie să facem sarcini mai provocatoare într-un script VuGen. În acest tutorial, vom discuta despre unele dintre provocările de scripting împreună cu tehnicile disponibile pentru a le gestiona.
Înainte de a discuta despre acestea, să înțelegem câteva lucruri. VuGen (sau Load Runner) nu poate înțelege decât propria sa limbă (să numim aceasta ca limbaj LR, LR fiind forma scurtă a Load Runner). Deci, orice script generat se poate spune că este în limbaj LR. În limbajul LR, există un singur tip de date - String (și mai exact „LR String”).
Acum, pentru a face îmbunătățiri într-un script VuGen, folosim în general limbajul C.
Știm că în limbajul C există multe tipuri de date precum int, char, float, long etc. Dacă definim și folosim direct valorile C într-o cerere, VuGen nu va înțelege (deoarece înțelege doar „șirurile LR”) și va arunca o eroare. Deci, trebuie să convertim orice valoare C (de orice tip de date) în „șir LR” înainte de a o utiliza într-o cerere.
După ce am înțeles acest lucru, să mergem la câteva scenarii provocatoare în timp real.
Scenariul 1:Cum se folosește un șir C într-o solicitare VuGen
Să presupunem că, într-un script VuGen, avem o cerere care are un câmp numit „PlanName” (presupunem că acest script este destinat unor aplicații de planificare financiară). În timpul înregistrării, am introdus valoarea ca „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 );
Să presupunem că vrem să folosim un șir definit de utilizator ca nume de plan.
Deci, trebuie să declarăm și să definim un șir așa cum se arată mai jos
char sPlanName[] = ' MyFinancialPlan ';
„SPlanName” este un șir C și, prin urmare, trebuie să-l convertim în șir LR (pentru al utiliza în cerere).
Facem acest lucru folosind funcția „lr_save_string”, așa cum se arată mai jos:
lr_save_string(sPlanName,”LRPlanName”);
Această funcție atribuie o valoare parametrului / variabilei LR. Este nevoie de două atribute - Primul atribut este sursa (C String) și al doilea atribut este destinația (parametru LR / variabilă).
Deci, această funcție salvează valoarea variabilei C pe care am definit-o în parametrul LR „LRPlanName”.
Acum putem înlocui „LRPlanName” ca orice alt parametru din solicitarea 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 );
Rețineți că, atunci când rulăm acest script, toate versiunile și toate iterațiile vor lua aceeași valoare ca și numele planului. Deci, pentru a face numele planului unic pentru fiecare rulare, putem face așa ceva.
char sPlanName[] = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Aici ‘pVuserId’ și ‘pIteration’ sunt parametrii ‘Vuser ID’ și ‘Iteration Number’ (pe care le-am discutat în tipurile de parametri din tutorialele noastre anterioare). Acestea sunt utilizate în numele planului pentru a ne asigura că avem nume unice pentru fiecare Vuser și iterație.
„Lr_eval_string” funcția returnează șirul de intrare după evaluarea parametrilor încorporați. Deci, în acest caz, ieșirea acestei funcții va fi „MyFinancialPlan_1_1” pentru prima iterație Vuser, „MyFinancialPlan_1_2” pentru prima iterație Vuser și așa mai departe.
Și, desigur, știm ce „Lr_save_string” funcția nu.
Acum putem înlocui parametrul „LRPlanName” așa cum se arată mai sus.
Scenariul 2:Cum se convertește o variabilă de încărcare în întreg C
În ultimul tutorial, am văzut un exemplu pentru a înțelege cum trecem sau eșuăm manual o tranzacție în funcție de o condiție.
Exemplu:
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 ); }
Am folosit aici declarația „if” cu atributul „SaveCount”. Parametrul „WelcomeCount” care salvează numărul de apariții al textului nu poate fi utilizat direct în condiția „dacă”, deoarece este un șir de alergare de încărcare. Deci, acest parametru trebuie mai întâi convertit în șir C și apoi în C întreg. „Lr_eval_string” și „Atoi” funcțiile sunt utilizate (respectiv) pentru a avea grijă de acest lucru.
„Atoi” Funcția C convertește un șir C într-un număr întreg C.
După această conversie, aceasta poate fi utilizată ca orice alt număr întreg C.
Scenariul 3:Cum se trimite o valoare aleatorie într-o cerere
Foarte des întâlnim scenarii de aplicație în care trebuie să selectăm o valoare aleatorie (să zicem dintr-o listă derulantă). Cum ne descurcăm în scripturile VuGen? Cum ne asigurăm că valoarea aleatorie este selectată pentru fiecare iterație? Să vedem acest lucru în detaliu.
Să luăm exemplul aplicației noastre „Tururi web”. După cum am văzut mai devreme, avem o pagină „Găsiți zborul” în care trebuie să selectăm un zbor.
Să presupunem că îl selectăm pe primul din listă. Cererea corespunzătoare din script este astfel (în cazul în care valoarea corespunzătoare pentru zborul selectat).
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 );
Mai întâi trebuie să captăm valorile corespunzătoare pentru toate cele patru zboruri dintr-unul din răspunsurile anterioare. Putem face acest lucru folosind funcția de corelație (web_reg_save_param) cu atributul „ORD = ALL” înainte de cererea al cărei răspuns are această valoare.
Rezultatul va fi astfel, în cazul în care parametrul corelat „cFlight” are o matrice de patru valori corespunzătoare celor patru zboruri.
Următorul pas ar fi selectarea aleatorie a uneia dintre aceste valori și trimiterea în cerere. Acest lucru se poate face folosind „Lr_paramarr_random” funcționează așa cum se arată mai jos.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Intrarea în „Lr_paramarr_random” funcția este o matrice de parametri și ieșirea este o valoare aleatorie din această matrice. Deci aici ieșirea acestei funcții este una dintre cele patru valori de zbor. Și întrucât această valoare aleatorie este un șir LR, se folosește funcția ‘lr_eval_string’ (pentru a converti același lucru în șir C).
„Strcpy” Funcția C copiază în cele din urmă această valoare într-o variabilă de șir C „flightVal”.
Acum, din nou, trebuie să convertim această variabilă C String în șir LR pentru a putea trimite cererea.
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 );
Scenariul 4:Cum să împărțiți un șir în jetoane
Să presupunem că există un scenariu în care trebuie să împărțim un șir în bucăți / jetoane. Să luăm exemplul din aplicația noastră „Web Tours”, din valoarea zborului 020 ; 338; 04/03/2018 spun că trebuie să folosim doar „338”, atunci trebuie să împărțim acest șir și să-l stocăm într-o variabilă.
Pentru a face acest lucru ‘Strtok’ este utilizată funcția.
„Strtok” Funcția C returnează un token dintr-un șir delimitat de caractere specificate. După prima invocație, trebuie să trecem „NULL” ca valoare a șirului pentru a obține următorul simbol. Exemplul de mai jos arată cum se utilizează această funcție pentru a împărți valoarea zborului pe baza delimitatorului punct și virgulă (;).
Exemplu:
Să presupunem că valoarea zborului este capturată din răspunsul relevant în parametrul „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); }
Rezultatul poate fi văzut în jurnalul de redare.
Putem copia simbolul necesar într-un parametru și îl putem folosi.
Scenariul 5:Cum se citesc date și se scriu date într-un fișier text
Uneori poate fi necesar să citiți date dintr-un fișier extern sau să scrieți date într-un fișier extern. Să vedem cum facem acest lucru într-un script VuGen.
Să vedem mai întâi cum să citim date dintr-un fișier text.
Exemplu: Să presupunem că trebuie să citim un XML dintr-un fișier de date extern și să-l folosim ca o cerere în script.
Pentru a face acest lucru, folosim „Fread” Funcția C.
Această funcție are patru atribute:
tampon - Tamponul în care să stocați fluxul de date.
mărimea - Dimensiunea bufferului.
numara - Numărul de octeți de citit.
file_pointer - Pointerul fișierului
Exemplu de cod (cu comentarii) pentru același lucru
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
Rețineți că în codul de mai sus, citim 500 de octeți din fișierul text. Evident, este posibil să nu știm întotdeauna dimensiunea fișierului. Deci putem folosi „Fseek” și 'Ftell' Funcțiile C (vă voi lăsa să le explorați) pentru a găsi dimensiunea fișierului și a utiliza fișierul 'numara' atribut al „Fread” funcționează în consecință.
Acum să vedem cum să scriem date într-un fișier text.
Exemplu: Să presupunem că avem un script care creează ordine și generează „orderid”. Dacă dorim să cunoaștem toate ID-urile de comandă create de scriptul nostru într-un test, putem face ca scriptul nostru să copieze aceste ID-uri de ordine într-un fișier text extern.
„Fprintf” - Funcția C scrie ieșirea formatată într-un fișier.
Această funcție ia aceste atribute:
file_pointer - Pointerul fișierului
format_string - Șirul formatat pentru a scrie în fișier.
argumente - Unul sau mai multe argumente opționale de tipărire.
Exemplul de cod este prezentat mai jos. Să presupunem că am corelat și salvat „orderid” în parametrul „cOrderId”.
Exemplu:
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 */
Sper că acum suntem buni cu conceptele de citire sau scriere de date într-un fișier extern (desigur, ar putea exista și alte modalități de a face același lucru decât ceea ce am discutat mai sus). Ar fi foarte util să faceți un studiu amănunțit despre operațiile de fișiere în C (puteți consulta orice tutoriale sau cărți C bune), deoarece acestea sunt foarte necesare în multe scenarii în timp real.
Scenariul 6:Cum să gestionăm corelația atunci când limitele se schimbă
În tutorialul Corelații, am folosit funcții de corelație bazate pe limite pentru a capta valorile dinamice din răspuns. Dar, dacă avem un scenariu în care limitele se schimbă? Există mai multe modalități de gestionare a acestor situații. Să le vedem în detaliu.
a) Utilizarea steagurilor „IC”, „DIG” și „ALNUM”:
IC - Acest steag instruiește VuGen să ignore cazurile în limita stânga / dreapta.
Exemplu: Dacă Limita Stângă este uneori cu majuscule și alteori cu litere mici, vom folosi acest semnal.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
TU - Acest indicator indică VuGen să ia în considerare orice număr unic în care caracterul sălbatic „#” este utilizat în limita stânga / dreapta.
care este abordarea dvs. în timpul testării aplicațiilor mobile
Exemplu: Dacă limita stângă (sau limita dreaptă) se schimbă astfel (doar un număr la o anumită poziție).
GJHi3rty
1GJHi8rty
GJHi7rty
Putem folosi steagul „DIG” așa cum se arată mai jos, deoarece acesta se va ocupa de numărul modificat.
LB / DIG = GJHi # rty
arin - Acest steag instruiește VuGen să ia în considerare orice caracter alfanumeric în care caracterul sălbatic „^” este utilizat în limita stânga / dreapta.
Exemplu: Dacă limita stângă (sau limita dreaptă) se schimbă astfel (doar un caracter alfanumeric la o anumită poziție).
GJHi3rty
GJHiKrty
GJHitrty
Putem utiliza semnalul „ALNUM” așa cum se arată mai jos, deoarece va avea grijă de caracterul alfanumeric în schimbare
LB / ALNUM = GJHi ^ rty
De asemenea, putem folosi două steaguri împreună - cum ar fi „ALNUMIC”, care este atât „ALNUM”, cât și „IC”.
b) Utilizarea atributelor „SaveLen” și „SaveOffset”:
Putem folosi aceste două atribute ale „Web_reg_save_param” funcționează corespunzător pentru a introduce doar porțiunea statică a limitelor stânga / dreapta.
c) Folosirea expresiilor regulate:
Putem folosi „Web_reg_save_param_regexp” funcție de corelație pentru a salva valoarea dinamică (într-un parametru) care se potrivește cu o expresie regulată.
Exemplu: Să presupunem că valoarea dinamică pe care dorim să o captăm este „3959339” din textul dat,
PriceControl_ctl01 „Nume = jack”, sold „Refid = 3959339”
Nu putem folosi funcția de corelație bazată pe limite, deoarece valoarea și lungimea câmpului, cum ar fi „Nume” de mai sus, se pot schimba (și, prin urmare, nu o putem folosi în limita stângă sau dreaptă).
Putem folosi „Web_reg_save_param_regexp” funcția de corelație așa cum se arată mai jos pentru a rezolva această problemă.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=([a-z]+)', 'Refid=([0-9]+)' balance', 'Group=1','Ordinal=All', LAST);
Grupurile de expresie regulată sunt puse între paranteze și atributul „Grup” decide ce grup să ia în considerare pentru salvarea potrivirii corespunzătoare la parametrul specificat (în primul atribut).
Câteva potriviri de expresii regulate sunt prezentate mai jos:
d - se potrivește cu o singură cifră
w - se potrivește cu un singur cuvânt
[A-Z] + - se potrivește cu orice cuvânt cu majuscule
[a-z] + - se potrivește cu orice cuvânt cu litere mici
[0-9] + - se potrivește cu orice valoare numerică
Scenariul 7:Cum se scrie și se folosește o funcție într-un script VuGen
Ca în orice alt limbaj de programare, putem scrie / defini manual o funcție (denumită de obicei funcție definită de utilizator) și o putem folosi oriunde în scriptul VuGen.
Să presupunem că trebuie să trimitem un nume de plan unic în fiecare solicitare a unui anumit script. Deci, în loc să scriem codul necesar (care generează un nume unic) de mai multe ori, putem defini o funcție (care generează un nume unic) și putem apela ori de câte ori (și oriunde) este necesară în scriptul VuGen.
Deși funcția într-un script VuGen poate fi scrisă în orice acțiune, este scrisă în general în „Globals.h” (sub secțiunea Extra Files din scriptul VuGen) sau în interiorul unui fișier nou creat (sub aceeași secțiune „Extra Files”). Odată scrisă, funcția poate fi apelată din orice acțiune.
Imaginea de mai jos arată o funcție definită de utilizator „MyFunction” scrisă în fișierul „globals.h”.
După cum sa discutat mai sus, cealaltă modalitate este de a crea un fișier nou și de a scrie funcția în interiorul acestuia.
Singurul lucru de reținut atunci când creăm un fișier nou este că trebuie să îl includem în fișierul „globals.h” (fără de care VuGen nu va recunoaște acest fișier).
Concluzie
Astfel, în acest tutorial, am văzut cum să facem față unor provocări în timp real în scripturile VuGen și, evident, am întâlni multe alte scenarii atunci când lucrăm la diferite aplicații.
De asemenea, v-ați fi dat seama că funcțiile șirului C și operațiile fișierului C sunt foarte necesare (și utile) în gestionarea diferitelor scenarii. Cu toate acestea, v-aș recomanda să petreceți ceva timp stăpânindu-le.
În următorul nostru tutorial, vom vedea și vom înțelege câteva funcții predefinite importante care sunt utilizate în scripturile VuGen (am văzut deja unele dintre funcții).
=> Vizitați aici pentru o serie completă de tutoriale LoadRunner
Lectură recomandată
- Servicii Web Testarea performanței utilizând LoadRunner VuGen Scripting
- Script avansat Unix Shell: matrici, operatori de testare a fișierelor și șirurilor, variabile speciale
- Testarea încărcării cu tutoriale HP LoadRunner
- Opțiuni de înregistrare VUGen în LoadRunner
- Cum se configurează LoadRunner VuGen Script Files și Runtime Settings
- Funcții importante LoadRunner utilizate în scripturile VuGen cu exemple
- Introducere în Micro Focus LoadRunner - Testarea încărcării cu LoadRunner Tutorial # 1
- JMeter BeanShell Scripting Partea 2