loadrunner vugen scripting challenges
Uvod v izzive, povezane s skriptom LoadRunner VuGen:
V tem Informativna serija treningov LoadRunner , smo raziskovali o Izboljšave skripta VuGen v naši prejšnji vadnici. Od naših prejšnjih vadnic do zdaj smo z VuGenom naredili velik napredek.
Naučili smo se, kako zapisati skript v spletni protokol HTTP / HTML, kako skrbeti za podatke / vrednosti s korelacijo in parametrizacijo, kako zagotoviti, da je odziv pravilen s kontrolnimi točkami, kako vstaviti transakcije, ki merijo hitrost in odzivni čas uporabnika dejanja in druge stvari.
S temi bi morali biti sposobni uspešno ustvarjati skripte za skoraj vse spletne aplikacije.
=> Kliknite tukaj za celotno serijo vadnic LoadRunner
Jezik LR
V nekaterih situacijah moramo izvesti zahtevnejše naloge v skriptu VuGen. V tej vadnici bomo razpravljali o nekaterih skriptnih izzivih skupaj s tehnikami, ki so na voljo za njihovo reševanje.
Preden se o njih pogovorimo, razumemo nekaj stvari. VuGen (ali Load Runner) lahko razume samo svoj jezik (poimenujmo ga kot jezik LR, LR je kratka oblika Load Runner). Torej, za katerikoli skript, ki ga ustvari, lahko rečemo, da je v jeziku LR. V jeziku LR obstaja samo en podatkovni tip - String (in natančneje 'LR String').
Zdaj za izboljšanje v skriptu VuGen običajno uporabljamo jezik C.
Vemo, da je v jeziku C veliko vrst podatkov, kot so int, char, float, long itd. Če v zahtevi neposredno definiramo in uporabimo vrednosti C, VuGen ne bo razumel (saj razume le 'LR string') in bo vrgel napaka. Torej moramo katero koli vrednost C (katere koli podatkovne vrste) pretvoriti v 'LR string', preden jo uporabimo v zahtevi.
Ko smo to razumeli, pojdimo na nekaj izzivnih scenarijev v realnem času.
1. scenarij:Kako uporabiti niz C v zahtevi VuGen
Predpostavimo, da imamo v skriptu VuGen zahtevo, ki ima polje, imenovano 'ImeNačrta' (predpostavimo, da je ta skript namenjen neki aplikaciji za finančno načrtovanje). Med snemanjem smo vrednost vnesli kot »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 želimo kot ime načrta uporabiti uporabniško določen niz.
Torej, moramo prijaviti in definirati niz, kot je prikazano spodaj
char sPlanName() = ' MyFinancialPlan ';
„ImePPlanName“ je niz C, zato ga moramo pretvoriti v niz LR (da ga uporabimo v zahtevi).
To naredimo s pomočjo funkcije 'lr_save_string', kot je prikazano spodaj:
lr_save_string(sPlanName,”LRPlanName”);
Ta funkcija parametru / spremenljivki LR dodeli vrednost. Zajema dva atributa - prvi atribut je vir (C String), drugi atribut pa je cilj (parameter LR / spremenljivka).
Torej ta funkcija shrani vrednost spremenljivke C, ki smo jo definirali v LR parameter 'LRPlanName'.
Zdaj lahko 'LRPlanName' nadomestimo kot kateri koli drug parameter v zahtevi 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 );
Upoštevajte, da bodo pri zagonu tega skripta vsi uporabniki in vse ponovitve imele enako vrednost kot ime načrta. Torej, da bi ime načrta postalo edinstveno za vsako vožnjo, lahko naredimo nekaj takega.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Tu sta 'pVuserId' in 'pIteration' parametra 'Vuser ID' in 'Iteration Number' (o katerih smo razpravljali v vrstah parametrov v naših prejšnjih vadnicah). Ti se uporabljajo v imenu načrta, da se zagotovi, da imamo za vsakega uporabnika in iteracijo enolična imena.
The ‘Lr_eval_string’ funkcija vrne vhodni niz po oceni vdelanih parametrov. V tem primeru bo rezultat te funkcije »MyFinancialPlan_1_1« za prvo ponovitev Vuserja, »MyFinancialPlan_1_2« za drugo ponovitev Vuserja itd.
In seveda vemo kaj ‘Lr_save_string’ funkcija deluje.
Zdaj lahko nadomestimo parameter 'LRPlanName', kot je prikazano zgoraj.
2. scenarij:Kako pretvoriti spremenljivko tekača obremenitve v celo število C.
V zadnji vadnici smo videli primer, kako razumeti, kako ročno posredujemo ali neuspešno izvedemo transakcijo, odvisno od stanja.
Primer:
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 ); }
Tu smo uporabili stavek »if« z atributom »SaveCount«. Parametra 'WelcomeCount', ki shrani število ponovitev besedila, ni mogoče uporabiti neposredno v stanju 'if', saj gre za niz tekača obremenitve. Torej je treba ta parameter najprej pretvoriti v niz C in nato v celo število C. ‘Lr_eval_string’ in 'Atoi' za to skrbijo funkcije (oziroma).
The 'Atoi' Funkcija C pretvori niz C v celo število C.
Po tej pretvorbi je to mogoče uporabiti kot katero koli drugo celo število C.
Scenarij 3:Kako poslati naključno vrednost v zahtevi
Zelo pogosto naletimo na scenarije aplikacij, kjer moramo izbrati naključno vrednost (recimo iz spustnega menija). Kako ravnamo s tem v skripti VuGen? Kako zagotovimo, da je za vsako ponovitev izbrana naključna vrednost? Poglejmo to podrobno.
Vzemimo primer naše aplikacije 'Web Tours'. Kot smo videli že prej, imamo stran »Najdi let«, kjer moramo izbrati let.
Recimo, da izberemo prvega na seznamu. Ustrezna zahteva v skriptu je taka (kjer je ustrezna vrednost za izbrani 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 );
Najprej moramo iz enega od prejšnjih odgovorov zajeti ustrezne vrednosti za vse štiri lete. To lahko storimo s korelacijsko funkcijo (web_reg_save_param) z atributom 'ORD = ALL' pred zahtevo, katere odgovor ima te vrednosti.
Rezultat tega bo takšen, če ima korelirani parameter 'cFlight' niz štirih vrednosti, ki ustrezajo štirim letom.
Naslednji korak bi bil naključno izbrati eno od teh vrednosti in oddati v zahtevi. To lahko storite z uporabo ‘Lr_paramarr_random’ kot je prikazano spodaj.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Vhod v ‘Lr_paramarr_random’ funkcija je matrika parametrov in izhod je naključna vrednost iz te matrike. Torej je rezultat te funkcije ena od štirih letalnih vrednosti. In ker je ta naključna vrednost niz LR, se uporablja funkcija 'lr_eval_string' (za pretvorbo iste v niz C).
'Strcpy' Funkcija C na koncu kopira to vrednost v spremenljivko niza 'flightVal'.
Zdaj moramo spremenljivko C String pretvoriti v niz LR, da bomo lahko poslali zahtevo.
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 );
4. scenarij:Kako razdeliti niz na žetone
Recimo, da obstaja scenarij, ko moramo niz razdeliti na koščke / žetone. Vzemimo primer iz naše aplikacije „Spletne ture“, od vrednosti leta 020 ; 338; 03.03.2018 pravijo, da moramo uporabiti samo ‘338’, potem moramo ta niz razdeliti in shraniti v spremenljivko.
Storiti to 'Strtok' funkcija.
'Strtok' Funkcija C vrne žeton iz niza, ločenega z določenimi znaki. Po prvem klicu moramo kot vrednost niza predati ‘NULL’, da dobimo naslednji žeton. Spodnji primer prikazuje, kako se s to funkcijo deli vrednost leta na podlagi ločila s podpičjem (;).
Primer:
Predpostavimo, da je vrednost leta zajeta iz ustreznega odziva v parameter '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 tega je razviden iz dnevnika ponovitve.
Zahtevani žeton lahko kopiramo v parameter in ga uporabimo.
5. scenarij:Kako prebrati podatke iz besedilne datoteke in jih zapisati v besedilno datoteko
Včasih bo morda treba prebrati podatke iz zunanje datoteke ali zapisati podatke v zunanjo datoteko. Poglejmo, kako to naredimo v skriptu VuGen.
Najprej si oglejmo, kako beremo podatke iz besedilne datoteke.
Primer: Recimo, da moramo XML prebrati iz zunanje podatkovne datoteke in ga uporabiti kot zahtevo v skriptu.
Za to uporabljamo 'Fread' Funkcija C.
Ta funkcija ima štiri atribute:
medpomnilnik - vmesni pomnilnik, v katerem bo shranjen podatkovni tok
velikost - Velikost vmesnega pomnilnika.
štetje - Število bajtov za branje.
kazalec_datoteke - Kazalec datoteke
Primer kode (s komentarji) za isto
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
Upoštevajte, da v zgoraj prikazani kodi iz besedilne datoteke beremo 500 bajtov. Očitno velikosti datoteke morda ne poznamo vedno. Torej lahko uporabimo 'Fseek' in 'Ftell' Funkcije C (to vam bom pustil, da raziščete), da poiščete velikost datoteke in uporabite datoteko 'Šteti' atribut 'Fread' ustrezno delujejo.
Zdaj pa poglejmo, kako zapisati podatke v besedilno datoteko.
Primer: Recimo, da imamo skript, ki ustvarja naročila in generira 'orderid'. Če želimo vedeti vse ID-je zaporedja, ki jih je ustvaril naš skript v testu, lahko naredimo, da jih naš skript kopira v zunanjo besedilno datoteko.
„Fprintf“ - funkcija C zapisuje formatirani izhod v datoteko.
Ta funkcija ima te atribute:
kazalec_datoteke - Kazalec datoteke
niz_formatov - oblikovani niz za zapis v datoteko.
argume - Eden ali več neobveznih argumentov za tiskanje.
Primer kode je prikazan spodaj. Predpostavimo, da smo 'orderid' povezali in shranili v parameter 'cOrderId'.
Primer:
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 */
Upamo, da smo zdaj dobro razumeli koncepte branja podatkov ali zapisovanja podatkov v zunanjo datoteko (seveda bi lahko obstajali tudi drugi načini, kako narediti isto, kot smo razpravljali zgoraj). Zelo koristno bi bilo opraviti temeljito študijo o delovanju datotek v jeziku C (lahko se sklicujete na vse dobre vaje ali knjige o C), saj so te zelo potrebne v mnogih scenarijih v realnem času.
6. scenarij:Kako ravnati s korelacijo, ko se meje spreminjajo
V vaji za korelacije smo uporabili korelacijske funkcije, ki temeljijo na mejah, da smo zajeli dinamične vrednosti iz odziva. Kaj pa, če imamo scenarij, ko se meje spreminjajo? Obstaja več načinov za obvladovanje takšnih situacij. Poglejmo si to podrobno.
a) Z uporabo zastavic „IC“, „DIG“ in „ALNUM“:
IC - Ta zastavica VuGenu nalaga, naj prezre velike in male črke na levi / desni meji.
Primer: Če je leva meja včasih z velikimi črkami, včasih pa z malimi črkami, uporabimo to zastavico.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
TI - Ta zastavica naroči VuGenu, naj upošteva katero koli posamezno številko, kjer je na levi / desni meji uporabljen divji znak '#'.
c ++ praktična vprašanja in odgovori pdf
Primer: Če se leva meja (ali desna meja) spreminja tako (samo ena številka na določenem položaju).
GJHi3rty
1GJHi8rty
GJHi7rty
Lahko uporabimo zastavico 'DIG', kot je prikazano spodaj, saj bo to poskrbelo za spreminjanje številke.
LB / DIG = GJHi # rty
jelša - Ta zastavica VuGenu nalaga, naj upošteva kateri koli alfanumerični znak, kjer je na levi / desni meji uporabljen divji znak '^'.
Primer: Če se leva meja (ali desna meja) spreminja tako (samo en alfanumerični znak na določenem položaju).
GJHi3rty
GJHiKrty
GJHitrty
Oznako »ALNUM« lahko uporabimo, kot je prikazano spodaj, saj bo poskrbela za spreminjanje alfanumeričnih znakov
LB / ALNUM = GJHi ^ rty
Prav tako lahko skupaj uporabimo dve zastavici - na primer „ALNUMIC“, ki je hkrati „ALNUM“ in „IC“.
b) Uporaba atributov 'SaveLen' in 'SaveOffset':
Lahko uporabimo ta dva atributa ‘Web_reg_save_param’ deluje tako, da vnese samo statični del leve / desne meje.
c) Uporaba regularnih izrazov:
Lahko uporabimo ‘Web_reg_save_param_regexp’ korelacijska funkcija za shranjevanje dinamične vrednosti (v parameter), ki se ujema z regularnim izrazom.
Primer: Recimo, da je dinamična vrednost, ki jo želimo zajeti, »3959339« iz danega besedila,
PriceControl_ctl01 “Ime = priključek”, stanje “Refid = 3959339”
Tu ne moremo uporabiti korelacijske funkcije na podlagi meje, ker se lahko spremenita vrednost in dolžina polja, kot je »Ime« (in je zato ne moremo uporabljati na levi ali desni meji).
Lahko uporabimo ‘Web_reg_save_param_regexp’ korelacijska funkcija, kot je prikazano spodaj, da poskrbite za to težavo.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Skupine regularnih izrazov so v oklepajih, atribut ‘Group’ pa se odloči, katero skupino bo upošteval za shranjevanje ustreznega ujemanja z navedenim parametrom (v prvem atributu).
Spodaj je prikazanih nekaj ujemanj regularnih izrazov:
d - se ujema z enomestno številko
w - se ujema z eno samo besedo
(A-Z) + - se ujema s katero koli besedo z velikimi črkami
(a-z) + - se ujema s katero koli besedo z malimi črkami
(0-9) + - se ujema s poljubno številsko vrednostjo
7. scenarij:Kako napisati in uporabiti funkcijo v skriptu VuGen
Kot v katerem koli drugem programskem jeziku lahko tudi funkcijo napišemo / definiramo ročno (običajno jo imenujemo uporabniško določena funkcija) in jo uporabimo kjer koli v skriptu VuGen.
Predpostavimo, da moramo v vsaki zahtevi določenega skripta poslati enolično ime načrta. Torej, namesto da večkrat napišemo zahtevano kodo (ki ustvari edinstveno ime), lahko definiramo funkcijo (ki generira enolično ime) in pokličemo kadar koli (in kjer koli) v skriptu VuGen.
Čeprav je funkcijo v skriptu VuGen mogoče zapisati znotraj katerega koli dejanja, je praviloma napisana znotraj ‘Globals.h’ datoteko (v razdelku Dodatne datoteke skripta VuGen) ali znotraj novo ustvarjene datoteke (v istem odseku »Dodatne datoteke«). Ko je funkcija napisana, jo lahko pokličete iz katerega koli dejanja.
Spodnja slika prikazuje uporabniško določeno funkcijo 'MyFunction', zapisano v datoteki 'globals.h'.
Kot smo že omenili, je drugi način ustvariti novo datoteko in v njo zapisati funkcijo.
Pri ustvarjanju nove datoteke si morate zapomniti le to, da jo moramo vključiti v datoteko ‘globals.h’ (brez katere VuGen te datoteke ne bo prepoznal).
Zaključek
Tako smo v tej vadnici videli, kako ravnati z nekaterimi izzivi v realnem času pri skriptiranju VuGen, in očitno bomo pri delu z različnimi aplikacijami naleteli na številne druge scenarije.
Prav tako bi se zavedali, da so funkcije C nizov in operacije datotek C zelo potrebne (in koristne) pri ravnanju z različnimi scenariji. Priporočam pa vam, da nekaj časa porabite za njihovo obvladovanje.
V naslednji vadnici bomo videli in razumeli nekatere pomembne vnaprej določene funkcije, ki se uporabljajo v skripti VuGen (nekatere funkcije smo že videli).
=> Obiščite tukaj za celotno serijo vadnic LoadRunner
PREV Vadnica | NASLEDNJA Vadnica
Priporočeno branje
- Testiranje učinkovitosti spletnih storitev s pomočjo skriptov LoadRunner VuGen
- Napredno skriptno lupino Unix: nizi, operatorji datotek in nizov, posebne spremenljivke
- Testiranje obremenitve z vadnicami HP LoadRunner
- Možnosti snemanja VUGen v LoadRunnerju
- Kako nastaviti datoteke skripta LoadRunner VuGen in nastavitve izvajalnega okolja
- Pomembne funkcije LoadRunner, ki se uporabljajo v skripti VuGen s primeri
- Uvod v Micro Focus LoadRunner - Testiranje obremenitve z vadnico # 1 za LoadRunner
- JMeter BeanShell Scripting 2. del