loadrunner vugen scripting challenges
Introduktion till utmaningar involverade i LoadRunner VuGen Scripting:
I denna Informativ LoadRunner-träningsserie , vi utforskade om Förbättringar av VuGen-skript i vår tidigare handledning. Från våra tidigare tutorials fram till nu har vi gjort stora framsteg med VuGen.
Vi lärde oss hur man spelar in ett skript i Web HTTP / HTML-protokollet, hur man tar hand om data / värden med korrelation och parameterisering, hur man säkerställer om svaret är korrekt med kontrollpunkter, hur man infogar transaktioner som mäter hastighet och svarstid för användaren handlingar och andra saker.
Med dessa borde vi kunna skapa skript för nästan alla webbapplikationer.
=> Klicka här för en komplett serie LoadRunner-handledning
LR-språk
Det kan finnas situationer där vi behöver göra mer utmanande uppgifter i ett VuGen-skript. I denna handledning kommer vi att diskutera några av skriptutmaningarna tillsammans med tillgängliga tekniker för att hantera dem.
Låt oss förstå några saker innan vi diskuterar dessa. VuGen (eller Load Runner) kan bara förstå sitt eget språk (låt oss kalla detta som LR-språk, LR är den korta formen av Load Runner). Så vilket skript det genererar kan sägas vara på LR-språk. På LR-språk finns det bara en datatyp - Sträng (och mer exakt 'LR-sträng').
För att göra förbättringar i ett VuGen-skript använder vi vanligtvis C-språk.
Vi vet att det i C-språket finns många datatyper som int, char, float, long etc. Om vi direkt definierar och använder C-värden i en begäran kommer VuGen inte att förstå (eftersom det bara förstår 'LR-strängar') och kommer att kasta ett fel. Så vi måste konvertera vilket C-värde som helst (av vilken datatyp som helst) till ”LR-sträng” innan vi använder det i en begäran.
Efter att ha förstått detta, låt oss gå till några utmanande scenarier i realtid.
Scenario 1:Hur man använder en C-sträng i en VuGen-begäran
Låt oss anta att i ett VuGen-skript har vi en begäran som har ett fält som heter 'PlanName' (antag att detta skript är för någon ekonomisk planeringsapplikation). Under inspelningen skrev vi in värdet 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 );
Säg att vi vill använda en användardefinierad sträng som plannamn.
Så vi måste deklarera och definiera en sträng enligt nedan
char sPlanName() = ' MyFinancialPlan ';
'SPlanName' är en C-sträng och därför måste vi konvertera den till LR-sträng (för att använda den i begäran).
Vi gör detta med funktionen “lr_save_string” enligt nedan:
lr_save_string(sPlanName,”LRPlanName”);
Denna funktion tilldelar ett värde till LR-parametern / variabeln. Det tar två attribut - Det första attributet är källan (C-sträng) och det andra attributet är destinationen (LR-parameter / variabel).
Så den här funktionen sparar värdet på C-variabeln som vi definierade i LR-parametern 'LRPlanName'.
Nu kan vi ersätta ”LRPlanName” som alla andra parametrar i VuGen-begäran.
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 );
Observera att när vi kör det här skriptet kommer alla Vusers och alla iterationer att ta samma värde som plannamnet. Så för att göra plannamnet unikt för varje körning kan vi göra något liknande.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Här är 'pVuserId' och 'pIteration' parametrarna 'Vuser ID' och 'Iteration Number' (som vi diskuterade i parametertyper i våra tidigare självstudier). Dessa används i plannamnet för att säkerställa att vi har unika namn för varje Vuser och iteration.
De 'Lr_eval_string' funktionen returnerar inmatningssträngen efter utvärdering av inbäddade parametrar. Så i det här fallet kommer denna funktion att vara 'MyFinancialPlan_1_1' för första Vuser första iteration, 'MyFinancialPlan_1_2' för första Vuser andra iteration och så vidare.
Och naturligtvis vet vi vad 'Lr_save_string' funktion gör.
Nu kan vi ersätta parametern ”LRPlanName” som visas ovan.
Scenario 2:Hur man konverterar en load runner-variabel till C-heltal
I den senaste handledningen såg vi ett exempel för att förstå hur vi manuellt skickar eller misslyckas med en transaktion beroende på ett tillstånd.
Exempel:
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 använde 'if statement' här med attributet 'SaveCount'. Parametern 'WelcomeCount' som sparar antalet förekomster av texten kan inte användas direkt i 'om' -tillstånd eftersom det är en belastningssträngsträng. Så denna parameter måste konverteras till C-sträng först och sedan till C-heltal. 'Lr_eval_string' och 'Atoi' funktioner (respektive) används för att ta hand om detta.
De 'Atoi' C-funktion omvandlar en C-sträng till ett C-heltal.
Efter denna konvertering kan detta användas som alla andra C-heltal.
Scenario 3:Hur man skickar ett slumpmässigt värde i en begäran
Mycket ofta kommer vi runt applikationsscenarier där vi måste välja ett slumpmässigt värde (säg från en rullgardinsmeny). Hur hanterar vi detta i VuGen-skript? Hur ser vi till att slumpmässigt värde väljs för varje iteration? Låt oss se detta i detalj.
Låt oss ta exemplet med vår applikation 'Web Tours'. Som vi såg tidigare har vi en 'Hitta flyg' -sida där vi måste välja ett flyg.
Säg att vi väljer den första i listan. Motsvarande begäran i skriptet är så här (där motsvarande värde för den valda flygningen).
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åste först fånga motsvarande värden för alla de fyra flygningarna från ett av de tidigare svaren. Vi kan göra detta med hjälp av korrelationsfunktionen (web_reg_save_param) med attributet 'ORD = ALL' före begäran vars svar har detta värde.
Resultatet av detta kommer att vara så här när den korrelerade parametern 'cFlight' har en matris med fyra värden som motsvarar de fyra flygningarna.
Nästa steg skulle vara att slumpmässigt välja ett av dessa värden och skicka i begäran. Detta kan göras med 'Lr_paramarr_random' fungerar som visas nedan.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Ingången till 'Lr_paramarr_random' funktionen är en parametermatris och utgången är ett slumpmässigt värde från denna matris. Så här är resultatet av denna funktion ett av de fyra flygvärdena. Och eftersom detta slumpmässiga värde är en LR-sträng används funktionen 'lr_eval_string' (för att konvertera samma till C-sträng).
'Strcpy' C-funktionen kopierar slutligen detta värde till en C-strängvariabel 'flightVal'.
Nu måste vi konvertera denna C-strängvariabel till LR-sträng för att kunna skicka in begäran.
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:Hur man delar upp en sträng i tokens
Säg att det finns ett scenario där vi måste dela en sträng i bitar / tokens. Låt oss ta exemplet från vår 'Web Tours' -applikation från flygvärdet 020 ; 338; 04/03/2018 säger att vi bara måste använda '338', då måste vi dela den här strängen och lagra den i en variabel.
Att göra detta 'Strtok' funktionen används.
'Strtok' C-funktionen returnerar en token från en sträng avgränsad med angivna tecken. Efter den första anropet måste vi skicka 'NULL' som värdet på strängen för att få nästa token. Exemplet nedan visar hur denna funktion används för att dela flygvärdet baserat på semikolon (;) avgränsare.
Exempel:
Låt oss anta att flygvärdet fångas från det relevanta svaret i parametern '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 detta kan ses i omspelningsloggen.
Vi kan kopiera den nödvändiga token till en parameter och använda den.
Scenario 5:Hur man läser data från och skriver data i en textfil
Ibland kan det krävas att man läser data från en extern fil eller skriver data till en extern fil. Låt oss se hur vi gör det i ett VuGen-skript.
Låt oss först se hur man läser data från en textfil.
Exempel: Säg att vi måste läsa en XML från en extern datafil och använda den som en begäran i skriptet.
För att göra detta använder vi 'Fread' C-funktion.
Denna funktion tar fyra attribut:
buffert - Bufferten där dataströmmen ska lagras.
storlek - Buffertens storlek.
räkna - Antal byte som ska läsas.
file_pointer - Filpekaren
Exempelkod (med kommentarer) för samma
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
Observera att i koden som visas ovan läser vi 500 byte från textfilen. Uppenbarligen kanske vi inte alltid vet filstorleken. Så vi kan använda 'Fseek' och 'Ftell' C-funktioner (jag lämnar detta för dig att utforska) för att hitta filens storlek och använda 'räkna' attribut för 'Fread' fungerar därefter.
Låt oss nu se hur man skriver data till en textfil.
Exempel: Anta att vi har ett skript som skapar order och genererar 'orderid'. Om vi vill veta alla beställnings-ID: er som skapats av vårt skript i ett test kan vi få vårt skript att kopiera dessa beställnings-ID: er till en extern textfil.
'Fprintf' - C-funktionen skriver formaterad utdata till en fil.
Denna funktion tar följande attribut:
file_pointer - Filpekaren
format_sträng - Den formaterade strängen för att skriva till filen.
argumenterar - Ett eller flera valfria utskriftsargument.
Exempelkoden visas nedan. Låt oss anta att vi har korrelerat och sparat 'orderid' i parametern 'cOrderId'.
Exempel:
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 */
Hoppas, vi är nu bra med begreppen att läsa data från eller skriva data till en extern fil (naturligtvis kan det finnas andra sätt att göra samma sak än vad vi diskuterade ovan). Det skulle vara mycket användbart att göra en grundlig studie av filhantering i C (du kan hänvisa till alla bra C-självstudier eller böcker), eftersom det krävs mycket i många realtidsscenarier.
Scenario 6:Hur man hanterar korrelation när gränserna förändras
I korrelationshandledningen använde vi gränsbaserad korrelationsfunktion (er) för att fånga de dynamiska värdena från svaret. Men vad händer om vi har ett scenario där gränserna förändras? Det finns flera sätt att hantera sådana situationer. Låt oss se dessa i detalj.
a) Använda 'IC', 'DIG' och 'ALNUM' flaggor:
IC - Denna flagga instruerar VuGen att ignorera fall i vänster / höger gräns.
Exempel: Om den vänstra gränsen ibland är i versaler och ibland med små bokstäver använder vi den här flaggan.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
DIG – Denna flagga instruerar VuGen att ta hänsyn till valfritt nummer där den vilda karaktären '#' används i vänster / höger gräns.
bästa programmet för att övervaka GPU temp
Exempel: Om den vänstra gränsen (eller den högra gränsen) ändras så här (endast ett nummer på en viss position).
GJHi3rty
1GJHi8rty
GJHi7rty
Vi kan använda 'DIG' -flaggan som visas nedan eftersom den tar hand om det ändrade numret.
LB / DIG = GJHi # rty
al - Denna flagga instruerar VuGen att överväga varje enskild alfanumerisk karaktär där den vilda karaktären '^' används i vänster / höger gräns.
Exempel: Om den vänstra gränsen (eller den högra gränsen) ändras så här (endast ett alfanumeriskt tecken på en viss position).
GJHi3rty
GJHiKrty
GJHitrty
Vi kan använda ”ALNUM” -flaggan som visas nedan, eftersom den tar hand om det ändrade alfanumeriska tecknet
LB / ALNUM = GJHi ^ rty
Vi kan också använda två flaggor tillsammans - som 'ALNUMIC' som både är 'ALNUM' och 'IC'.
b) Använda attributen 'SaveLen' och 'SaveOffset':
Vi kan använda dessa två attribut för 'Web_reg_save_param' fungerar korrekt för att bara mata in den statiska delen av vänster / höger gränser.
c) Använda reguljära uttryck:
Vi kan använda 'Web_reg_save_param_regexp' korrelationsfunktion för att spara det dynamiska värdet (i en parameter) som matchar ett reguljärt uttryck.
Exempel: Låt oss säga att det dynamiska värdet vi vill fånga är '3959339' från den givna texten,
PriceControl_ctl01 'Namn = jack', 'Refid = 3959339' balans
Vi kan inte använda gränsbaserad korrelationsfunktion här eftersom värdet och längden på fältet som 'Namn' ovan kan ändras (och så kan vi inte använda det i vänster eller höger gräns).
Vi kan använda 'Web_reg_save_param_regexp' korrelationsfunktion som visas nedan för att ta hand om detta problem.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Regelbundna uttrycksgrupper placeras inom parentes och attributet 'Grupp' bestämmer vilken grupp som ska övervägas för att spara motsvarande matchning till den angivna parametern (i det första attributet).
Några matchningar av reguljära uttryck visas nedan:
d - matchar en enda siffra
w - matchar ett enda ord
(A-Z) + - matchar vilket ord som helst i versaler
(a-z) + - matchar valfritt ord med gemener
(0-9) + - matchar valfritt numeriskt värde
Scenario 7:Hur man skriver och använder en funktion i ett VuGen-skript
Som i alla andra programmeringsspråk kan vi skriva / definiera en funktion manuellt (vanligtvis kallad användardefinierad funktion) och använda den var som helst i VuGen-skriptet.
Låt oss anta att vi måste skicka ett unikt plannamn i varje begäran av ett visst skript. Så istället för att skriva den nödvändiga koden (som genererar ett unikt namn) flera gånger, kan vi definiera en funktion (som genererar ett unikt namn) och ringa in när som helst (och var som helst) det krävs i VuGen-skriptet.
Även om funktion i ett VuGen-skript kan skrivas inuti vilken åtgärd som helst, skrivs den vanligtvis inuti 'Globals.h' fil (under avsnittet Extra filer i VuGen-skriptet) eller i en nyskapad fil (under samma avsnitt 'Extra filer'). När funktionen väl har skrivits kan den anropas från valfri åtgärd (er).
Bilden nedan visar en användardefinierad funktion 'MyFunction' skriven i filen 'globals.h'.
Som diskuterats ovan är det andra sättet att skapa en ny fil och skriva funktionen inuti den.
Det enda du bör komma ihåg när du skapar en ny fil är att vi måste inkludera den i filen 'globals.h' (utan vilken VuGen inte känner igen den här filen).
Slutsats
Således i denna handledning såg vi hur vi skulle hantera några realtidsutmaningar i VuGen-skript och vi skulle uppenbarligen stöta på många andra scenarier när vi arbetar med olika applikationer.
Du skulle också ha insett att C-strängfunktioner och C-filåtgärder är mycket nödvändiga (och användbara) för att hantera olika scenarier. Jag skulle dock rekommendera dig att spendera lite tid på att bemästra dessa.
I vår nästa handledning kommer vi att se och förstå några viktiga fördefinierade funktioner som används i VuGen-skript (vi har redan sett några av funktionerna).
=> Besök här för en komplett serie LoadRunner-självstudier
PREV-handledning | NÄSTA självstudie
Rekommenderad läsning
- Test av webbtjänstens prestanda med LoadRunner VuGen Scripting
- Avancerat Unix Shell-skript: Arrayer, fil- och strängtestoperatörer, speciella variabler
- Lasttestning med HP LoadRunner-handledning
- Inspelningsalternativ för VUGen i LoadRunner
- Så här ställer du in LoadRunner VuGen-skriptfiler och Runtime-inställningar
- Viktiga LoadRunner-funktioner som används i VuGen-skript med exempel
- Introduktion till Micro Focus LoadRunner - Load Testing with LoadRunner Tutorial # 1
- JMeter BeanShell Scripting del 2