loadrunner vugen scripting challenges
Вступ до викликів сценаріїв LoadRunner VuGen:
У цьому Інформативна навчальна серія 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), а другий - пункт призначення (параметр / змінна 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» та «Номер ітерації» (які ми обговорювали в типах параметрів у наших попередніх навчальних посібниках). Вони використовуються в назві плану, щоб гарантувати, що ми маємо унікальні імена для кожного Vuser та ітерації.
‘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' з атрибутом 'SaveCount'. Параметр 'WelcomeCount', який зберігає кількість повторень тексту, не може бути використаний безпосередньо в умові 'if', оскільки це рядок запуску завантаження. Отже, цей параметр потрібно перетворити спочатку у рядок C, а потім у ціле число C. ‘Lr_eval_string’ і «Atoi» для цього використовуються (відповідно) функції.
«Atoi» Функція C перетворює рядок C у ціле число C.
Після цього перетворення це можна використовувати як будь-яке інше ціле число C.
Сценарій 3:Як надіслати випадкове значення в запиті
Дуже часто ми стикаємось із сценаріями додатків, де нам доводиться вибирати випадкове значення (скажімо, зі спадного меню). Як ми впораємося з цим у сценаріях VuGen? Як ми гарантуємо, що для кожної ітерації вибирається випадкове значення? Подивимось це докладно.
Візьмемо приклад нашої програми „Веб-тури”. Як ми вже бачили раніше, у нас є сторінка „Знайти рейс”, де ми повинні вибрати рейс.

Скажімо, ми вибрали перший у списку. Відповідний запит у сценарії є таким (де вибрано відповідне значення для польоту).
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:Як розділити рядок на лексеми
Скажімо, існує сценарій, коли нам потрібно розділити рядок на частини / маркери. Давайте візьмемо приклад із нашої програми „Веб-тури”, де з вартості польоту 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 (я залишу це для вас для вивчення), щоб знайти розмір файлу та використовувати файл 'рахувати' атрибут «Фрід» функціонують відповідно.
Тепер давайте подивимося, як записати дані у текстовий файл.
Приклад: Скажімо, у нас є сценарій, який створює замовлення та генерує 'порядок'. Якщо ми хочемо знати всі ідентифікатори замовлень, створені нашим сценарієм у тесті, ми можемо змусити наш сценарій скопіювати ці ідентифікатори замовлення у зовнішній текстовий файл.
„Fprintf“ - Функція C записує відформатований вихід у файл.
Ця функція приймає такі атрибути:
покажчик_файлу - вказівник на файл
format_string - Відформатований рядок для запису у файл.
аргументи - Один або кілька необов’язкових аргументів друку.
Приклад коду показано нижче. Припустимо, ми співвідносимо та зберігаємо «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“:
IC - Цей прапорець вказує VuGen ігнорувати регістр на лівій / правій межі.
Приклад: Якщо ліва межа іноді має верхній регістр, а інколи нижній регістр, ми використовуємо цей прапор.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST); ВИ - Цей прапорець дає вказівку VuGen враховувати будь-яке окреме число, де на лівій / правій межі використовується дикий символ «#».
безкоштовний редактор сценаріїв оболонки для Windows -
Приклад: Якщо ліва межа (або права межа) змінюється таким чином (лише одне число в певній позиції).
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’ файл (у розділі «Додаткові файли» сценарію VuGen) або всередині нещодавно створеного файлу (у тому ж розділі «Додаткові файли»). Після написання функції можна викликати будь-які дії.
На зображенні нижче показана визначена користувачем функція «MyFunction», записана всередині файлу «globals.h».

Як обговорювалося вище, інший спосіб - створити новий файл і записати в нього функцію.



Єдине, що слід пам’ятати під час створення нового файлу, це те, що ми повинні включити його до файлу ‘globals.h’ (без якого VuGen не розпізнає цей файл).

Висновок
Таким чином, у цьому підручнику ми побачили, як вирішувати деякі проблеми в режимі реального часу у сценаріях VuGen, і ми, очевидно, стикаємося з багатьма іншими сценаріями, коли працюємо над різними програмами.
Крім того, ви б зрозуміли, що функції рядків C та операції з файлами C дуже потрібні (і корисні) при обробці різних сценаріїв. Однак я б порекомендував витратити трохи часу на їх освоєння.
У нашому наступному підручнику ми побачимо та зрозуміємо деякі важливі заздалегідь визначені функції, які використовуються у сценаріях VuGen (деякі функції ми вже бачили).
=> Відвідайте тут, щоб отримати повну серію підручників із LoadRunner
НАЗАД Підручник | НАСТУПНИЙ підручник
Рекомендована література
- Тестування продуктивності веб-служб за допомогою сценаріїв LoadRunner VuGen
- Розширений скрипт оболонки Unix: масиви, оператори тестування файлів і рядків, спеціальні змінні
- Тестування навантаження за допомогою підручників HP LoadRunner
- Параметри запису VUGen у LoadRunner
- Як налаштувати файли сценарію LoadRunner VuGen та параметри виконання
- Важливі функції LoadRunner, які використовуються у сценаріях VuGen із прикладами
- Вступ до Micro Focus LoadRunner - Тестування навантаження за допомогою підручника №1 для LoadRunner
- Сценарії JMeter BeanShell, частина 2