loadrunner vugen scripting challenges
Wprowadzenie do wyzwań związanych ze skryptami LoadRunner VuGen:
W tym Informacyjna seria szkoleń LoadRunner , zbadaliśmy Ulepszenia skryptów VuGen w naszym poprzednim samouczku. Od naszych wcześniejszych samouczków do tej pory zrobiliśmy duży postęp w VuGen.
Dowiedzieliśmy się, jak zapisać skrypt w protokole WWW HTTP / HTML, jak dbać o dane / wartości z korelacją i parametryzacją, jak zapewnić poprawną odpowiedź z punktami kontrolnymi, jak wstawiać transakcje mierzące szybkość i czas odpowiedzi użytkownika działania i inne rzeczy.
Dzięki nim powinniśmy być w stanie z powodzeniem tworzyć skrypty dla prawie wszystkich aplikacji internetowych.
=> Kliknij tutaj, aby uzyskać pełną serię samouczków LoadRunner
Język LR
Mogą zaistnieć sytuacje, w których będziemy musieli wykonać trudniejsze zadania w skrypcie VuGen. W tym samouczku omówimy niektóre wyzwania związane ze skryptami oraz dostępne techniki ich rozwiązywania.
Zanim je omówimy, zrozumiemy kilka rzeczy. VuGen (lub Load Runner) może rozumieć tylko swój własny język (nazwijmy go językiem LR, LR to skrót od Load Runner). Więc każdy skrypt, który generuje, można powiedzieć, że jest w języku LR. W języku LR istnieje tylko jeden typ danych - String (a dokładniej „LR String”).
Teraz, aby wprowadzić ulepszenia w skrypcie VuGen, zwykle używamy języka C.
Wiemy, że w języku C istnieje wiele typów danych, takich jak int, char, float, long itp. Jeśli bezpośrednio zdefiniujemy i użyjemy wartości C w żądaniu, VuGen nie zrozumie (ponieważ rozumie tylko „ciągi LR”) i wyrzuci błąd. Musimy więc przekonwertować dowolną wartość C (dowolnego typu danych) na „ciąg LR” przed użyciem jej w żądaniu.
Po zrozumieniu tego przejdźmy do niektórych trudnych scenariuszy w czasie rzeczywistym.
Scenariusz 1:Jak używać ciągu C w żądaniu VuGen
Załóżmy, że w skrypcie VuGen mamy żądanie zawierające pole o nazwie „PlanName” (załóżmy, że ten skrypt jest przeznaczony dla jakiejś aplikacji do planowania finansowego). Podczas nagrywania wprowadziliśmy wartość jako „Nowy plan”.
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 );
Powiedzmy, że jako nazwę planu chcemy użyć ciągu zdefiniowanego przez użytkownika.
Musimy więc zadeklarować i zdefiniować ciąg, jak pokazano poniżej
char sPlanName() = ' MyFinancialPlan ';
„SPlanName” jest łańcuchem C i dlatego musimy go przekonwertować na ciąg LR (aby użyć go w żądaniu).
Robimy to za pomocą funkcji „lr_save_string”, jak pokazano poniżej:
lr_save_string(sPlanName,”LRPlanName”);
Ta funkcja przypisuje wartość do parametru / zmiennej LR. Przyjmuje dwa atrybuty - pierwszy atrybut to źródło (ciąg C), a drugi to miejsce docelowe (parametr / zmienna LR).
Ta funkcja zapisuje więc wartość zmiennej C, którą zdefiniowaliśmy, w parametrze LR „LRPlanName”.
Teraz możemy zastąpić „LRPlanName” jak każdy inny parametr w żądaniu 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 );
Zauważ, że kiedy uruchomimy ten skrypt, wszystkie Vusery i wszystkie iteracje będą miały taką samą wartość jak nazwa planu. Aby więc nazwa planu była unikalna dla każdego przebiegu, możemy zrobić coś takiego.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Tutaj „pVuserId” i „pIteration” to parametry „Vuser ID” i „Iteration Number” (omówione w typach parametrów w naszych poprzednich samouczkach). Są one używane w nazwie planu, aby zapewnić unikalne nazwy dla każdego Vusera i iteracji.
Plik „Lr_eval_string” funkcja zwraca ciąg wejściowy po ocenie wszelkich parametrów osadzonych. W tym przypadku wynikiem tej funkcji będzie „MyFinancialPlan_1_1” dla pierwszej iteracji Vusera, „MyFinancialPlan_1_2” dla pierwszej drugiej iteracji Vusera i tak dalej.
I oczywiście wiemy co „Lr_save_string” funkcja nie.
Teraz możemy zastąpić parametr „LRPlanName”, jak pokazano powyżej.
Scenariusz 2:Jak przekonwertować zmienną modułu uruchamiającego obciążenie na liczbę całkowitą C.
W ostatnim samouczku widzieliśmy przykład, aby zrozumieć, w jaki sposób ręcznie przechodzimy lub kończymy niepowodzeniem transakcji w zależności od warunku.
Przykład:
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 ); }
Użyliśmy tutaj instrukcji „if” z atrybutem „SaveCount”. Parametr „WelcomeCount”, który zapisuje liczbę wystąpień tekstu, nie może być użyty bezpośrednio w warunku „if”, ponieważ jest to ładowany ciąg wykonawczy. Zatem ten parametr należy najpierw przekonwertować na łańcuch C, a następnie na liczbę całkowitą w C. „Lr_eval_string” i „Atoi” funkcje są używane (odpowiednio), aby się tym zająć.
Plik „Atoi” Funkcja C konwertuje ciąg znaków C na liczbę całkowitą C.
Po tej konwersji można jej używać jak każdej innej liczby całkowitej C.
Scenariusz 3:Jak wysłać losową wartość w żądaniu
Bardzo często spotykamy scenariusze aplikacji, w których musimy wybrać losową wartość (powiedzmy z rozwijanej listy). Jak sobie z tym radzimy w skryptach VuGen? W jaki sposób zapewniamy, że dla każdej iteracji jest wybierana losowa wartość? Przyjrzyjmy się temu szczegółowo.
Weźmy na przykład naszą aplikację „Web Tours”. Jak widzieliśmy wcześniej, mamy stronę „Znajdź lot”, na której musimy wybrać lot.
Powiedzmy, że wybieramy pierwszy z listy. Odpowiednie żądanie w skrypcie wygląda następująco (gdzie wybrano odpowiednią wartość dla lotu).
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 );
Najpierw musimy pobrać odpowiednie wartości dla wszystkich czterech lotów z jednej z poprzednich odpowiedzi. Możemy to zrobić za pomocą funkcji korelacji (web_reg_save_param) z atrybutem „ORD = ALL” przed żądaniem, którego odpowiedź ma taką wartość.
Wynik tego będzie taki, że skorelowany parametr „cFlight” ma tablicę czterech wartości odpowiadających czterem lotom.
Następnym krokiem byłoby losowe wybranie jednej z tych wartości i przesłanie w żądaniu. Można to zrobić za pomocą „Lr_paramarr_random” działają, jak pokazano poniżej.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Wejście do „Lr_paramarr_random” funkcja jest tablicą parametrów, a wynikiem jest losowa wartość z tej tablicy. Więc tutaj wyjście tej funkcji jest jedną z czterech wartości lotu. A ponieważ ta losowa wartość jest łańcuchem LR, używana jest funkcja „lr_eval_string” (do konwersji tego samego na łańcuch C).
„Strcpy” Funkcja C ostatecznie kopiuje tę wartość do zmiennej ciągu C „flightVal”.
Teraz ponownie musimy przekonwertować tę zmienną C String na łańcuch LR, aby móc wysłać żądanie.
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 );
Scenariusz 4:Jak podzielić ciąg na tokeny
Powiedzmy, że istnieje scenariusz, w którym musimy podzielić ciąg na części / tokeny. Weźmy przykład z naszej aplikacji „Wycieczki internetowe”, skąd pochodzi wartość lotu 020 ; 338; 04/03/2018 powiedzmy, że musimy użyć tylko „338”, musimy podzielić ten ciąg i zapisać go w zmiennej.
Aby to zrobić „Strtok” funkcja jest używana.
„Strtok” Funkcja C zwraca token z łańcucha oddzielonego określonymi znakami. Po pierwszym wywołaniu musimy przekazać „NULL” jako wartość ciągu, aby otrzymać następny token. Poniższy przykład pokazuje, jak ta funkcja jest używana do dzielenia wartości lotu na podstawie ogranicznika średnika (;).
Przykład:
Załóżmy, że wartość lotu jest przechwytywana z odpowiedniej odpowiedzi 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); }
Wynik tego można zobaczyć w dzienniku powtórek.
Możemy skopiować wymagany token do parametru i użyć go.
Scenariusz 5:Jak odczytywać i zapisywać dane w pliku tekstowym
Czasami może być wymagane odczytanie danych z pliku zewnętrznego lub zapisanie danych w pliku zewnętrznym. Zobaczmy, jak to robimy w skrypcie VuGen.
Najpierw zobaczmy, jak czytać dane z pliku tekstowego.
Przykład: Powiedzmy, że musimy odczytać XML z zewnętrznego pliku danych i użyć go jako żądania w skrypcie.
Aby to zrobić, używamy „Fread” Funkcja C.
Ta funkcja ma cztery atrybuty:
bufor - Bufor, w którym ma być przechowywany strumień danych.
rozmiar - wielkość bufora.
liczyć - liczba bajtów do odczytania.
file_pointer - Wskaźnik pliku
Przykładowy kod (z komentarzami) dla tego samego
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
Zwróć uwagę, że w powyższym kodzie odczytaliśmy 500 bajtów z pliku tekstowego. Oczywiście nie zawsze możemy znać rozmiar pliku. Więc możemy użyć „Fseek” i „Ftell” Funkcje C (zostawię to do zbadania), aby znaleźć rozmiar pliku i użyć rozszerzenia 'liczyć' atrybut klasy „Fread” funkcjonować odpowiednio.
Zobaczmy teraz, jak zapisywać dane do pliku tekstowego.
Przykład: Powiedzmy, że mamy skrypt, który tworzy zamówienia i generuje identyfikator zamówienia. Jeśli chcemy poznać wszystkie identyfikatory zamówień utworzone przez nasz skrypt w teście, możemy zmusić nasz skrypt do skopiowania tych identyfikatorów zamówień do zewnętrznego pliku tekstowego.
„Fprintf” - Funkcja C zapisuje sformatowane dane wyjściowe do pliku.
Ta funkcja przyjmuje następujące atrybuty:
file_pointer - Wskaźnik pliku
format_string - sformatowany ciąg znaków do zapisania w pliku.
argumenty - Jeden lub więcej opcjonalnych argumentów drukowania.
Przykładowy kod pokazano poniżej. Załóżmy, że skorelowaliśmy i zapisaliśmy „identyfikator zamówienia” w parametrze „cOrderId”.
Przykład:
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 */
Mam nadzieję, że jesteśmy teraz dobrzy w koncepcjach odczytywania lub zapisywania danych w zewnętrznym pliku (oczywiście mogą istnieć inne sposoby zrobienia tego samego niż to, o czym mówiliśmy powyżej). Byłoby bardzo przydatne dogłębne przestudiowanie operacji na plikach w C (możesz skorzystać z dobrych tutoriali C lub książek), ponieważ są one bardzo wymagane w wielu scenariuszach czasu rzeczywistego.
Scenariusz 6:Jak radzić sobie z korelacją, gdy zmieniają się granice
W samouczku dotyczącym korelacji użyliśmy funkcji korelacji opartej na granicach, aby uchwycić wartości dynamiczne z odpowiedzi. Ale co, jeśli mamy scenariusz, w którym granice się zmieniają? Istnieje kilka sposobów radzenia sobie z takimi sytuacjami. Zobaczmy je szczegółowo.
a) Przy użyciu flag „IC”, „DIG” i „ALNUM”:
IC - Ta flaga instruuje VuGen, aby ignorował wielkość liter na granicy lewej / prawej.
Przykład: Jeśli lewa granica jest czasami zapisana dużymi, a czasami małymi literami, używamy tej flagi.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
TY - Ta flaga instruuje VuGen, aby wziął pod uwagę każdą pojedynczą liczbę, w której zastosowano dziki znak „#” w lewej / prawej granicy.
jak rozwiązać wyjątek indeksu tablicy poza granicami w java
Przykład: Jeśli Lewa granica (lub Prawa granica) zmienia się w ten sposób (tylko jedna liczba w określonej pozycji).
GJHi3rty
1GJHi8rty
GJHi7rty
Możemy użyć flagi „DIG”, jak pokazano poniżej, ponieważ zajmie się ona zmianą numeru.
LB / DIG = GJHi # rty
olcha - Ta flaga instruuje VuGen, aby wziął pod uwagę każdy pojedynczy znak alfanumeryczny, w którym na granicy lewej / prawej użyto znaku dzikiego „^”.
Przykład: Jeśli Lewa granica (lub Prawa granica) zmienia się w ten sposób (tylko jeden znak alfanumeryczny w określonej pozycji).
GJHi3rty
GJHiKrty
GJHitrty
Możemy użyć flagi „ALNUM”, jak pokazano poniżej, ponieważ zajmie się ona zmianą znaku alfanumerycznego
LB / ALNUM = GJHi ^ rty
Możemy również używać razem dwóch flag - na przykład „ALNUMIC”, czyli „ALNUM” i „IC”.
b) Korzystanie z atrybutów „SaveLen” i „SaveOffset”:
Możemy użyć tych dwóch atrybutów „Web_reg_save_param” działają odpowiednio, aby wprowadzić tylko statyczną część granic lewej / prawej.
c) Używanie wyrażeń regularnych:
Możemy użyć „Web_reg_save_param_regexp” funkcja korelacji, aby zapisać wartość dynamiczną (jako parametr), która pasuje do wyrażenia regularnego.
Przykład: Powiedzmy, że dynamiczna wartość, którą chcemy uchwycić, to „3959339” z podanego tekstu,
PriceControl_ctl01 „Name = jack”, „Refid = 3959339” saldo
Nie możemy tutaj użyć funkcji korelacji opartej na granicach, ponieważ wartość i długość pola, takiego jak „Nazwa” powyżej, mogą ulec zmianie (i dlatego nie możemy ich użyć w lewej lub prawej krawędzi).
Możemy użyć „Web_reg_save_param_regexp” funkcja korelacji, jak pokazano poniżej, aby rozwiązać ten problem.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Grupy wyrażeń regularnych są umieszczane w nawiasach, a atrybut „Grupa” decyduje, którą grupę należy wziąć pod uwagę przy zapisywaniu odpowiedniego dopasowania do określonego parametru (w pierwszym atrybucie).
Poniżej przedstawiono kilka dopasowań wyrażeń regularnych:
d - dopasowuje jedną cyfrę
w - dopasowuje pojedyncze słowo
(A-Z) + - dopasowuje dowolne słowo zapisane dużymi literami
(a-z) + - dopasowuje dowolne słowo zapisane małymi literami
(0-9) + - dopasowuje dowolną wartość liczbową
Scenariusz 7:Jak napisać i używać funkcji w skrypcie VuGen
Jak w każdym innym języku programowania, możemy ręcznie napisać / zdefiniować funkcję (zwykle nazywaną funkcją zdefiniowaną przez użytkownika) i używać jej w dowolnym miejscu skryptu VuGen.
Załóżmy, że w każdym żądaniu konkretnego skryptu musimy wysyłać unikalną nazwę planu. Zamiast więc wielokrotnie pisać wymagany kod (który generuje unikalną nazwę), możemy zdefiniować funkcję (która generuje unikalną nazwę) i wywoływać ją zawsze (i wszędzie) w skrypcie VuGen.
Chociaż funkcję w skrypcie VuGen można zapisać w dowolnej akcji, zwykle jest ona zapisywana wewnątrz „Globals.h” plik (w sekcji Extra Files w skrypcie VuGen) lub wewnątrz nowo utworzonego pliku (w tej samej sekcji „Extra Files”). Po napisaniu funkcję można wywołać z dowolnej akcji.
Poniższy obrazek przedstawia zdefiniowaną przez użytkownika funkcję „MyFunction” zapisaną w pliku „globals.h”.
Jak omówiono powyżej, drugim sposobem jest utworzenie nowego pliku i zapisanie w nim funkcji.
Jedyną rzeczą do zapamiętania podczas tworzenia nowego pliku jest to, że musimy uwzględnić go w pliku „globals.h” (bez którego VuGen nie rozpozna tego pliku).
Wniosek
Dlatego w tym samouczku widzieliśmy, jak radzić sobie z niektórymi wyzwaniami w czasie rzeczywistym w skryptach VuGen i oczywiście natknęlibyśmy się na wiele innych scenariuszy, gdy pracujemy nad różnymi aplikacjami.
Ponadto można by było zdać sobie sprawę, że funkcje napisów C i operacje na plikach C są bardzo potrzebne (i przydatne) w obsłudze różnych scenariuszy. Jednak radziłbym ci poświęcić trochę czasu na ich opanowanie.
W następnym samouczku zobaczymy i zrozumiemy kilka ważnych, predefiniowanych funkcji, które są używane w skryptach VuGen (niektóre z nich już widzieliśmy).
=> Odwiedź tutaj, aby zapoznać się z pełną serią samouczków LoadRunner
POPRZEDNIA samouczek | NEXT Tutorial
rekomendowane lektury
- Testowanie wydajności usług sieci Web przy użyciu skryptów LoadRunner VuGen
- Zaawansowane skrypty powłoki Unix: tablice, operatory testów plików i łańcuchów, zmienne specjalne
- Testowanie obciążenia za pomocą samouczków HP LoadRunner
- Opcje nagrywania VUGen w LoadRunner
- Jak skonfigurować pliki skryptów LoadRunner VuGen i ustawienia środowiska wykonawczego
- Ważne funkcje LoadRunner używane w skryptach VuGen z przykładami
- Wprowadzenie do Micro Focus LoadRunner - Testowanie obciążenia za pomocą samouczka LoadRunner nr 1
- Skrypty JMeter BeanShell, część 2