loadrunner vugen scripting challenges
Introduktion til udfordringer involveret i LoadRunner VuGen Scripting:
I denne Informativ LoadRunner-træningsserie , vi udforskede om Forbedringer af VuGen-script i vores tidligere tutorial. Fra vores tidligere tutorials indtil nu har vi gjort store fremskridt med VuGen.
Vi lærte, hvordan man optager et script i Web HTTP / HTML-protokol, hvordan man tager sig af data / værdier med korrelation og parametrering, hvordan man kan sikre, om svaret er korrekt med kontrolpunkter, hvordan man indsætter transaktioner, der måler hastighed og svartid for bruger handlinger og andre ting.
Med disse skal vi være i stand til med succes at oprette scripts til næsten alle webapplikationer.
=> Klik her for en komplet serie af LoadRunner-vejledninger
LR-sprog
Der kan være situationer, hvor vi skal udføre mere udfordrende opgaver i et VuGen-script. I denne vejledning vil vi diskutere nogle af scripting-udfordringerne sammen med tilgængelige teknikker til at håndtere dem.
Før vi diskuterer disse, skal vi forstå et par ting. VuGen (eller Load Runner) kan kun forstå sit eget sprog (lad os kalde dette som LR-sprog, LR er den korte form for Load Runner). Så uanset hvilket script det genererer, kan det siges at være på LR-sprog. På LR-sprog er der kun én datatype - String (og mere præcist 'LR String').
For at udføre forbedringer i et VuGen-script bruger vi generelt C-sprog.
Vi ved, at der i C-sprog er mange datatyper som int, char, float, lang osv. Hvis vi direkte definerer og bruger C-værdier i en anmodning, forstår VuGen ikke (da det kun forstår 'LR-strenge') og vil kaste en fejl. Så vi er nødt til at konvertere en C-værdi (af enhver datatype) til 'LR-streng', inden vi bruger den i en anmodning.
Efter at have forstået dette, lad os gå til nogle udfordrende scenarier i realtid.
Scenarie 1:Sådan bruges en C-streng i en VuGen-anmodning
Lad os antage, at vi i et VuGen-script har en anmodning, der har et felt kaldet 'PlanName' (antag at dette script er til en finansiel planlægningsapplikation). Under optagelsen indtastede vi værdien som '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 );
Sig, at vi vil bruge en brugerdefineret streng som plannavnet.
Så vi er nødt til at erklære og definere en streng som vist nedenfor
char sPlanName() = ' MyFinancialPlan ';
'SPlanName' er en C-streng, og derfor skal vi konvertere den til LR-streng (for at bruge den i anmodningen).
Vi gør dette ved hjælp af funktionen 'lr_save_string' som vist nedenfor:
lr_save_string(sPlanName,”LRPlanName”);
Denne funktion tildeler en værdi til LR-parameteren / -variablen. Det tager to attributter - Den første attribut er kilden (C-streng), og den anden attribut er destinationen (LR-parameter / variabel).
Så denne funktion gemmer værdien af C-variablen, som vi definerede, i LR-parameteren 'LRPlanName'.
Nu kan vi erstatte 'LRPlanName' som enhver anden parameter i VuGen-anmodningen.
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 );
Bemærk, at når vi kører dette script, vil alle Vusere og alle iterationer have den samme værdi som plannavnet. Så for at gøre plannavnet unikt for hver kørsel, kan vi gøre noget som dette.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Her er 'pVuserId' og 'pIteration' parametrene 'Vuser ID' og 'Iteration Number' (som vi diskuterede i parametertyper i vores tidligere tutorials). Disse bruges i plannavnet for at sikre, at vi har unikke navne til hver Vuser og iteration.
Det 'Lr_eval_string' -funktionen returnerer inputstrengen efter evaluering af eventuelle integrerede parametre. Så i dette tilfælde vil output af denne funktion være 'MyFinancialPlan_1_1' for første Vuser første iteration, 'MyFinancialPlan_1_2' for første Vuser anden iteration og så videre.
Og selvfølgelig ved vi hvad 'Lr_save_string' funktion gør.
Nu kan vi erstatte 'LRPlanName'-parameteren som vist ovenfor.
Scenarie 2:Sådan konverteres en load runner-variabel til C-heltal
I den sidste vejledning så vi et eksempel for at forstå, hvordan vi manuelt videregiver eller fejler en transaktion afhængigt af en betingelse.
Eksempel:
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 ); }
Vi brugte 'if statement' her med 'SaveCount' attribut. Parameteren 'WelcomeCount', der gemmer antallet af forekomster af teksten, kan ikke bruges direkte i 'if' -tilstand, da det er en load runner-streng. Så denne parameter skal først konverteres til C-streng og derefter til C-heltal. 'Lr_eval_string' og 'Atoi' funktioner (henholdsvis) bruges til at tage sig af dette.
Det 'Atoi' C-funktion konverterer en C-streng til et C-heltal.
Efter denne konvertering kan dette bruges som ethvert andet C-heltal.
Scenarie 3:Sådan sendes en tilfældig værdi i en anmodning
Meget ofte kommer vi omkring applikationsscenarier, hvor vi skal vælge en tilfældig værdi (f.eks. Fra rullemenuen). Hvordan håndterer vi dette i VuGen-scripts? Hvordan sikrer vi, at der vælges tilfældig værdi for hver iteration? Lad os se dette i detaljer.
Lad os tage eksemplet med vores 'Web Tours' applikation. Som vi så tidligere, har vi en 'Find fly'-side, hvor vi skal vælge en flyrejse.
Sig, at vi vælger den første på listen. Den tilsvarende anmodning i scriptet er sådan (hvor den tilsvarende værdi for den valgte flyrejse).
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 );
Vi skal først registrere de tilsvarende værdier for alle de fire flyvninger fra et af de tidligere svar. Vi kan gøre dette ved hjælp af korrelationsfunktion (web_reg_save_param) med attributten 'ORD = ALL' før anmodningen, hvis svar har denne værdi.
Outputtet af dette vil være sådan, hvor den korrelerede parameter 'cFlight' har en matrix med fire værdier svarende til de fire flyvninger.
Det næste trin ville være at tilfældigt vælge en af disse værdier og indsende i anmodningen. Dette kan gøres ved hjælp af 'Lr_paramarr_random' fungerer som vist nedenfor.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Input til 'Lr_paramarr_random' funktion er et parameterarray, og output er en tilfældig værdi fra dette array. Så her er output af denne funktion en af de fire flyveværdier. Og da denne tilfældige værdi er en LR-streng, bruges 'lr_eval_string' -funktionen (til at konvertere den samme til C-streng).
'Strcpy' C-funktionen kopierer endelig denne værdi til en C-strengvariabel 'flightVal'.
Nu er vi igen nødt til at konvertere denne C-strengvariabel til LR-streng for at kunne sende anmodningen.
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 );
Scenarie 4:Sådan opdeles en streng i tokens
Sig, at der er et scenarie, hvor vi er nødt til at opdele en streng i stykker / tokens. Lad os tage eksemplet fra vores 'Web Tours' applikation hvorfra flyværdien 020 ; 338; 04/03/2018 siger, at vi kun skal bruge ‘338’, så er vi nødt til at opdele denne streng og gemme den i en variabel.
At gøre dette 'Strtok' funktionen bruges.
'Strtok' C-funktionen returnerer et token fra en streng afgrænset med angivne tegn. Efter den første påkaldelse skal vi videregive 'NULL' som værdien af strengen for at få det næste token. Eksemplet nedenfor viser, hvordan denne funktion bruges til at opdele flyværdien baseret på semikolon (;) afgrænser.
Eksempel:
Lad os antage, at flyværdien fanges fra det relevante svar i parameteren '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); }
Outputtet af dette kan ses i gentagelsesloggen.
Vi kan kopiere det krævede token til en parameter og bruge det.
Scenarie 5:Hvordan man læser data fra og skriver data i en tekstfil
Nogle gange kan det være nødvendigt at læse data fra en ekstern fil eller skrive data til en ekstern fil. Lad os se, hvordan vi gør dette i et VuGen-script.
Lad os først se, hvordan man læser data fra en tekstfil.
Eksempel: Sig, at vi skal læse en XML fra en ekstern datafil og bruge den som en anmodning i scriptet.
For at gøre dette bruger vi 'Fread' C-funktion.
Denne funktion tager fire attributter:
buffer - Den buffer, hvor datastrømmen skal gemmes.
størrelse - Størrelsen på bufferen.
tælle - Antallet af byte, der skal læses.
file_pointer - Filmarkøren
Eksempel kode (med kommentarer) for det samme
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
Bemærk, at vi i koden vist ovenfor læser 500 byte fra tekstfilen. Det er klart, at vi måske ikke altid kender filstørrelsen. Så vi kan bruge 'Fseek' og 'Ftell' C-funktioner (jeg vil lade dette være for dig at udforske) for at finde størrelsen på filen og bruge 'tælle' attribut for 'Fread' fungerer i overensstemmelse hermed.
Lad os nu se, hvordan man skriver data til en tekstfil.
Eksempel: Sig, at vi har et script, der opretter ordrer og genererer 'ordre'. Hvis vi ønsker at kende alle ordre-id'erne oprettet af vores script i en test, kan vi få vores script til at kopiere disse ordre-id'er til en ekstern tekstfil.
'Fprintf' - C-funktion skriver formateret output til en fil.
Denne funktion tager disse attributter:
file_pointer - Filmarkøren
format_streng - Den formaterede streng, der skal skrives til filen.
argumenterer - Et eller flere valgfri udskrivningsargumenter.
Eksempelkoden er vist nedenfor. Lad os antage, at vi har korreleret og gemt 'orderid' i parameteren 'cOrderId'.
Eksempel:
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 */
Håber, vi er nu gode med begreberne læsning af data fra eller skrivning af data til en ekstern fil (selvfølgelig kan der være de andre måder at gøre det samme på end det, vi diskuterede ovenfor). Det ville være meget nyttigt at foretage en grundig undersøgelse af filoperationer i C (du kan henvise til gode C-tutorials eller bøger), da disse er meget krævede i mange realtidsscenarier.
Scenarie 6:Sådan håndteres korrelation, når grænser ændrer sig
I Korrelationer tutorial brugte vi grænsebaseret korrelationsfunktion (er) til at indfange de dynamiske værdier fra svaret. Men hvad hvis vi har et scenario, hvor grænserne ændrer sig? Der er flere måder at håndtere sådanne situationer på. Lad os se disse detaljeret.
a) Brug af 'IC', 'DIG' og 'ALNUM' flag:
IC - Dette flag instruerer VuGen om at ignorere sagen i venstre / højre grænse.
Eksempel: Hvis venstre grænse undertiden er med store bogstaver og undertiden med små bogstaver, bruger vi dette flag.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
DU - Dette flag instruerer VuGen om at overveje ethvert enkelt nummer, hvor den vilde karakter '#' bruges i venstre / højre grænse.
oracle pl sql interview spørgsmål til 8 års erfaring
Eksempel: Hvis venstre grænse (eller højre grænse) ændrer sig som denne (kun et nummer på en bestemt position).
GJHi3rty
1GJHi8rty
GJHi7rty
Vi kan bruge 'DIG'-flag som vist nedenfor, da det tager sig af det skiftende nummer.
LB / DIG = GJHi # rty
alder - Dette flag instruerer VuGen om at overveje ethvert alfanumerisk tegn, hvor det vilde tegn '^' bruges i venstre / højre grænse.
Eksempel: Hvis venstre grænse (eller højre grænse) ændrer sig som denne (kun et alfanumerisk tegn på en bestemt position).
GJHi3rty
GJHiKrty
GJHitrty
Vi kan bruge 'ALNUM'-flag som vist nedenfor, da det tager sig af det skiftende alfanumeriske tegn
LB / ALNUM = GJHi ^ rty
Vi kan også bruge to flag sammen - som 'ALNUMIC', som både er 'ALNUM' og 'IC'.
b) Brug af 'SaveLen' og 'SaveOffset' attributter:
Vi kan bruge disse to attributter til 'Web_reg_save_param' fungerer korrekt til kun at indtaste den statiske del af venstre / højre grænser.
c) Brug af regulære udtryk:
Vi kan bruge 'Web_reg_save_param_regexp' korrelationsfunktion for at gemme den dynamiske værdi (i en parameter), der matcher et regulært udtryk.
Eksempel: Lad os sige, at den dynamiske værdi, vi ønsker at fange, er '3959339' fra den givne tekst,
PriceControl_ctl01 'Name = jack', 'Refid = 3959339' balance
Vi kan ikke bruge grænsebaseret korrelationsfunktion her, fordi værdien og længden af feltet som 'Navn' ovenfor kan ændre sig (og derfor kan vi ikke bruge det i venstre eller højre grænse).
Vi kan bruge 'Web_reg_save_param_regexp' korrelationsfunktion som vist nedenfor for at tage sig af dette problem.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Regulære udtryksgrupper placeres i parentes, og attributten 'Gruppe' bestemmer, hvilken gruppe der skal overvejes for at gemme det tilsvarende match til den angivne parameter (i den første attribut).
Et par matching af regulært udtryk vises nedenfor:
d - matcher et enkelt ciffer
w - matcher et enkelt ord
(A-Z) + - matcher ethvert ord med store bogstaver
(a-z) + - matcher ethvert ord med små bogstaver
(0-9) + - matcher en hvilken som helst numerisk værdi
Scenarie 7:Sådan skriver og bruger du en funktion i et VuGen-script
Som i ethvert andet programmeringssprog kan vi skrive / definere en funktion manuelt (normalt kaldet brugerdefineret funktion) og bruge den hvor som helst i VuGen-scriptet.
Lad os antage, at vi skal sende et unikt plannavn i hver anmodning fra et bestemt script. Så i stedet for at skrive den krævede kode (der genererer et unikt navn) flere gange, kan vi definere en funktion (der genererer et unikt navn) og ringe ind når som helst (og hvor som helst) det kræves i VuGen-scriptet.
Selvom funktion i et VuGen-script kan skrives inde i enhver handling, skrives den generelt inde i 'Globals.h' fil (under sektionen Ekstra filer i VuGen-scriptet) eller inde i en nyoprettet fil (under den samme sektion 'Ekstra filer'). Når funktionen er skrevet, kan den kaldes fra enhver handling (er).
Billedet nedenfor viser en brugerdefineret funktion 'MyFunction' skrevet inde i 'globals.h' filen.
Som diskuteret ovenfor er den anden måde at oprette en ny fil og skrive funktionen inde i den.
Den eneste ting at huske, når du opretter en ny fil, er at vi skal inkludere den i 'globals.h' filen (uden hvilken VuGen ikke genkender denne fil).
Konklusion
Således i denne vejledning så vi, hvordan vi kunne håndtere nogle realtidsudfordringer i VuGen-scripting, og vi ville naturligvis komme på tværs af mange andre scenarier, når vi arbejder på forskellige applikationer.
Du ville også have indset, at C-strengfunktioner og C-filhandlinger er meget krævede (og nyttige) til håndtering af forskellige scenarier. Jeg vil dog anbefale dig at bruge lidt tid på at mestre disse.
I vores næste tutorial vil vi se og forstå nogle vigtige foruddefinerede funktioner, der bruges i VuGen-scripts (vi har allerede set nogle af funktionerne).
=> Besøg her for en komplet serie af LoadRunner-vejledninger
PREV-vejledning | NÆSTE vejledning
Anbefalet læsning
- Test af webtjenester præstation ved hjælp af LoadRunner VuGen Scripting
- Avanceret Unix Shell-scripting: Arrays, fil- og strengtestoperatører, specielle variabler
- Load Testing med HP LoadRunner-vejledninger
- VUGen-optagelsesindstillinger i LoadRunner
- Sådan opsættes LoadRunner VuGen Script-filer og Runtime-indstillinger
- Vigtige LoadRunner-funktioner, der bruges i VuGen-scripts med eksempler
- Introduktion til Micro Focus LoadRunner - Load Testing med LoadRunner Tutorial # 1
- JMeter BeanShell Scripting del 2