loadrunner vugen scripting challenges
Въведение в предизвикателствата, свързани с LoadRunner VuGen Scripting:
В това Информативна серия за обучение на LoadRunner , проучихме за Подобрения на скрипта на VuGen в предишния ни урок. От предишните ни уроци до сега постигнахме голям напредък с VuGen.
Научихме как да записваме скрипт в уеб HTTP / HTML протокол, как да се грижим за данни / стойности с корелация и параметризация, как да гарантираме дали отговорът е правилен с контролни точки, как да вмъкваме транзакции, които измерват скоростта и времето за реакция на потребителя действия и други неща.
С тях бихме могли да можем успешно да създаваме скриптове за почти всички уеб приложения.
=> Щракнете тук за пълна серия уроци по LoadRunner
LR език
Възможно е да има ситуации, в които трябва да изпълняваме по-предизвикателни задачи в VuGen скрипт. В този урок ще обсъдим някои от предизвикателствата за скриптове заедно с наличните техники за справяне с тях.
Преди да ги обсъдим, нека разберем няколко неща. VuGen (или Load Runner) може да разбира само собствения си език (нека го наречем LR език, LR е кратката форма на Load Runner). Така че какъвто и скрипт да генерира, може да се каже, че е на LR език. В езика LR има само един тип данни - String (и по-точно ‘LR String’).
Сега, за да направим подобрения в VuGen скрипт, обикновено използваме език C.
Знаем, че в езика C има много типове данни като int, char, float, long и т.н. Ако директно дефинираме и използваме C стойности в заявка, VuGen няма да разбере (тъй като разбира само „LR низове“) и ще изхвърли грешка. Така че трябва да преобразуваме всяка C стойност (от всеки тип данни) в „LR низ“, преди да я използваме в заявка.
След като разбрахме това, нека да преминем към някои предизвикателни сценарии в реално време.
Сценарий 1:Как да използвам C низ в заявка на VuGen
Да приемем, че в скрипт VuGen имаме заявка, която има поле, наречено „PlanName“ (приемете, че този скрипт е за някакво приложение за финансово планиране). Докато записвахме, въведохме стойността като „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 );
Да кажем, че искаме да използваме дефиниран от потребителя низ като име на плана.
И така, трябва да декларираме и дефинираме низ, както е показано по-долу
char sPlanName() = ' MyFinancialPlan ';
‘SPlanName’ е C низ и следователно трябва да го преобразуваме в LR низ (за да го използваме в заявката).
Правим това, като използваме функцията „lr_save_string“, както е показано по-долу:
lr_save_string(sPlanName,”LRPlanName”);
Тази функция присвоява стойност на параметъра / променливата LR. Отнема два атрибута - първият атрибут е източникът (C String), а вторият атрибут е дестинацията (LR параметър / променлива).
Така че тази функция запазва стойността на променливата C, която дефинирахме в параметъра LR „LRPlanName“.
Сега можем да заменим ‘LRPlanName’ като всеки друг параметър в заявката на 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 );
Имайте предвид, че когато стартираме този скрипт, всички Vusers и всички итерации ще имат същата стойност като името на плана. Така че, за да направим името на плана уникално за всяко изпълнение, можем да направим нещо подобно.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Тук „pVuserId“ и „pIteration“ са параметрите „Vuser ID“ и „Iteration Number“ (които обсъдихме в типовете параметри в предишните ни уроци). Те се използват в името на плана, за да се гарантира, че имаме уникални имена за всеки Vuser и итерация.
The ‘Lr_eval_string’ функция връща входния низ след оценка на всички вградени параметри. Така че, в този случай изходът на тази функция ще бъде „MyFinancialPlan_1_1“ за първата итерация на Vuser, „MyFinancialPlan_1_2“ за втората итерация на Vuser и така нататък.
И разбира се, знаем какво ‘Lr_save_string’ функция прави.
Сега можем да заместим параметъра ‘LRPlanName’, както е показано по-горе.
Сценарий 2:Как да конвертирате променлива на бегач на товар в C цяло число
В последния урок видяхме пример, за да разберем как ръчно предаваме или проваляме транзакция в зависимост от условие.
Пример:
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 ); }
Тук използвахме ‘if statement’ с атрибут ‘SaveCount’. Параметърът „WelcomeCount“, който запазва броя на вхожденията на текста, не може да се използва директно в условие „if“, тъй като е низ за изпълнение на зареждане. Така че този параметър трябва първо да бъде преобразуван в C низ и след това в C цяло число. ‘Lr_eval_string’ и „Atoi“ за това се използват (съответно) функции.
The „Atoi“ Функцията C преобразува C низ в C цяло число.
След това преобразуване това може да се използва като всяко друго C цяло число.
Сценарий 3:Как да изпратите произволна стойност в заявка
Много често срещаме сценарии за приложения, където трябва да изберем произволна стойност (да речем от падащо меню). Как се справяме с това в VuGen скриптове? Как да гарантираме, че за всяка итерация е избрана произволна стойност? Нека да видим това в детайли.
Нека вземем примера на нашето приложение „Web Tours“. Както видяхме по-рано, имаме страница „Намиране на полет“, където трябва да изберем полет.
Да кажем, че ние избираме първата в списъка. Съответната заявка в скрипта е като тази (където е избрана съответната стойност за полета).
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 );
Първо трябва да уловим съответните стойности за всичките четири полета от един от предишните отговори. Можем да направим това с помощта на корелационна функция (web_reg_save_param) с атрибут ‘ORD = ALL’ преди заявката, чийто отговор има тези стойности.
Резултатът от това ще бъде подобен на този, когато корелираният параметър ‘cFlight’ има масив от четири стойности, съответстващи на четирите полета.
Следващата стъпка ще бъде произволно да изберете една от тези стойности и да я изпратите в заявката. Това може да стане с помощта на ‘Lr_paramarr_random’ функция, както е показано по-долу.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Входът към ‘Lr_paramarr_random’ функция е масив от параметри и изходът е произволна стойност от този масив. Така че изходът на тази функция е една от четирите полетни стойности. И тъй като тази произволна стойност е LR низ, се използва функцията ‘lr_eval_string’ (за преобразуване на същата в C низ).
‘Strcpy’ Функцията C накрая копира тази стойност в променлива на C низ „flightVal“.
Сега отново трябва да преобразуваме тази променлива C String в LR низ, за да можем да изпратим заявката.
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:Как да разделя низ на символи
Да кажем, че има сценарий, при който трябва да разделим низ на парчета / символи. Да вземем примера от нашето приложение „Web Tours“, където от стойността на полета 020 ; 338; 03.03.2018 г. казваме, че трябва да използваме само ‘338’, тогава трябва да разделим този низ и да го съхраним в променлива.
Да го направя ‘Strtok’ функция се използва.
‘Strtok’ Функцията C връща маркер от низ, разделен от определени символи. След първото извикване трябва да предадем ‘NULL’ като стойност на низа, за да получим следващия маркер. Примерът по-долу показва как тази функция се използва за разделяне на стойността на полета въз основа на разделителя с точка и запетая (;).
Пример:
Да приемем, че полетната стойност се улавя от съответния отговор в параметъра „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); }
Резултатът от това може да се види в дневника за повторение.
Можем да копираме необходимия маркер в параметър и да го използваме.
Сценарий 5:Как да четем данни от и да записваме данни в текстов файл
Понякога може да се наложи да прочетете данни от външен файл или да запишете данни във външен файл. Нека да видим как правим това в VuGen скрипт.
Нека първо видим как да четем данни от текстов файл.
Пример: Да кажем, че трябва да прочетем XML от външен файл с данни и да го използваме като заявка в скрипта.
За целта използваме ‘Фрида’ C функция.
Тази функция отнема четири атрибута:
буфер - Буферът, в който да се съхранява потокът от данни.
размер - Размерът на буфера.
броя - Броят на байтовете за четене.
указател на файл - Файловият указател
Примерен код (с коментари) за същото
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 байта от текстовия файл. Очевидно е, че може да не знаем размера на файла винаги. Така че можем да използваме ‘Fseek’ и ‘Ftell’ C функции (ще оставя това за вас да проучите), за да намерите размера на файла и да използвате 'броя' атрибут на ‘Фрида’ функционират съответно.
Сега нека видим как да записваме данни в текстов файл.
Пример: Да предположим, че имаме скрипт, който създава поръчки и генерира „orderid“. Ако искаме да знаем всички идентификатори на поръчки, създадени от нашия скрипт в тест, можем да накараме нашия скрипт да копира тези идентификатори на поръчки във външен текстов файл.
„Fprintf“ - Функцията C записва форматиран изход във файл.
Тази функция приема тези атрибути:
указател на файл - Файловият указател
низ_формат - Форматираният низ за запис във файла.
аргументи - Един или повече незадължителни аргументи за печат.
Примерният код е показан по-долу. Да приемем, че сме свързали и запазили ‘orderid’ в параметъра ‘cOrderId’.
Пример:
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 */
Надяваме се, че вече се справяме добре с концепциите за четене на данни от или запис на данни във външен файл (разбира се, може да има и други начини да направим същото, освен това, което обсъдихме по-горе). Би било много полезно да се направи задълбочено проучване на файловите операции в C (можете да се обърнете към всякакви добри C уроци или книги), тъй като те са много необходими в много сценарии в реално време.
Сценарий 6:Как да се справим с корелацията, когато границите се променят
В урок „Корелации“ използвахме базирани на границата корелационни функции, за да уловим динамичните стойности от отговора. Но какво, ако имаме сценарий, при който границите се променят? Има няколко начина за справяне с подобни ситуации. Нека ги разгледаме в детайли.
а) Използване на флагове „IC“, „DIG“ и „ALNUM“:
ИНТЕГРАЛНА СХЕМА - Този флаг инструктира VuGen да игнорира регистъра в лявата / дясната граница.
Пример: Ако лявата граница е понякога с главни букви, а понякога с малки букви, ние използваме този флаг.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
ТИ - Този флаг инструктира VuGen да вземе предвид всяко отделно число, където дивият знак „#“ се използва в лявата / дясната граница.
какво е жизнения цикъл на разработката на софтуер?
Пример: Ако лявата граница (или дясната граница) се променя по този начин (само едно число в определена позиция).
GJHi3rty
1GJHi8rty
GJHi7rty
Можем да използваме флага „DIG“, както е показано по-долу, тъй като това ще се погрижи за променящия се номер.
LB / DIG = GJHi # rty
елша - Този флаг инструктира VuGen да разгледа всеки един буквено-цифров знак, където дивият знак „^“ се използва в лявата / дясната граница.
Пример: Ако лявата граница (или дясната граница) се променя по този начин (само един буквено-цифров знак в определена позиция).
GJHi3rty
GJHiKrty
GJHitrty
Можем да използваме флаг „ALNUM“, както е показано по-долу, тъй като това ще се погрижи за променящия се буквено-цифров знак
LB / ALNUM = GJHi ^ rty
Също така можем да използваме два флага заедно - като „ALNUMIC“, което е едновременно „ALNUM“ и „IC“.
б) Използване на атрибутите „SaveLen“ и „SaveOffset“:
Можем да използваме тези два атрибута на ‘Web_reg_save_param’ функционира по подходящ начин, за да въведе само статичната част от лявата / дясната граница.
в) Използване на регулярни изрази:
Можем да използваме ‘Web_reg_save_param_regexp’ корелационна функция за запазване на динамичната стойност (в параметър), която съответства на регулярен израз.
Пример: Да приемем, че динамичната стойност, която искаме да уловим, е „3959339“ от дадения текст,
PriceControl_ctl01 “Име = жак”, баланс “Refid = 3959339”
Тук не можем да използваме функция за корелация на граници, тъй като стойността и дължината на полето като „Име“ по-горе може да се променят (и затова не можем да го използваме в лявата или дясната граница).
Можем да използваме ‘Web_reg_save_param_regexp’ корелационна функция, както е показано по-долу, за да се погрижи за този проблем.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Групите с регулярни изрази се поставят в скоби и атрибутът ‘Group’ решава коя група да се вземе предвид за запазване на съответното съвпадение с посочения параметър (в първия атрибут).
По-долу са показани няколко съвпадения на регулярни изрази:
d - съвпада с една цифра
w - съвпада с една дума
(A-Z) + - съответства на която и да е дума с главни букви
(a-z) + - съответства на която и да е дума с малки букви
(0-9) + - съответства на всяка цифрова стойност
Сценарий 7:Как да напиша и използвам функция в VuGen скрипт
Както във всеки друг език за програмиране, ние можем да напишем / дефинираме функция ръчно (обикновено се нарича дефинирана от потребителя функция) и да я използваме навсякъде в скрипта VuGen.
Нека приемем, че трябва да изпращаме уникално име на план във всяка заявка на конкретен скрипт. Така че, вместо да пишем необходимия код (който генерира уникално име) няколко пъти, можем да дефинираме функция (която генерира уникално име) и да се обадим винаги, когато (и където и да е), това се изисква в скрипта VuGen.
Въпреки че функция във VuGen скрипт може да бъде написана във всяко действие, тя обикновено се записва в ‘Globals.h’ файл (в секцията Extra Files на VuGen скрипта) или в новосъздаден файл (в същия раздел „Extra Files“). Веднъж написана, функцията може да бъде извикана от всяко действие (а).
Изображението по-долу показва дефинирана от потребителя функция ‘MyFunction’, написана във файла ‘globals.h’.
Както беше обсъдено по-горе, другият начин е да създадете нов файл и да напишете функцията вътре в него.
Единственото нещо, което трябва да запомните при създаването на нов файл, е, че трябва да го включим във файла ‘globals.h’ (без който VuGen няма да разпознае този файл).
Заключение
По този начин в този урок видяхме как да се справим с някои предизвикателства в реално време в скриптове на VuGen и очевидно ще се натъкнем на много други сценарии, когато работим върху различни приложения.
Също така бихте разбрали, че функциите на C низ и операции с C файлове са много необходими (и полезни) при работа с различни сценарии. Въпреки това бих ви препоръчал да отделите малко време за овладяването им.
В следващия урок ще видим и разберем някои важни предварително дефинирани функции, които се използват в VuGen скриптове (някои от функциите вече ги видяхме).
=> Посетете тук за пълна серия уроци по LoadRunner
Препоръчително четене
- Тестване на производителността на уеб услуги с помощта на LoadRunner VuGen Scripting
- Разширени скриптове на черупки на Unix: масиви, оператори за тестване на файлове и низове, специални променливи
- Тестване на натоварване с уроци за HP LoadRunner
- Опции за запис на VUGen в LoadRunner
- Как да настроите LoadRunner VuGen Script файлове и настройки по време на работа
- Важни функции LoadRunner, използвани в VuGen скриптове с примери
- Въведение в Micro Focus LoadRunner - Тестване на натоварване с LoadRunner Урок # 1
- JMeter BeanShell Scripting Част 2