loadrunner vugen scripting challenges
Uvod u izazove uključene u LoadRunner VuGen Scripting:
U ovome Informativna serija treninga LoadRunner , istraživali smo o Poboljšanja skripte VuGen u našem prethodnom vodiču. Od naših ranijih vodiča do sada, postigli smo veliki napredak s VuGenom.
Naučili smo kako snimati skriptu u web HTTP / HTML protokol, kako se brinuti o podacima / vrijednostima uz korelaciju i parametrizaciju, kako osigurati je li odgovor točan s kontrolnim točkama, kako umetnuti transakcije koje mjere brzinu i vrijeme odziva korisnika radnje i druge stvari.
Pomoću njih mogli bismo uspješno stvoriti skripte za gotovo sve web aplikacije.
=> Kliknite ovdje za kompletnu seriju vodiča za LoadRunner
LR jezik
Možda postoje situacije u kojima trebamo raditi zahtjevnije zadatke u VuGen skripti. U ovom uputstvu razgovarat ćemo o nekim izazovima skriptiranja, zajedno s tehnikama dostupnim za njihovo rješavanje.
Prije rasprave o njima, shvatimo nekoliko stvari. VuGen (ili Load Runner) može razumjeti samo svoj jezik (nazovimo ga kao LR jezik, LR je kratki oblik Load Runnera). Dakle, za bilo koju skriptu koju generira može se reći da je na jeziku LR. U LR jeziku postoji samo jedan tip podataka - String (i preciznije ‘LR String’).
Sada, da bismo poboljšali VuGen skriptu, obično koristimo jezik C.
Znamo da u jeziku C postoji mnogo vrsta podataka poput int, char, float, long itd. Ako izravno definiramo i koristimo vrijednosti C u zahtjevu, VuGen neće razumjeti (jer razumije samo 'LR nizove') i bacit će greška. Dakle, moramo pretvoriti bilo koju vrijednost C (bilo koje vrste podataka) u 'LR string' prije nego što je upotrijebimo u zahtjevu.
Shvativši to, prijeđimo na neke izazovne scenarije u stvarnom vremenu.
Scenarij 1:Kako koristiti C niz u VuGen zahtjevu
Pretpostavimo da u VuGen skripti imamo zahtjev koji ima polje pod nazivom ‘PlanName’ (pretpostavimo da je ova skripta za neku aplikaciju financijskog planiranja). Tijekom snimanja unijeli smo vrijednost kao '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 );
Recimo da kao naziv plana želimo koristiti korisnički definirani niz.
Dakle, moramo deklarirati i definirati niz kao što je prikazano dolje
char sPlanName[] = ' MyFinancialPlan ';
'SPlanName' je C niz i stoga ga moramo pretvoriti u LR niz (da bismo ga koristili u zahtjevu).
To radimo pomoću funkcije 'lr_save_string' kako je prikazano dolje:
lr_save_string(sPlanName,”LRPlanName”);
Ova funkcija dodjeljuje vrijednost parametru / varijabli LR. Potrebna su dva atributa - prvi atribut je izvor (C niz), a drugi atribut je odredište (LR parametar / varijabla).
Dakle, ova funkcija sprema vrijednost varijable C koju smo definirali u LR parametar 'LRPlanName'.
Sada 'LRPlanName' možemo zamijeniti kao bilo koji drugi parametar u VuGen zahtjevu.
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 );
Imajte na umu da će, kada pokrenemo ovu skriptu, svi Vuseri i sve iteracije dobiti istu vrijednost kao i naziv plana. Dakle, kako bismo ime plana učinili jedinstvenim za svaku izvedbu, možemo učiniti nešto poput ovog.
char sPlanName[] = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Ovdje su „pVuserId“ i „pIteration“ parametri „Vuser ID“ i „Iteration Number“ (o kojima smo govorili u tipovima parametara u našim prethodnim vodičima). Oni se koriste u nazivu plana kako bi se osiguralo da imamo jedinstvena imena za svaki Vuser i iteraciju.
The ‘Lr_eval_string’ funkcija vraća ulazni niz nakon procjene bilo kakvih ugrađenih parametara. Dakle, u ovom će slučaju izlaz ove funkcije biti 'MyFinancialPlan_1_1' za prvu Vuserovu prvu iteraciju, 'MyFinancialPlan_1_2' za prvu Vuserovu drugu iteraciju i tako dalje.
I naravno, znamo što 'Lr_save_string' funkcija radi.
Sada možemo zamijeniti parametar 'LRPlanName' kao što je prikazano gore.
Scenarij 2:Kako pretvoriti varijablu pokretača opterećenja u C cijeli broj
U posljednjem uputstvu vidjeli smo primjer kako bismo razumjeli kako ručno prosljeđujemo ili propuštamo transakciju ovisno o stanju.
Primjer:
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 ); }
Ovdje smo upotrijebili izraz 'if' s atributom 'SaveCount'. Parametar 'WelcomeCount' koji sprema broj pojavljivanja teksta ne može se izravno upotrijebiti u stanju 'if', jer je niz pokretačkog programa za učitavanje. Dakle, ovaj parametar mora se prvo pretvoriti u C niz, a zatim u C cijeli broj. ‘Lr_eval_string’ i 'Atoi' za to se koriste funkcije (odnosno).
The 'Atoi' C funkcija pretvara C niz u C cijeli broj.
Nakon ove pretvorbe, ovo se može koristiti kao i bilo koji drugi C cijeli broj.
Scenarij 3:Kako poslati slučajnu vrijednost u zahtjevu
Vrlo često nailazimo na scenarije aplikacija gdje moramo odabrati slučajnu vrijednost (recimo s padajućeg izbornika). Kako to rješavamo u VuGen skriptama? Kako osiguravamo odabir slučajne vrijednosti za svaku iteraciju? Da vidimo ovo detaljno.
Uzmimo primjer naše aplikacije ‘Web Tours’. Kao što smo ranije vidjeli, imamo stranicu ‘Pronađi let’ na kojoj moramo odabrati let.
Recimo da smo odabrali prvu na popisu. Odgovarajući zahtjev u skripti je ovakav (gdje je odabrana odgovarajuća vrijednost za let).
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 );
Prvo moramo uhvatiti odgovarajuće vrijednosti za sva četiri leta iz jednog od prethodnih odgovora. To možemo učiniti pomoću funkcije korelacije (web_reg_save_param) s atributom 'ORD = ALL' prije zahtjeva čiji odgovor ima tu vrijednost.
Rezultat će biti ovakav, gdje korelirani parametar 'cFlight' ima niz od četiri vrijednosti koje odgovaraju četiri leta.
Sljedeći korak bio bi slučajnim odabirom jedne od ovih vrijednosti i predajom u zahtjevu. To se može učiniti pomoću ‘Lr_paramarr_random’ funkcija kao što je prikazano u nastavku.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Ulaz u ‘Lr_paramarr_random’ funkcija je niz parametara, a izlaz je slučajna vrijednost iz ovog polja. Dakle, ovdje je izlaz ove funkcije jedna od četiri vrijednosti leta. A kako je ova slučajna vrijednost LR niz, koristi se funkcija 'lr_eval_string' (za pretvaranje iste u C niz).
'Strcpy' C funkcija konačno kopira ovu vrijednost u varijablu C niza 'flightVal'.
Sada opet moramo pretvoriti ovu varijablu C Stringa u LR niz da bismo mogli poslati zahtjev.
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 );
Scenarij 4:Kako podijeliti niz u žetone
Recimo da postoji scenarij u kojem moramo podijeliti niz na dijelove / žetone. Uzmimo primjer iz naše aplikacije 'Web Tours', od vrijednosti leta 020 ; 338; 03.03.2018. Kažu da moramo koristiti samo ‘338’, onda moramo podijeliti ovaj niz i spremiti ga u varijablu.
Uraditi ovo ‘Strtok’ koristi se funkcija.
'Strtok' C funkcija vraća token iz niza razgraničenog navedenim znakovima. Nakon prvog pozivanja, moramo proslijediti ‘NULL’ kao vrijednost niza da bismo dobili sljedeći token. Primjer u nastavku pokazuje kako se ova funkcija koristi za razdvajanje vrijednosti leta na temelju razgraničenja sa zarezom (;).
Primjer:
Pretpostavimo da se vrijednost leta bilježi iz relevantnog odgovora u parametar '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); }
Rezultat toga može se vidjeti u zapisniku ponovnog prikazivanja.
Traženi token možemo kopirati u parametar i koristiti ga.
Scenarij 5:Kako pročitati podatke i zapisati podatke u tekstualnu datoteku
Ponekad će biti potrebno pročitati podatke iz vanjske datoteke ili zapisati podatke u vanjsku datoteku. Pogledajmo kako to radimo u VuGen skripti.
Prvo da vidimo kako čitati podatke iz tekstualne datoteke.
Primjer: Recimo da moramo pročitati XML iz vanjske podatkovne datoteke i koristiti ga kao zahtjev u skripti.
Da bismo to učinili, koristimo ‘Fread’ C funkcija.
Ova funkcija ima četiri atributa:
pufer - Me uspremnik u kojem će se pohraniti tok podataka.
veličina - Veličina međuspremnika.
računati - Broj bajtova za čitanje.
pokazivač_datoteke - pokazivač datoteke
Primjer koda (s komentarima) za isti
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
Imajte na umu da u kodu prikazanom gore čitamo 500 bajtova iz tekstualne datoteke. Očito, možda ne znamo veličinu datoteke uvijek. Tako da možemo koristiti 'Fseek' i 'Ftell' C funkcije (ovo ću vam ostaviti da istražite) kako biste pronašli veličinu datoteke i koristili 'računati' atribut ‘Fread’ funkcioniraju u skladu s tim.
Sada ćemo vidjeti kako zapisati podatke u tekstualnu datoteku.
Primjer: Recimo da imamo skriptu koja stvara narudžbe i generira 'orderid'. Ako želimo znati sve ID-ove redoslijeda stvorene našom skriptom u testu, možemo natjerati našu skriptu da kopira te ID-ove naloga u vanjsku tekstualnu datoteku.
'Fprintf' - C funkcija zapisuje formatirani izlaz u datoteku.
Ova funkcija uzima ove atribute:
pokazivač_datoteke - pokazivač datoteke
string_format - Formatirani niz za pisanje u datoteku.
svađe - Jedan ili više neobaveznih argumenata za ispis.
Primjer koda prikazan je u nastavku. Pretpostavimo da smo korelirali i spremili 'orderid' u parametar 'cOrderId'.
Primjer:
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 */
Nadamo se da smo sada dobri s konceptima čitanja podataka ili zapisivanja podataka u vanjsku datoteku (naravno da bi mogli postojati i drugi načini da se učini isto, osim onoga o čemu smo gore raspravljali). Bilo bi vrlo korisno temeljito proučiti rad s datotekama na C-u (možete se obratiti bilo kojim dobrim C vodičima ili knjigama) jer su oni itekako potrebni u mnogim scenarijima u stvarnom vremenu.
Scenarij 6:Kako postupati s korelacijom kada se granice mijenjaju
U vodiču za korelacije koristili smo funkcije korelacije na temelju granica kako bismo uhvatili dinamičke vrijednosti iz odgovora. Ali, što ako imamo scenarij u kojem se granice mijenjaju? Postoji nekoliko načina rješavanja takvih situacija. Pogledajmo ih detaljno.
a) Korištenjem oznaka 'IC', 'DIG' i 'ALNUM':
IC - Ova zastavica upućuje VuGena da zanemari slučaj na lijevoj / desnoj granici.
Primjer: Ako je lijeva granica ponekad velika, a ponekad mala, koristimo ovu zastavicu.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
TI - Ova zastavica upućuje VuGen da razmotri bilo koji pojedinačni broj gdje se divlji znak '#' koristi na lijevoj / desnoj granici.
što je vrsta datoteke swf
Primjer: Ako se lijeva granica (ili desna granica) mijenja ovako (samo jedan broj na određenom položaju).
GJHi3rty
1GJHi8rty
GJHi7rty
Možemo upotrijebiti zastavicu 'DIG' kako je prikazano u nastavku jer će se to pobrinuti za promjenu broja.
LB / DIG = GJHi # rty
Joha - Ova zastava upućuje VuGen da razmotri bilo koji alfanumerički znak gdje se divlji znak '^' koristi na lijevoj / desnoj granici.
Primjer: Ako se ovako mijenja lijeva granica (ili desna granica) (samo jedan alfanumerički znak na određenom položaju).
GJHi3rty
GJHiKrty
GJHitrty
Možemo upotrijebiti zastavicu 'ALNUM' kako je prikazano u nastavku jer će se to pobrinuti za promjenu alfanumeričkog znaka
LB / ALNUM = GJHi ^ rt
Također, možemo zajedno koristiti dvije zastavice - poput 'ALNUMIC' što je i 'ALNUM' i 'IC'.
b) Korištenje atributa 'SaveLen' i 'SaveOffset':
Možemo koristiti ova dva atributa ‘Web_reg_save_param’ funkcionira na odgovarajući način da unese samo statički dio lijeve / desne granice.
c) Upotreba regularnih izraza:
Možemo koristiti ‘Web_reg_save_param_regexp’ korelacijska funkcija za spremanje dinamičke vrijednosti (u parametar) koja odgovara regularnom izrazu.
Primjer: Recimo da je dinamička vrijednost koju želimo zabilježiti '3959339' iz zadanog teksta,
PriceControl_ctl01 “Ime = priključak”, stanje “Refid = 3959339”
Ovdje ne možemo koristiti funkciju korelacije na temelju granica, jer se vrijednost i duljina polja poput gore navedenog 'Ime' mogu promijeniti (pa je ne možemo koristiti na lijevoj ili desnoj granici).
Možemo koristiti ‘Web_reg_save_param_regexp’ korelacijska funkcija kako je prikazano u nastavku kako bi se riješio ovaj problem.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=([a-z]+)', 'Refid=([0-9]+)' balance', 'Group=1','Ordinal=All', LAST);
Grupe regularnih izraza stavljaju se u zagrade, a atribut ‘Group’ odlučuje koju će grupu uzeti u obzir za spremanje odgovarajućeg podudaranja navedenom parametru (u prvom atributu).
U nastavku je prikazano nekoliko podudaranja regularnih izraza:
d - odgovara jednoznamenkastoj
w - odgovara jednoj riječi
[A-Z] + - podudara se s bilo kojom riječju velikim slovom
[a-z] + - podudara se s bilo kojom riječju malim slovom
[0-9] + - odgovara bilo kojoj numeričkoj vrijednosti
Scenarij 7:Kako napisati i koristiti funkciju u VuGen skripti
Kao i u bilo kojem drugom programskom jeziku, funkciju možemo pisati / definirati ručno (obično se naziva korisnički definirana funkcija) i koristiti je bilo gdje u VuGen skripti.
Pretpostavimo da u svakom zahtjevu određene skripte moramo poslati jedinstveni naziv plana. Dakle, umjesto da više puta napišemo traženi kod (koji generira jedinstveno ime), možemo definirati funkciju (koja generira jedinstveno ime) i pozvati kad god (i gdje god) to bude potrebno u skripti VuGen.
Iako se funkcija u VuGen skripti može zapisati unutar bilo koje radnje, ona je obično napisana unutar ‘Globals.h’ datoteku (u odjeljku Dodatne datoteke skripte VuGen) ili unutar novostvorene datoteke (u istom odjeljku 'Dodatne datoteke'). Jednom napisana, funkcija se može pozvati iz bilo koje radnje.
Na slici ispod prikazana je korisnički definirana funkcija 'MyFunction' napisana unutar datoteke 'globals.h'.
Kao što je gore spomenuto, drugi je način stvoriti novu datoteku i zapisati funkciju u nju.
Jedino što treba imati na umu prilikom stvaranja nove datoteke je da je moramo uključiti u datoteku ‘globals.h’ (bez koje VuGen neće prepoznati ovu datoteku).
Zaključak
Stoga smo u ovom vodiču vidjeli kako se nositi s nekim izazovima u stvarnom vremenu u VuGen skriptiranju i očito bismo naišli na mnoge druge scenarije kada radimo na raznim aplikacijama.
Također, shvatili biste da su funkcije C niza i operacije C datoteka itekako potrebne (i korisne) za rukovanje raznim scenarijima. Međutim, preporučio bih vam da malo vremena savladate.
U sljedećem uputstvu vidjet ćemo i razumjeti neke važne unaprijed definirane funkcije koje se koriste u VuGen skriptama (neke smo funkcije već vidjeli).
=> Posjetite ovdje za kompletnu seriju vodiča za LoadRunner
Preporučena literatura
- Testiranje izvedbe web usluga pomoću LoadRunner VuGen skriptiranja
- Napredno skriptiranje ljuske Unixa: nizovi, operateri ispitivanja datoteka i nizova, posebne varijable
- Ispitivanje opterećenja pomoću HP LoadRunner vodiča
- VUGen opcije snimanja u LoadRunneru
- Kako postaviti datoteke skripti LoadRunner VuGen i postavke runtimea
- Važne funkcije LoadRunner koje se koriste u VuGen skriptama s primjerima
- Uvod u Micro Focus LoadRunner - Ispitivanje opterećenja pomoću vodiča br. 1 za LoadRunner
- JMeter BeanShell Scripting 2. dio