loadrunner vugen scripting challenges
Introduksjon til utfordringer involvert i LoadRunner VuGen Scripting:
I dette Informativ LoadRunner Training Series , vi utforsket om Forbedringer av VuGen-skript i vår forrige opplæring. Fra våre tidligere opplæringsprogrammer til nå har vi gjort store fremskritt med VuGen.
Vi lærte å registrere et skript i Web HTTP / HTML-protokollen, hvordan ta vare på data / verdier med korrelasjon og parameterisering, hvordan vi kan sikre om svaret er riktig med sjekkpunkter, hvordan du setter inn transaksjoner som måler hastighet og responstid for brukeren handlinger og andre ting.
Med disse bør vi kunne lage skript for nesten alle webapplikasjoner.
=> Klikk her for fullstendig serie med LoadRunner-veiledninger
LR-språk
Det kan være situasjoner der vi trenger å gjøre mer utfordrende oppgaver i et VuGen-skript. I denne veiledningen vil vi diskutere noen av skriptutfordringene sammen med tilgjengelige teknikker for å håndtere dem.
Før vi diskuterer disse, la oss forstå et par ting. VuGen (eller Load Runner) kan bare forstå sitt eget språk (la oss kalle dette som LR-språk, LR er den korte formen for Load Runner). Så uansett hvilket skript det genererer kan sies å være på LR-språk. På LR-språk er det bare én datatype - String (og mer presist ‘LR String’).
Nå, for å gjøre forbedringer i et VuGen-skript, bruker vi vanligvis C-språk.
Vi vet at det i C-språk er mange datatyper som int, char, float, long osv. Hvis vi direkte definerer og bruker C-verdier i en forespørsel, vil ikke VuGen forstå det (da det bare forstår 'LR-strenger') og vil kaste en feil. Så vi må konvertere en hvilken som helst C-verdi (av hvilken som helst datatype) til 'LR-streng' før vi bruker den i en forespørsel.
Etter å ha forstått dette, la oss gå til noen utfordrende scenarier i sanntid.
Scenario 1:Hvordan bruke en C-streng i en VuGen-forespørsel
La oss anta at vi i et VuGen-skript har en forespørsel som har et felt som heter ‘PlanName’ (antar at dette skriptet er for en finansiell planleggingsapplikasjon). Under innspillingen skrev vi inn verdien 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 );
Si at vi vil bruke en brukerdefinert streng som plannavnet.
Så vi må erklære og definere en streng som vist nedenfor
char sPlanName() = ' MyFinancialPlan ';
‘SPlanName’ er en C-streng, og derfor må vi konvertere den til LR-streng (for å bruke den i forespørselen).
Vi gjør dette ved å bruke 'lr_save_string' -funksjonen som vist nedenfor:
lr_save_string(sPlanName,”LRPlanName”);
Denne funksjonen tilordner en verdi til LR-parameteren / variabelen. Det tar to attributter - Det første attributtet er kilden (C-streng) og det andre attributtet er destinasjonen (LR-parameter / variabel).
Så denne funksjonen lagrer verdien av C-variabelen som vi definerte i LR-parameteren 'LRPlanName'.
Nå kan vi erstatte ‘LRPlanName’ som alle andre parametere i VuGen-forespørselen.
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 );
Merk at når vi kjører dette skriptet, vil alle Vusers og alle iterasjonene ha samme verdi som plannavnet. Så for å gjøre plannavnet unikt for hvert løp, kan vi gjøre noe slikt.
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 diskuterte i parametertyper i våre tidligere veiledninger). Disse brukes i plannavnet for å sikre at vi har unike navn for hver bruker og iterasjon.
De ‘Lr_eval_string’ -funksjonen returnerer inngangsstrengen etter evaluering av innebygde parametere. Så i dette tilfellet vil utgangen av denne funksjonen være 'MyFinancialPlan_1_1' for første Vuser første iterasjon, 'MyFinancialPlan_1_2' for første Vuser andre iterasjon og så videre.
Og selvfølgelig vet vi hva ‘Lr_save_string’ funksjon gjør.
Nå kan vi erstatte parameteren ‘LRPlanName’ som vist ovenfor.
Scenario 2:Hvordan konvertere en load runner-variabel til C-heltall
I den siste opplæringen så vi et eksempel for å forstå hvordan vi manuelt overfører eller mislykkes i en transaksjon avhengig av en tilstand.
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 brukte ‘if statement’ her med ‘SaveCount’ attributt. 'WelcomeCount' -parameteren som lagrer antall forekomster av teksten, kan ikke brukes direkte i 'if' -tilstand, ettersom det er en belastningstrengerstreng. Så denne parameteren må først konverteres til C-streng og deretter til C-heltall. ‘Lr_eval_string’ og ‘Atoi’ funksjoner brukes (henholdsvis) for å ta vare på dette.
De ‘Atoi’ C-funksjon konverterer en C-streng til et C-heltall.
Etter denne konverteringen kan dette brukes som ethvert annet C-heltall.
Scenario 3:Hvordan sende en tilfeldig verdi i en forespørsel
Svært ofte kommer vi rundt applikasjonsscenarier der vi må velge en tilfeldig verdi (si fra rullegardinmenyen). Hvordan håndterer vi dette i VuGen-skript? Hvordan sikrer vi at tilfeldig verdi blir valgt for hver iterasjon? La oss se dette i detalj.
La oss ta eksemplet med applikasjonen vår 'Web Tours'. Som vi så tidligere, har vi en 'Finn fly' -side der vi må velge en flytur.
Si at vi velger den første i listen. Den tilsvarende forespørselen i skriptet er slik (hvor den tilsvarende verdien for den valgte flyreisen).
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 må først fange de tilsvarende verdiene for alle de fire flyvningene fra et av de forrige svarene. Vi kan gjøre dette ved hjelp av korrelasjonsfunksjon (web_reg_save_param) med attributtet 'ORD = ALL' før forespørselen hvis svar har denne verdien.
Resultatet av dette vil være slik der den korrelerte parameteren ‘cFlight’ har en matrise med fire verdier som tilsvarer de fire flyvningene.
Neste trinn vil være å tilfeldig velge en av disse verdiene og sende inn forespørselen. Dette kan gjøres ved hjelp av ‘Lr_paramarr_random’ fungerer som vist nedenfor.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Inndata til ‘Lr_paramarr_random’ funksjonen er en parameter matrise og utgangen er en tilfeldig verdi fra denne matrisen. Så her er utgangen av denne funksjonen en av de fire flyverdiene. Og ettersom denne tilfeldige verdien er en LR-streng, brukes ‘lr_eval_string’ -funksjonen (for å konvertere den samme til C-streng).
‘Strcpy’ C-funksjon kopierer endelig denne verdien til en C-strengvariabel 'flightVal'.
Nå må vi konvertere denne C-strengvariabelen til LR-streng for å kunne sende inn forespørselen.
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 );
Scenario 4:Hvordan dele en streng i tokens
Si at det er et scenario hvor vi må dele en streng i stykker / tokens. La oss ta eksemplet fra 'Web Tours' applikasjonen hvor fra flyverdien 020 ; 338; 04/03/2018 si at vi bare må bruke ‘338’, da må vi dele denne strengen og lagre denne i en variabel.
Å gjøre dette ‘Strtok’ funksjonen brukes.
'Strtok' C-funksjonen returnerer et token fra en streng avgrenset av spesifiserte tegn. Etter den første påkallingen må vi passere ‘NULL’ som verdien av strengen for å få neste token. Eksemplet nedenfor viser hvordan denne funksjonen brukes til å dele flyverdien basert på skillet mellom semikolon (;).
Eksempel:
La oss anta at flyverdien blir fanget fra det aktuelle svaret inn 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); }
Resultatet av dette kan sees i represjonsloggen.
Vi kan kopiere det nødvendige tokenet til en parameter og bruke det.
Scenario 5:Hvordan lese data fra og skrive data i en tekstfil
Noen ganger kan det være nødvendig å lese data fra en ekstern fil eller skrive data til en ekstern fil. La oss se hvordan vi gjør dette i et VuGen-skript.
La oss først se hvordan du leser data fra en tekstfil.
Eksempel: Si at vi må lese en XML fra en ekstern datafil og bruke den som en forespørsel i skriptet.
For å gjøre dette bruker vi 'Fread' C-funksjon.
Denne funksjonen tar fire attributter:
buffer - Bufferen som datastrømmen skal lagres i.
størrelse - Størrelsen på bufferen.
telle - Antall byte som skal leses.
file_pointer - Filpekeren
Eksempelkode (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
Merk at vi i koden vist ovenfor leser 500 byte fra tekstfilen. Åpenbart vet vi kanskje ikke alltid filstørrelsen. Så vi kan bruke ‘Fseek’ og ‘Ftell’ C-funksjoner (jeg vil la dette være for deg å utforske) for å finne størrelsen på filen og bruke 'telle' attributt til 'Fread' fungere deretter.
La oss nå se hvordan du skriver data til en tekstfil.
Eksempel: Si at vi har et skript som oppretter ordrer og genererer 'ordre'. Hvis vi vil vite alle ordre-ID-er opprettet av skriptet vårt i en test, kan vi få skriptet til å kopiere disse ordre-ID-ene til en ekstern tekstfil.
‘Fprintf’ - C-funksjonen skriver formatert utdata til en fil.
Denne funksjonen tar disse attributtene:
file_pointer - Filpekeren
format_streng - Den formaterte strengen som skal skrives til filen.
argumenterer - Ett eller flere valgfrie utskriftsargumenter.
Eksempelkoden er vist nedenfor. La oss anta at vi har korrelert og lagret ‘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åper, vi er nå gode med begrepene å lese data fra eller skrive data til en ekstern fil (selvfølgelig kan det være andre måter å gjøre det samme enn det vi diskuterte ovenfor). Det ville være veldig nyttig å gjøre en grundig studie av filoperasjoner i C (du kan referere til noen gode C-opplæringsprogrammer eller bøker), da disse er veldig nødvendige i mange sanntidsscenarier.
Scenario 6:Hvordan håndtere korrelasjon når grenser endres
I korrelasjonsveiledningen brukte vi grensebasert korrelasjonsfunksjon (er) for å fange opp de dynamiske verdiene fra responsen. Men hva om vi har et scenario der grensene endres? Det er flere måter å håndtere slike situasjoner på. La oss se disse i detalj.
a) Bruke flaggene IC, DIG og ALNUM:
IC - Dette flagget instruerer VuGen om å ignorere sak i venstre / høyre grense.
Eksempel: Hvis Venstre grense noen ganger er med store og små bokstaver, bruker vi dette flagget.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
DU - Dette flagget instruerer VuGen om å vurdere ethvert enkelt tall der det ville tegnet '#' brukes i venstre / høyre grense.
beste programmet for å overvåke GPU temp
Eksempel: Hvis venstre grense (eller høyre grense) endrer seg slik (bare ett tall på en bestemt posisjon).
GJHi3rty
1GJHi8rty
GJHi7rty
Vi kan bruke ‘DIG’-flagget som vist nedenfor, da det tar seg av det skiftende nummeret.
LB / DIG = GJHi # rty
alder - Dette flagget instruerer VuGen om å vurdere ethvert enkelt alfanumerisk tegn der det ville tegnet ‘^’ brukes i venstre / høyre grense.
Eksempel: Hvis venstre grense (eller høyre grense) endrer seg slik (bare ett alfanumerisk tegn på en bestemt posisjon).
GJHi3rty
GJHiKrty
GJHitrty
Vi kan bruke 'ALNUM' -flagget som vist nedenfor, da det tar vare på det skiftende alfanumeriske tegnet
LB / ALNUM = GJHi ^ rty
Vi kan også bruke to flagg sammen - som 'ALNUMIC' som både er 'ALNUM' og 'IC'.
b) Bruke attributtene 'SaveLen' og 'SaveOffset':
Vi kan bruke disse to attributtene til ‘Web_reg_save_param’ funksjon på riktig måte for kun å legge inn den statiske delen av venstre / høyre grense.
c) Bruke regulære uttrykk:
Vi kan bruke ‘Web_reg_save_param_regexp’ korrelasjonsfunksjon for å lagre den dynamiske verdien (i en parameter) som samsvarer med et vanlig uttrykk.
Eksempel: La oss si at den dynamiske verdien vi ønsker å fange er '3959339' fra den gitte teksten,
PriceControl_ctl01 'Name = jack', 'Refid = 3959339' balanse
Vi kan ikke bruke grensebasert korrelasjonsfunksjon her fordi verdien og lengden på feltet som 'Navn' ovenfor kan endres (og derfor kan vi ikke bruke det i venstre eller høyre grense).
Vi kan bruke ‘Web_reg_save_param_regexp’ korrelasjonsfunksjon som vist nedenfor for å ta vare på dette problemet.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Vanlige uttrykksgrupper blir satt i parentes, og attributtet 'Gruppe' bestemmer hvilken gruppe som skal vurderes for å lagre tilsvarende samsvar til den angitte parameteren (i det første attributtet).
Noen få samsvar med regulært uttrykk vises nedenfor:
d - samsvarer med et enkelt siffer
w - samsvarer med et enkelt ord
(A-Z) + - samsvarer med et hvilket som helst ord i store bokstaver
(a-z) + - samsvarer med et hvilket som helst ord med små bokstaver
(0-9) + - samsvarer med en hvilken som helst numerisk verdi
Scenario 7:Hvordan skrive og bruke en funksjon i et VuGen-skript
Som i alle andre programmeringsspråk, kan vi skrive / definere en funksjon manuelt (vanligvis kalt brukerdefinert funksjon) og bruke den hvor som helst i VuGen-skriptet.
La oss anta at vi må sende et unikt plannavn i hver forespørsel fra et bestemt skript. Så i stedet for å skrive den nødvendige koden (som genererer et unikt navn) flere ganger, kan vi definere en funksjon (som genererer et unikt navn) og ringe inn når som helst (og hvor som helst) det kreves i VuGen-skriptet.
Selv om funksjonen i et VuGen-skript kan skrives i en hvilken som helst handling, skrives den vanligvis inne i ‘Globals.h’ fil (under delen Ekstra filer i VuGen-skriptet) eller inne i en nylig opprettet fil (under den samme delen Ekstra filer). Når funksjonen er skrevet, kan den ringes fra hvilken som helst handling (er).
Bildet nedenfor viser en brukerdefinert funksjon ‘MyFunction’ skrevet inne i ‘globals.h’-filen.
Som diskutert ovenfor, er den andre måten å opprette en ny fil og skrive funksjonen i den.
Det eneste du må huske når du oppretter en ny fil, er at vi må ta den med i 'globals.h' -filen (uten hvilken VuGen ikke vil gjenkjenne denne filen).
Konklusjon
Dermed så vi i denne opplæringen hvordan vi skulle håndtere noen sanntidsutfordringer i VuGen-skripting, og vi ville åpenbart komme over mange andre scenarier når vi jobber med forskjellige applikasjoner.
Du ville også ha innsett at C-strengfunksjoner og C-filoperasjoner er veldig påkrevd (og nyttig) for å håndtere forskjellige scenarier. Imidlertid vil jeg anbefale deg å bruke litt tid på å mestre disse.
I vår neste opplæring vil vi se og forstå noen viktige forhåndsdefinerte funksjoner som brukes i VuGen-skript (vi har sett noen av funksjonene allerede).
=> Besøk her for en komplett serie med LoadRunner-opplæringsprogrammer
PREV Opplæring | NESTE veiledning
Anbefalt lesing
- Nettjenestetestets ytelsestesting ved bruk av LoadRunner VuGen Scripting
- Avansert Unix Shell Scripting: Arrays, File and String Test Operators, Special Variables
- Lastetesting med HP LoadRunner-veiledninger
- VUGen-opptaksalternativer i LoadRunner
- Hvordan sette opp LoadRunner VuGen-skriptfiler og kjøretidsinnstillinger
- Viktige LoadRunner-funksjoner som brukes i VuGen-skript med eksempler
- Introduksjon til Micro Focus LoadRunner - Load Testing with LoadRunner Tutorial # 1
- JMeter BeanShell Scripting del 2