loadrunner vugen scripting challenges
Увод у изазове укључене у ЛоадРуннер ВуГен Сцриптинг:
У ово Информативна серија тренинга ЛоадРуннер , истраживали смо о Побољшања ВуГен скрипте у нашем претходном упутству. Од наших ранијих водича до сада, постигли смо велики напредак са ВуГеном.
Научили смо како да снимимо скрипту у веб ХТТП / ХТМЛ протокол, како да водимо рачуна о подацима / вредностима са корелацијом и параметризацијом, како да осигурамо да ли је одговор тачан са контролним тачкама, како да убацимо трансакције које мере брзину и време одзива корисника акције и друге ствари.
Помоћу њих бисмо могли успешно да креирамо скрипте за готово све веб апликације.
=> Кликните овде за комплетну серију водича за ЛоадРуннер
ЛР језик
Можда постоје ситуације у којима треба да радимо изазовније задатке у ВуГен скрипти. У овом упутству ћемо разговарати о неким изазовима скриптирања, заједно са техникама доступним за њихово решавање.
Пре него што разговарамо о њима, хајде да разумемо неколико ствари. ВуГен (или Лоад Руннер) може да разуме само свој језик (назовимо га као ЛР језик, ЛР је кратки облик Лоад Руннера). Дакле, за било коју скрипту коју генерише може се рећи да је на језику ЛР. У ЛР језику постоји само један тип података - Стринг (и тачније „ЛР Стринг“).
Сада, да бисмо побољшали ВуГен скрипту, обично користимо језик Ц.
Знамо да у језику Ц постоји много врста података попут инт, цхар, флоат, лонг итд. Ако директно дефинишемо и користимо вредности Ц у захтеву, ВуГен неће разумети (јер разуме само „ЛР низове“) и бациће грешка. Дакле, морамо претворити било коју Ц вредност (било ког типа података) у „ЛР стринг“ пре него што је употребимо у захтеву.
Схвативши ово, пређимо на неке изазовне сценарије у стварном времену.
Сценарио 1:Како се користи низ Ц у ВуГен захтеву
Претпоставимо да у ВуГен скрипти имамо захтев који има поље под називом „ПланНаме“ (претпоставимо да је ова скрипта за неку апликацију финансијског планирања). Током снимања унели смо вредност као „НевПлан“.
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 );
Рецимо да желимо да користимо кориснички дефинисани низ као назив плана.
Дакле, морамо декларисати и дефинисати низ као што је приказано доле
char sPlanName() = ' MyFinancialPlan ';
’СПланНаме’ је Ц низ и зато га морамо претворити у ЛР низ (да бисмо га користили у захтеву).
То радимо помоћу функције „лр_саве_стринг“ као што је приказано доле:
lr_save_string(sPlanName,”LRPlanName”);
Ова функција додељује вредност параметру / променљивој ЛР. Потребна су два атрибута - први атрибут је извор (Ц Стринг), а други атрибут је одредиште (ЛР параметар / променљива).
Дакле, ова функција чува вредност променљиве Ц коју смо дефинисали у ЛР параметар „ЛРПланНаме“.
Сада можемо да заменимо „ЛРПланНаме“ као било који други параметар у захтеву ВуГен.
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 );
Имајте на уму да ће приликом покретања ове скрипте сви Вусери и све итерације добити исту вредност као и назив плана. Дакле, како бисмо име плана учинили јединственим за сваку серију, можемо учинити нешто попут овог.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Овде су „пВусерИд“ и „пИтератион“ параметри „Вусер ИД“ и „Итератион Нумбер“ (о којима смо говорили у типовима параметара у нашим претходним водичима). Они се користе у називу плана како би се осигурало да имамо јединствена имена за сваки Вусер и итерацију.
Тхе ‘Лр_евал_стринг’ функција враћа улазни низ након процене било којих уграђених параметара. Дакле, у овом случају ће излаз ове функције бити „МиФинанциалПлан_1_1“ за прву Вусерову прву итерацију, „МиФинанциалПлан_1_2“ за прву Вусерову другу итерацију и тако даље.
И наравно, знамо шта „Лр_саве_стринг“ функција ради.
Сада можемо заменити параметар „ЛРПланНаме“ као што је приказано горе.
Сценарио 2:Како претворити променљиву покретача оптерећења у цели број Ц.
У последњем упутству видели смо пример да разумемо како ручно преносимо или неуспешно вршимо трансакцију у зависности од услова.
Пример:
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 ); }
Овде смо користили израз „иф“ са атрибутом „СавеЦоунт“. Параметар „ВелцомеЦоунт“ који чува број појављивања текста не може се директно користити у стању „иф“, јер је низ покретачког програма за учитавање. Дакле, овај параметар мора прво да се претвори у Ц низ, а затим у Ц цео број. ‘Лр_евал_стринг’ и „Атои“ функције се користе (односно) да се побрину за ово.
Тхе „Атои“ Ц функција претвара Ц низ у Ц цео број.
После ове конверзије, ово се може користити као било који други Ц цео број.
Сценарио 3:Како послати случајну вредност у захтеву
Врло често наилазимо на сценарије апликација где морамо да изаберемо случајну вредност (рецимо из падајућег менија). Како се носити са овим у ВуГен скриптама? Како осигуравамо да се за сваку итерацију изабере случајна вредност? Да видимо ово детаљно.
Узмимо пример наше апликације „Веб Тоурс“. Као што смо раније видели, имамо страницу „Пронађи лет“ на којој морамо одабрати лет.
Рецимо да смо изабрали прву на листи. Одговарајући захтев у скрипти је овакав (где је изабрана одговарајућа вредност за лет).
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 );
Прво морамо да ухватимо одговарајуће вредности за сва четири лета из једног од претходних одговора. То можемо учинити помоћу функције корелације (веб_рег_саве_парам) са атрибутом ‘ОРД = АЛЛ’ пре захтева чији одговор има ову вредност.
Резултат ће бити овакав, где корелирани параметар „цФлигхт“ има низ од четири вредности које одговарају четири лета.
Следећи корак био би случајним одабиром једне од ових вредности и предајом у захтеву. То се може учинити помоћу ‘Лр_парамарр_рандом’ функција као што је приказано доле.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Улаз у ‘Лр_парамарр_рандом’ функција је низ параметара, а излаз је случајна вредност из овог низа. Дакле, овде је излаз ове функције једна од четири вредности лета. А како је ова случајна вредност ЛР низ, користи се функција 'лр_евал_стринг' (за претварање исте у Ц низ).
„Стрцпи“ Функција Ц коначно копира ову вредност у променљиву низа Ц „флигхтВал“.
Сада поново морамо претворити ову променљиву Ц Стринга у ЛР низ да бисмо могли да пошаљемо захтев.
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:Како поделити низ у жетоне
Рецимо да постоји сценарио у којем морамо подијелити низ на дијелове / жетоне. Узмимо пример из наше апликације „Веб Тоурс“ од вредности лета 020 ; 338; 03.03.2018. Кажу да морамо да користимо само „338“, онда треба да поделимо овај низ и похранимо ово у променљиву.
Да уради ово ‘Стрток’ функција се користи.
'Стрток' Функција Ц враћа токен из низа ограниченог наведеним знаковима. Након првог позивања, морамо да проследимо „НУЛЛ“ као вредност низа да бисмо добили следећи токен. Пример у наставку показује како се ова функција користи за поделу вредности лета на основу разграничења са зарезом (;).
Пример:
Претпоставимо да се вредност лета бележи из релевантног одговора у параметар „цФлигхт“.
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); }
Резултат овога се може видети у евиденцији понављања.
Тражени токен можемо копирати у параметар и користити га.
Сценарио 5:Како се читају подаци и записују подаци у текстуалну датотеку
Понекад ће бити потребно читати податке из спољне датотеке или писати податке у спољну датотеку. Погледајмо како то радимо у ВуГен скрипти.
Прво да видимо како да читамо податке из текстуалне датотеке.
Пример: Рецимо да морамо да читамо КСМЛ из спољне датотеке података и да га користимо као захтев у скрипти.
Да бисмо то урадили, користимо ‘Фреад’ Ц функција.
Ова функција има четири атрибута:
тампон - Ме успремник у који се смешта ток података.
величина - Величина бафера.
рачунати - Број бајтова за читање.
показивач_датотеке - показивач датотеке
Пример кода (са коментарима) за исти
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
Имајте на уму да у коду приказаном горе читамо 500 бајтова из текстуалне датотеке. Очигледно је да можда не знамо величину датотеке увек. Тако да можемо користити ‘Фсеек’ и ‘Фтелл’ Ц функције (оставићу ово вама да истражите) да бисте пронашли величину датотеке и користили ‘Рачунати’ атрибут ‘Фреад’ функционишу у складу са тим.
Сада да видимо како да запишемо податке у текстуалну датотеку.
Пример: Рецимо да имамо скрипту која креира поруџбине и генерише „ордерид“. Ако желимо да знамо све ИД-ове налога које је креирала наша скрипта у тесту, можемо учинити да наша скрипта копира ове ИД-ове налога у спољну текстуалну датотеку.
„Фпринтф“ - Ц функција записује форматирани излаз у датотеку.
Ова функција узима ове атрибуте:
показивач_датотеке - показивач датотеке
формат_стринг - Форматирани низ за писање у датотеку.
аргс - Један или више опционалних аргумената за штампу.
Пример кода је приказан испод. Претпоставимо да смо корелирали и сачували „ордерид“ у параметру „цОрдерИд“.
Пример:
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 */
Надамо се да смо сада добри са концептима читања података из или уписивања података у спољну датотеку (наравно, могу постојати и други начини да се уради иста ствар од онога о чему смо горе говорили). Било би врло корисно темељито проучити рад са датотекама на језику Ц (можете се позвати на било који добар Ц водич или књигу), јер су они веома потребни у многим сценаријима у стварном времену.
Сценарио 6:Како се носити са корелацијом када се границе мењају
У водичу за корелације користили смо функције корелације засноване на границама да бисмо ухватили динамичке вредности из одговора. Али, шта ако имамо сценарио где се границе мењају? Постоји неколико начина решавања таквих ситуација. Погледајмо их детаљно.
а) Коришћењем заставица „ИЦ“, „ДИГ“ и „АЛНУМ“:
ИЦ - Ова заставица налаже ВуГену да занемари случај на лијевој / десној граници.
Пример: Ако је лева граница понекад велика, а понекад мала, користимо ову заставицу.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
ТИ - Ова заставица упућује ВуГен да узме у обзир било који појединачни број где се дивљи знак „#“ користи на левој / десној граници.
главни фокус испитивања прихватљивости је
Пример: Ако се лева граница (или десна граница) мења овако (само један број на одређеној позицији).
ГЈХи3рти
1ГЈХи8рти
ГЈХи7рти
Можемо користити заставицу „ДИГ“ као што је приказано доле, јер ће се то побринути за промену броја.
ЛБ / ДИГ = ГЈХи # рти
јоха - Ова заставица упућује ВуГен да размотри било који алфанумерички знак где се дивљи знак „^“ користи на левој / десној граници.
Пример: Ако се лева граница (или десна граница) овако мења (само један алфанумерички знак на одређеној позицији).
ГЈХи3рти
ГЈХиКрти
ГЈХитрти
Можемо да користимо ознаку „АЛНУМ“ као што је приказано у наставку, јер ће се то побринути за промену алфанумеричког карактера
ЛБ / АЛНУМ = ГЈХи ^ рти
Такође, можемо заједно да користимо две заставе - попут „АЛНУМИЦ“, што је и „АЛНУМ“ и „ИЦ“.
б) Коришћење атрибута „СавеЛен“ и „СавеОффсет“:
Можемо користити ова два атрибута ‘Веб_рег_саве_парам’ функционише на одговарајући начин да унесе само статички део леве / десне границе.
ц) Употреба регуларних израза:
Можемо да користимо ‘Веб_рег_саве_парам_регекп’ корелациона функција за чување динамичке вредности (у параметар) која се подудара са регуларним изразом.
Пример: Рецимо да је динамичка вредност коју желимо да снимимо ‘3959339’ из датог текста,
ПрицеЦонтрол_цтл01 „Име = прикључак“, стање „Рефид = 3959339“
Овде не можемо да користимо функцију корелације засновану на граници, јер се вредност и дужина поља као што је „Име“ горе може променити (па је не можемо користити на левој или десној граници).
Можемо да користимо ‘Веб_рег_саве_парам_регекп’ корелациона функција као што је приказано у наставку како би се решио овај проблем.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Групе регуларних израза стављају се у заграде и атрибут ‘Гроуп’ одлучује коју групу треба узети у обзир за чување одговарајућег подударања са наведеним параметром (у првом атрибуту).
У наставку је приказано неколико подударања регуларних израза:
д - одговара једноцифреној цифри
в - одговара једној речи
(А-З) + - подудара се са било којом речју великим словом
(а-з) + - подудара се са било којом речју малим словом
(0-9) + - одговара било којој нумеричкој вредности
Сценарио 7:Како написати и користити функцију у ВуГен скрипти
Као и у било ком другом програмском језику, функцију можемо писати / дефинисати ручно (обично се назива кориснички дефинисана функција) и користити је било где у ВуГен скрипти.
Претпоставимо да у сваком захтеву одређене скрипте морамо послати јединствено име плана. Дакле, уместо да више пута напишемо тражени код (који генерише јединствено име), можемо да дефинишемо функцију (која генерише јединствено име) и да се јавимо кад год (и где год) то буде потребно у скрипти ВуГен.
Иако се функција у ВуГен скрипти може написати унутар било које радње, она је обично написана унутар ‘Глобалс.х’ датотеку (у одељку Додатне датотеке скрипте ВуГен) или у новоствореној датотеци (у истом одељку „Додатне датотеке“). Једном написана, функција се може позвати из било које радње.
На слици испод приказана је кориснички дефинисана функција „МиФунцтион“ записана у датотеци „глобалс.х“.
Као што је горе речено, други начин је креирање нове датотеке и писање функције у њу.
Једино што треба имати на уму приликом креирања нове датотеке је да је морамо укључити у датотеку ‘глобалс.х’ (без које ВуГен неће препознати ову датотеку).
Закључак
Тако смо у овом упутству видели како се носити са неким изазовима у стварном времену у ВуГен скриптирању и очигледно бисмо наишли на многе друге сценарије када радимо на разним апликацијама.
Такође, схватили бисте да су функције Ц низа и операције Ц датотека веома потребне (и корисне) за руковање разним сценаријима. Међутим, препоручио бих вам да мало времена савладате.
У нашем следећем упутству видећемо и разумети неке важне унапред дефинисане функције које се користе у ВуГен скриптама (неке функције смо већ видели).
=> Посетите овде за комплетну серију водича за ЛоадРуннер
ПРЕВ Туториал |. | СЛЕДЕЋА Лекција
Препоручено читање
- Тестирање перформанси веб услуга помоћу ЛоадРуннер ВуГен скриптирања
- Напредно скрипта скрипте за Уник: низови, оператери за тестирање датотека и низова, посебне променљиве
- Испитивање оптерећења помоћу ХП ЛоадРуннер водича
- ВУГен опције снимања у ЛоадРуннер-у
- Како поставити ЛоадРуннер ВуГен Сцрипт датотеке и поставке рунтиме-а
- Важне функције ЛоадРуннер-а које се користе у ВуГен скриптама са примерима
- Увод у Мицро Фоцус ЛоадРуннер - Тестирање оптерећења помоћу ЛоадРуннер водича бр. 1
- ЈМетер БеанСхелл Сцриптинг 2. део