loadrunner vugen scripting challenges
Úvod do výzev zapojených do skriptování LoadRunner VuGen:
V tomhle Informativní řada školení LoadRunner , prozkoumali jsme asi Vylepšení skriptu VuGen v našem předchozím tutoriálu. Od našich dřívějších tutoriálů až dosud jsme s VuGen udělali velký pokrok.
Naučili jsme se, jak zaznamenat skript do webového protokolu HTTP / HTML, jak se starat o data / hodnoty s korelací a parametrizací, jak zajistit, aby byla odpověď správná s kontrolními body, jak vložit transakce, které měří rychlost a dobu odezvy uživatele akce a další věci.
Díky nim bychom měli být schopni úspěšně vytvářet skripty pro téměř všechny webové aplikace.
=> Kliknutím sem zobrazíte kompletní řadu výukových programů LoadRunner
Jazyk LR
Mohou nastat situace, kdy budeme muset ve skriptu VuGen dělat náročnější úkoly. V tomto tutoriálu probereme některé skriptovací výzvy spolu s technikami dostupnými k jejich zvládnutí.
Než o tom budeme diskutovat, pochopme několik věcí. VuGen (nebo Load Runner) dokáže porozumět pouze svému vlastnímu jazyku (řekněme tomu jazyk LR, LR je krátká forma Load Runner). Takže jakýkoli skript, který generuje, lze říci, že je v jazyce LR. V jazyce LR existuje pouze jeden datový typ - String (a přesněji „LR String“).
Nyní, abychom mohli vylepšit skript VuGen, obecně používáme jazyk C.
Víme, že v jazyce C existuje mnoho datových typů, jako jsou int, char, float, long atd. Pokud v požadavku přímo definujeme a použijeme hodnoty C, VuGen to nepochopí (protože rozumí pouze řetězcům LR) a vyhodí chyba. Před použitím v žádosti tedy musíme převést libovolnou hodnotu C (jakéhokoli datového typu) na ‚řetězec LR‘.
Po pochopení toho pojďme k některým náročným scénářům v reálném čase.
Scénář 1:Jak používat řetězec C v požadavku VuGen
Předpokládejme, že ve skriptu VuGen máme požadavek, který má pole s názvem „PlanName“ (předpokládejme, že tento skript je pro některé aplikace finančního plánování). Během nahrávání jsme zadali hodnotu jako „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 );
Řekněme, že chceme jako název plánu použít uživatelem definovaný řetězec.
Takže musíme deklarovat a definovat řetězec, jak je znázorněno níže
char sPlanName() = ' MyFinancialPlan ';
„SPlanName“ je řetězec C, a proto ho musíme převést na řetězec LR (abychom jej mohli použít v požadavku).
Děláme to pomocí funkce „lr_save_string“, jak je znázorněno níže:
lr_save_string(sPlanName,”LRPlanName”);
Tato funkce přiřadí hodnotu parametru / proměnné LR. Trvá dva atributy - První atribut je zdroj (C String) a druhý atribut je cíl (parametr / proměnná LR).
Tato funkce tedy uloží hodnotu proměnné C, kterou jsme definovali, do parametru LR „LRPlanName“.
Nyní můžeme nahradit „LRPlanName“ jako jakýkoli jiný parametr v požadavku 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 );
Všimněte si, že když spustíme tento skript, všechny Vusery a všechny iterace budou mít stejnou hodnotu jako název plánu. Aby byl název plánu pro každý běh jedinečný, můžeme udělat něco takového.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Zde jsou parametry „pVuserId“ a „pIteration“ parametry „Vuser ID“ a „Iteration Number“ (o kterých jsme diskutovali v typech parametrů v našich předchozích cvičeních). Používají se v názvu plánu, aby bylo zajištěno, že máme jedinečné názvy pro každý Vuser a iteraci.
The „Lr_eval_string“ funkce vrátí vstupní řetězec po vyhodnocení všech vložených parametrů. V tomto případě tedy bude výstupem této funkce „MyFinancialPlan_1_1“ pro první iteraci Vuser, „MyFinancialPlan_1_2“ pro první iteraci Vuser atd.
A samozřejmě víme co „Lr_save_string“ funkce ano.
Nyní můžeme nahradit parametr „LRPlanName“, jak je uvedeno výše.
Scénář 2:Jak převést proměnnou load runner na celé číslo C.
V posledním kurzu jsme viděli příklad, abychom pochopili, jak ručně předáváme nebo selháváme transakci v závislosti na podmínce.
Příklad:
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 ); }
Zde jsme použili „if statement“ s atributem „SaveCount“. Parametr „WelcomeCount“, který ukládá počet výskytů textu, nelze použít přímo ve stavu „if“, protože se jedná o řetězec běžec načítání. Tento parametr tedy musí být nejprve převeden na řetězec C a poté na celé číslo C. „Lr_eval_string“ a „Atoi“ k tomu se používají (respektive) funkce.
The „Atoi“ Funkce C převádí řetězec C na celé číslo C.
Po tomto převodu lze toto použít jako jakékoli jiné celé číslo C.
Scénář 3:Jak odeslat náhodnou hodnotu v požadavku
Velmi často narazíme na scénáře aplikace, kde musíme vybrat náhodnou hodnotu (řekněme z rozevíracího seznamu). Jak to zvládneme ve skriptech VuGen? Jak zajistíme, aby byla pro každou iteraci vybrána náhodná hodnota? Podívejme se na to podrobně.
Vezměme si příklad naší aplikace „Web Tours“. Jak jsme viděli dříve, máme stránku „Najít let“, kde musíme vybrat let.
Řekněme, že vybereme první v seznamu. Odpovídající požadavek ve skriptu je takový (kde je vybrána odpovídající hodnota letu).
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 );
Nejprve musíme zachytit odpovídající hodnoty pro všechny čtyři lety z jedné z předchozích odpovědí. Můžeme to udělat pomocí korelační funkce (web_reg_save_param) s atributem „ORD = ALL“ před požadavkem, jehož odpověď má tuto hodnotu.
Výstup tohoto bude takový, kde korelovaný parametr „cFlight“ má pole čtyř hodnot odpovídajících čtyřem letům.
Dalším krokem by bylo náhodně vybrat jednu z těchto hodnot a odeslat do žádosti. To lze provést pomocí „Lr_paramarr_random“ funkce, jak je znázorněno níže.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Vstup do „Lr_paramarr_random“ funkce je pole parametrů a výstup je náhodná hodnota z tohoto pole. Zde je tedy výstupem této funkce jedna ze čtyř letových hodnot. A protože tato náhodná hodnota je řetězec LR, používá se funkce „lr_eval_string“ (k převodu stejné hodnoty na řetězec C).
‚Strcpy ' Funkce C nakonec tuto hodnotu zkopíruje do proměnné řetězce C „flightVal“.
Nyní znovu musíme převést tuto proměnnou C String na řetězec LR, abychom mohli odeslat požadavek.
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 );
Scénář 4:Jak rozdělit řetězec na tokeny
Řekněme, že existuje scénář, kdy musíme rozdělit řetězec na kousky / žetony. Vezměme si příklad z naší aplikace „Web Tours“, kde z hodnoty letu 020 ; 338; 04/03/2018 říká, že musíme použít pouze „338“, pak musíme tento řetězec rozdělit a uložit do proměnné.
Udělat toto ‚Strtok‘ je použita funkce.
‚Strtok‘ Funkce C vrací token z řetězce odděleného zadanými znaky. Po prvním vyvolání musíme předat „NULL“ jako hodnotu řetězce, abychom získali další token. Následující příklad ukazuje, jak se tato funkce používá k rozdělení letové hodnoty na základě oddělovače středníku (;).
Příklad:
Předpokládejme, že hodnota letu je zachycena z příslušné odpovědi do parametru „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); }
Výstup z toho lze vidět v záznamu přehrávání.
Můžeme zkopírovat požadovaný token do parametru a použít ho.
Scénář 5:Jak číst data a zapisovat data do textového souboru
Někdy může být nutné číst data z externího souboru nebo zapisovat data do externího souboru. Podívejme se, jak to děláme ve skriptu VuGen.
Nejprve se podívejme, jak číst data z textového souboru.
Příklad: Řekněme, že musíme načíst XML z externího datového souboru a použít jej jako požadavek ve skriptu.
K tomu používáme ‚Strach ' Funkce C.
Tato funkce má čtyři atributy:
nárazník - Vyrovnávací paměť, do které se má ukládat datový proud.
velikost - Velikost vyrovnávací paměti.
počet - Počet bajtů ke čtení.
file_pointer - Ukazatel souboru
Příklad kódu (s komentáři) pro totéž
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
Všimněte si, že v kódu zobrazeném výše jsme z textového souboru načetli 500 bajtů. Je zřejmé, že velikost souboru nemusíme znát vždy. Takže můžeme použít ‚Fseek‘ a „Ftell“ Funkce C (nechám to na prozkoumání) k vyhledání velikosti souboru a použití 'počet' atribut ‚Strach ' odpovídajícím způsobem.
Nyní se podívejme, jak zapisovat data do textového souboru.
Příklad: Řekněme, že máme skript, který vytváří objednávky a generuje „orderid“. Pokud chceme v testu znát všechna ID objednávek vytvořená naším skriptem, můžeme náš skript nechat zkopírovat tato ID objednávek do externího textového souboru.
‚Fprintf ' - Funkce C zapíše formátovaný výstup do souboru.
Tato funkce má tyto atributy:
file_pointer - Ukazatel souboru
řetězec_formátu - Formátovaný řetězec pro zápis do souboru.
args - Jeden nebo více volitelných tiskových argumentů.
Ukázkový kód je uveden níže. Předpokládejme, že jsme korelovali a uložili „orderid“ do parametru „cOrderId“.
Příklad:
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 */
Doufám, že nyní dokážeme dobře číst data z nebo zapisovat data do externího souboru (samozřejmě mohou existovat i jiné způsoby, jak dělat totéž, než o čem jsme diskutovali výše). Bylo by velmi užitečné provést důkladnou studii o souborových operacích v jazyce C (můžete se obrátit na jakékoli dobré výukové programy nebo knihy v jazyce C), protože ty jsou v mnoha scénářích v reálném čase velmi potřebné.
Scénář 6:Jak zacházet s korelací, když se hranice mění
V tutoriálu Korelace jsme použili mezní korelační funkce k zachycení dynamických hodnot z odpovědi. Ale co když máme scénář, kdy se hranice mění? Existuje několik způsobů řešení takových situací. Podívejme se na to podrobně.
a) Použití příznaků „IC“, „DIG“ a „ALNUM“:
IC - Tento příznak dává VuGenu pokyn ignorovat velká a malá písmena na hranici vlevo / vpravo.
Příklad: Pokud je levá hranice někdy velkými a někdy malými písmeny, použijeme tento příznak.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
VY - Tento příznak dává VuGenu pokyn, aby zvážil jakékoli jednotlivé číslo, kde se divoký znak „#“ používá na levé / pravé hranici.
falešná e-mailová adresa, kterou mohu použít
Příklad: Pokud se takto mění levá hranice (nebo pravá hranice) (pouze jedno číslo na konkrétní pozici).
GJHi3rty
1GJHi8rty
GJHi7rty
Můžeme použít příznak „DIG“, jak je znázorněno níže, protože ten se postará o měnící se číslo.
LB/DIG= GJHi#rty
olše - Tento příznak dává VuGenu pokyn, aby zvážil jakýkoli jeden alfanumerický znak, kde se divoký znak „^“ používá na levé / pravé hranici.
Příklad: Pokud se takto mění levá hranice (nebo pravá hranice) (pouze jeden alfanumerický znak na konkrétní pozici).
GJHi3rty
GJHiKrty
GJHitrty
Můžeme použít příznak „ALNUM“, jak je znázorněno níže, protože se postará o měnící se alfanumerický znak
LB/ALNUM= GJHi^rty
Můžeme také použít dva příznaky společně - například „ALNUMIC“, což je „ALNUM“ a „IC“.
b) Použití atributů „SaveLen“ a „SaveOffset“:
Můžeme použít tyto dva atributy „Web_reg_save_param“ fungovat odpovídajícím způsobem k zadání pouze statické části levé / pravé hranice.
c) Používání regulárních výrazů:
Můžeme použít „Web_reg_save_param_regexp“ korelační funkce pro uložení dynamické hodnoty (do parametru), která odpovídá regulárnímu výrazu.
Příklad: Řekněme, že dynamická hodnota, kterou chceme zachytit, je z daného textu „3959339“,
PriceControl_ctl01 „Name = jack“, „Refid = 3959339“ zůstatek
Zde nemůžeme použít hraniční korelační funkci, protože hodnota a délka pole jako „Název“ výše se mohou změnit (a proto jej nemůžeme použít na levé nebo pravé hranici).
Můžeme použít „Web_reg_save_param_regexp“ korelační funkce, jak je uvedeno níže, aby se tento problém vyřešil.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Skupiny regulárních výrazů jsou uvedeny v závorkách a atribut ‘Skupina’ rozhoduje, kterou skupinu zvážit pro uložení odpovídající shody se zadaným parametrem (v prvním atributu).
Níže je uvedeno několik shody regulárních výrazů:
d - odpovídá jedné číslici
w - odpovídá jednomu slovu
(A-Z) + - odpovídá libovolnému slovu s velkými písmeny
(a-z) + - odpovídá jakémukoli slovu malými písmeny
(0-9) + - odpovídá jakékoli číselné hodnotě
Scénář 7:Jak psát a používat funkci ve skriptu VuGen
Stejně jako v jakémkoli jiném programovacím jazyce můžeme funkci psát / definovat ručně (obvykle se nazývá funkce definovaná uživatelem) a použít ji kdekoli ve skriptu VuGen.
Předpokládejme, že v každém požadavku konkrétního skriptu musíme poslat jedinečný název plánu. Takže místo toho, abychom několikrát psali požadovaný kód (který generuje jedinečný název), můžeme definovat funkci (která generuje jedinečný název) a zavolat kdykoli (a kdekoli) ve skriptu VuGen.
Přestože lze funkci ve skriptu VuGen zapsat do jakékoli akce, obvykle se píše uvnitř „Globals.h“ souboru (v části Extra Files ve skriptu VuGen) nebo uvnitř nově vytvořeného souboru (ve stejné sekci „Extra Files“). Jakmile je funkce napsána, lze ji volat z jakékoli akce.
Na následujícím obrázku je uživatelsky definovaná funkce „MyFunction“ napsaná uvnitř souboru „globals.h“.
Jak již bylo uvedeno výše, dalším způsobem je vytvoření nového souboru a zápis funkce do něj.
Při vytváření nového souboru je třeba pamatovat pouze na to, že jej musíme zahrnout do souboru „globals.h“ (bez kterého VuGen tento soubor nerozpozná).
Závěr
V tomto výukovém programu jsme tedy viděli, jak zvládnout některé výzvy v reálném čase ve skriptování VuGen, a při práci na různých aplikacích bychom samozřejmě narazili na mnoho dalších scénářů.
Také byste si uvědomili, že funkce řetězce C a operace se soubory C jsou velmi potřebné (a užitečné) při zpracování různých scénářů. Doporučil bych vám však strávit nějaký čas jejich zvládnutím.
V našem dalším tutoriálu uvidíme a pochopíme některé důležité předdefinované funkce, které se používají ve skriptech VuGen (některé funkce jsme již viděli).
=> Navštivte zde a získejte kompletní řadu výukových programů LoadRunner
Výukový program PREV | DALŠÍ výuka
Doporučené čtení
- Testování výkonu webových služeb pomocí skriptování LoadRunner VuGen
- Pokročilé skriptování prostředí Unix: pole, operátory testování souborů a řetězců, speciální proměnné
- Testování zátěže s výukovými programy HP LoadRunner
- Možnosti nahrávání VUGen v LoadRunneru
- Jak nastavit soubory skriptu LoadRunner VuGen a nastavení běhového prostředí
- Důležité funkce LoadRunner používané ve skriptech VuGen s příklady
- Úvod do nástroje Micro Focus LoadRunner - testování zatížení pomocí průvodce LoadRunner # 1
- Skriptování JMeter BeanShell, část 2