loadrunner vugen scripting challenges
LoadRunner VuGen Scripting ile ilgili Zorluklara Giriş:
Bunda Bilgilendirici LoadRunner Eğitim Serisi hakkında keşfettik VuGen Komut Dosyası Geliştirmeleri önceki eğitimimizde. Daha önceki eğitimlerimizden şimdiye kadar, VuGen ile büyük bir ilerleme kaydettik.
Web HTTP / HTML protokolünde bir komut dosyasının nasıl kaydedileceğini, korelasyon ve parametreleştirme ile verilere / değerlere nasıl bakılacağını, kontrol noktaları ile yanıtın doğru olup olmadığından nasıl emin olacağımızı, kullanıcının hızı ve yanıt süresini ölçen işlemlerin nasıl ekleneceğini öğrendik. eylemler ve diğer şeyler.
Bunlarla, neredeyse tüm web uygulamaları için başarılı bir şekilde komut dosyaları oluşturabilmeliyiz.
=> LoadRunner Eğitimlerinin Tam Serisi İçin Buraya Tıklayın
LR dili
Bir VuGen komut dosyasında daha zorlu görevler yapmamız gereken durumlar olabilir. Bu eğitimde, komut dosyası oluşturma zorluklarından bazılarını bunlarla başa çıkmak için mevcut tekniklerle tartışacağız.
Bunları tartışmadan önce birkaç şeyi anlayalım. VuGen (veya Load Runner) yalnızca kendi dilini anlayabilir (bunu LR dili olarak adlandıralım, LR, Load Runner'ın kısa biçimidir). Yani ürettiği komut dosyası her ne olursa olsun LR dilinde olduğu söylenebilir. LR dilinde, yalnızca bir veri türü vardır - String (ve daha kesin olarak 'LR String').
Şimdi, bir VuGen betiğinde iyileştirmeler yapmak için genellikle C dilini kullanıyoruz.
C dilinde int, char, float, long vb. Gibi birçok veri türü olduğunu biliyoruz. Bir istekte C değerlerini doğrudan tanımlar ve kullanırsak, VuGen anlamaz (çünkü yalnızca 'LR dizelerini' anlar) ve bir hata. Bu nedenle, herhangi bir C değerini (herhangi bir veri türünden) bir istekte kullanmadan önce 'LR dizesine' dönüştürmemiz gerekir.
Bunu anladıktan sonra, gerçek zamanlı zorlu senaryolara geçelim.
Senaryo 1:VuGen isteğinde C dizesi nasıl kullanılır
Bir VuGen komut dosyasında 'PlanAdı' adlı bir alana sahip bir isteğimiz olduğunu varsayalım (bu komut dosyasının bazı finansal planlama uygulamaları için olduğunu varsayalım). Kayıt sırasında değeri 'Yeni Plan' olarak girdik.
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 );
Plan adı olarak kullanıcı tanımlı bir dizge kullanmak istediğimizi varsayalım.
Bu nedenle, aşağıda gösterildiği gibi bir dizge tanımlamalı ve tanımlamalıyız
char sPlanName() = ' MyFinancialPlan ';
'SPlanName' bir C dizesidir ve bu nedenle onu LR dizesine dönüştürmemiz gerekir (istekte kullanmak için).
Bunu, aşağıda gösterildiği gibi 'lr_save_string' işlevini kullanarak yapıyoruz:
lr_save_string(sPlanName,”LRPlanName”);
Bu fonksiyon, LR parametresine / değişkenine bir değer atar. İki öznitelik alır - İlk öznitelik kaynaktır (C Dizgisi) ve ikinci öznitelik hedeftir (LR parametresi / değişkeni).
Dolayısıyla bu işlev, tanımladığımız C değişkeninin değerini 'LRPlanName' LR parametresine kaydeder.
Artık 'LRPlanName' i VuGen isteğindeki diğer herhangi bir parametre gibi değiştirebiliriz.
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 );
Bu betiği çalıştırdığımızda, tüm Vusers ve tüm yinelemelerin plan adıyla aynı değeri alacağını unutmayın. Bu nedenle, plan adını her koşuda benzersiz kılmak için buna benzer bir şey yapabiliriz.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Burada 'pVuserId' ve 'pIteration', 'Vuser ID' ve 'Yineleme Numarası' parametreleridir (önceki eğitimlerimizde parametre türlerinde tartıştığımız). Bunlar, her Vuser ve yineleme için benzersiz adlarımız olmasını sağlamak için plan adında kullanılır.
'Lr_eval_string' işlev, herhangi bir gömülü parametreyi değerlendirdikten sonra girdi dizesini döndürür. Dolayısıyla, bu durumda, bu işlevin çıktısı, birinci Vuser ilk yinelemesi için 'Finansal Planım_1_1', birinci Vuser ikinci yinelemesi için 'Finansal Planım_1_2' vb. Olacaktır.
Ve elbette ne olduğunu biliyoruz 'Lr_save_string' işlevi yapar.
Şimdi, yukarıda gösterildiği gibi 'LRPlanName' parametresini değiştirebiliriz.
Senaryo 2:Yük koşucusu değişkenini C tamsayıya dönüştürme
Son eğiticide, bir koşula bağlı olarak bir işlemi manuel olarak nasıl geçtiğimizi veya başarısız olduğumuzu anlamak için bir örnek gördük.
Misal:
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 ); }
Burada 'SaveCount' özelliğiyle 'if ifadesi' kullandık. Metnin geçme sayısını kaydeden 'WelcomeCount' parametresi, bir yük çalıştırıcı dizesi olduğu için doğrudan 'eğer' koşulunda kullanılamaz. Yani bu parametrenin önce C dizesine ve sonra C tamsayıya dönüştürülmesi gerekir. 'Lr_eval_string' ve 'Atoi' bununla ilgilenmek için (sırasıyla) işlevler kullanılır.
'Atoi' C işlevi, bir C dizesini bir C tamsayıya dönüştürür.
Bu dönüşümden sonra, bu diğer herhangi bir C tamsayısı gibi kullanılabilir.
Senaryo 3:Bir istekte rastgele bir değer nasıl gönderilir
Çoğu zaman, rastgele bir değer seçmemiz gereken uygulama senaryoları ile karşılaşırız (örneğin bir açılır menüden). Bunu VuGen betiklerinde nasıl hallederiz? Her yineleme için rastgele değerin seçilmesini nasıl sağlarız? Bunu ayrıntılı olarak görelim.
'Web Turları' uygulamamızın örneğini ele alalım. Daha önce gördüğümüz gibi, uçuş seçmemiz gereken bir 'Uçuş Bul' sayfamız var.
Listedeki ilkini seçtiğimizi varsayalım. Komut dosyasındaki karşılık gelen istek şu şekildedir (uçuş için karşılık gelen değerin seçildiği yer).
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 );
Önce, önceki yanıtların birinden dört uçuşun tümü için karşılık gelen değerleri almalıyız. Bunu, yanıtı bu değere sahip istekten önce 'ORD = ALL' özelliğiyle korelasyon işlevini (web_reg_save_param) kullanarak yapabiliriz.
Bunun çıktısı, ilişkili 'cFlight' parametresinin dört uçuşa karşılık gelen dört değerden oluşan bir diziye sahip olduğu durumda böyle olacaktır.
Bir sonraki adım, bu değerlerden birini rastgele seçmek ve talepte sunmak olacaktır. Bu, kullanılarak yapılabilir 'Lr_paramarr_random' aşağıda gösterildiği gibi işlev görür.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
Girdisi 'Lr_paramarr_random' işlev bir parametre dizisidir ve çıktı bu diziden rastgele bir değerdir. Yani burada bu fonksiyonun çıktısı dört uçuş değerinden biridir. Ve bu rastgele değer bir LR dizesi olduğundan, 'lr_eval_string' işlevi kullanılır (aynısını C dizesine dönüştürmek için).
'Strcpy' C işlevi sonunda bu değeri bir C string değişkenine 'flightVal' kopyalar.
Şimdi yine isteği gönderebilmek için bu C String değişkenini LR dizgesine dönüştürmemiz gerekiyor.
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 );
Senaryo 4:Bir dizge belirteçlere nasıl bölünür
Bir dizgeyi parçalara / jetonlara bölmemiz gereken bir senaryo olduğunu varsayalım. Uçuş değerinin nereden geldiğini 'Web Turları' uygulamamızdan alalım 020 ; 338; 04/03/2018, sadece '338' kullanmamız gerektiğini söylüyor, sonra bu dizeyi bölmemiz ve bunu bir değişkene kaydetmemiz gerekiyor.
Bunu yapmak için 'Strtok' işlevi kullanılır.
'Strtok' C işlevi, belirtilen karakterlerle ayrılmış bir dizeden bir simge döndürür. İlk çağırmadan sonra, bir sonraki jetonu elde etmek için dizenin değeri olarak 'NULL' geçmeliyiz. Aşağıdaki örnek, bu işlevin uçuş değerini noktalı virgül (;) sınırlayıcıya göre bölmek için nasıl kullanıldığını gösterir.
Misal:
Uçuş değerinin ilgili yanıttan 'cFlight' parametresine kaydedildiğini varsayalım.
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); }
Bunun çıktısı tekrar oynatma günlüğünde görülebilir.
Gerekli jetonu bir parametreye kopyalayıp kullanabiliriz.
Senaryo 5:Bir metin dosyasından veri nasıl okunur ve bir metin dosyasına nasıl yazılır
Bazen harici bir dosyadan veri okumak veya harici bir dosyaya veri yazmak gerekebilir. Bunu bir VuGen komut dosyasıyla nasıl yaptığımıza bakalım.
Önce bir metin dosyasından verilerin nasıl okunacağını görelim.
Misal: Diyelim ki, harici bir veri dosyasından bir XML okumamız ve onu komut dosyasında bir istek olarak kullanmamız gerekiyor.
Bunu yapmak için kullanırız 'Fread' C işlevi.
Bu işlev dört öznitelik alır:
tampon - Veri akışının saklanacağı tampon.
boyut - Tamponun boyutu.
Miktar - Okunacak bayt sayısı.
file_pointer - Dosya tanıtıcısı
Aynı için örnek kod (yorumlarla)
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
Yukarıda gösterilen kodda, metin dosyasından 500 bayt okuduğumuzu unutmayın. Açıkçası, dosya boyutunu her zaman bilemeyebiliriz. Böylece kullanabiliriz 'Fseek' ve 'Ftell' Dosyanın boyutunu bulmak ve kullanmak için C işlevleri (bunu keşfetmeniz için size bırakacağım) 'Miktar' özniteliği 'Fread' buna göre işlev görür.
Şimdi bir metin dosyasına nasıl veri yazılacağını görelim.
Misal: Diyelim ki emirler oluşturan ve 'orderid' oluşturan bir komut dosyası var. Bir testte komut dosyamız tarafından oluşturulan tüm sipariş kimliklerini bilmek istiyorsak, komut dosyamızın bu sipariş kimliklerini harici bir metin dosyasına kopyalamasını sağlayabiliriz.
'Fprintf' - C işlevi, biçimlendirilmiş çıktıyı bir dosyaya yazar.
Bu işlev şu nitelikleri alır:
file_pointer - Dosya tanıtıcısı
format_string - Dosyaya yazılacak biçimlendirilmiş dize.
argümanlar - Bir veya daha fazla isteğe bağlı yazdırma argümanı.
Örnek kod aşağıda gösterilmiştir. 'Orderid' i ilişkilendirdiğimizi ve 'cOrderId' parametresine kaydettiğimizi varsayalım.
Misal:
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 */
Umarım, harici bir dosyadan veri okuma veya bu dosyaya veri yazma kavramlarında artık iyiyiz (tabii ki aynı şeyi yapmanın yukarıda tartıştığımızdan başka yolları da olabilir). Birçok gerçek zamanlı senaryoda bunlar çok gerekli olduğundan, C'deki dosya işlemleri hakkında kapsamlı bir çalışma yapmak çok yararlı olacaktır (herhangi bir iyi C öğreticisine veya kitabına başvurabilirsiniz).
Senaryo 6:Sınırlar değişirken korelasyon nasıl ele alınır?
Korelasyonlar eğitiminde, tepkiden dinamik değerleri yakalamak için sınır bazlı korelasyon fonksiyon (lar) ı kullandık. Peki ya sınırların değiştiği bir senaryomuz varsa? Bu tür durumlarla başa çıkmanın birkaç yolu vardır. Bunları ayrıntılı olarak görelim.
a) 'IC', 'DIG' ve 'ALNUM' bayraklarını kullanarak:
IC - Bu bayrak, VuGen'e Sol / Sağ sınırdaki durumu göz ardı etmesini söyler.
Misal: Left Boundary bazen büyük, bazen de küçükse bu bayrağı kullanırız.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
SEN - Bu bayrak, VuGen'e Sol / Sağ sınırda '#' joker karakterinin kullanıldığı herhangi bir tek sayıyı dikkate alması talimatını verir.
hangisi veri madenciliği örneği değildir?
Misal: Sol sınır (veya Sağ sınır) bu şekilde değişiyorsa (belirli bir konumda yalnızca bir sayı).
GJHi3rty
1GJHi8rty
GJHi7rty
Değişen numara ile ilgileneceği için aşağıda gösterildiği gibi 'DIG' bayrağını kullanabiliriz.
LB / DIG = GJHi # rty
kızılağaç - Bu bayrak, VuGen'e Sol / Sağ sınırında '^' joker karakterinin kullanıldığı herhangi bir alfanümerik karakteri dikkate alması talimatını verir.
Misal: Sol sınır (veya Sağ sınır) bu şekilde değişiyorsa (belirli bir konumda yalnızca bir alfasayısal karakter).
GJHi3rty
GJHiKrty
GJHitrty
Değişen alfanümerik karakterle ilgileneceğinden aşağıda gösterildiği gibi 'ALNUM' bayrağını kullanabiliriz.
LB / ALNUM = GJHi ^ rty
Ayrıca, hem 'ALNUM' hem de 'IC' olan 'ALNUMIC' gibi iki işareti birlikte kullanabiliriz.
b) 'SaveLen' ve 'SaveOffset' özelliklerini kullanma:
Bu iki niteliği kullanabiliriz 'Web_reg_save_param' Sol / Sağ sınırlarının yalnızca statik kısmını girmek için uygun şekilde çalışır.
c) Normal ifadeler kullanmak:
Kullanabiliriz 'Web_reg_save_param_regexp' normal bir ifadeyle eşleşen dinamik değeri (bir parametreye) kaydetmek için korelasyon işlevi.
Misal: Diyelim ki yakalamak istediğimiz dinamik değer verilen metinden '3959339',
PriceControl_ctl01 'Ad = jack', 'Refid = 3959339' bakiyesi
Burada sınır temelli korelasyon işlevini kullanamayız çünkü yukarıdaki 'Ad' gibi alanın değeri ve uzunluğu değişebilir (ve bu nedenle onu sol veya sağ sınırda kullanamayız).
Kullanabiliriz 'Web_reg_save_param_regexp' korelasyon işlevi, bu sorunu çözmek için aşağıda gösterildiği gibi.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Normal ifade grupları parantez içine alınır ve 'Grup' özelliği, karşılık gelen eşleşmeyi belirtilen parametreye (ilk öznitelikte) kaydetmek için hangi grubun dikkate alınacağına karar verir.
Aşağıda birkaç normal ifade eşleşmesi gösterilmektedir:
d - tek bir rakamla eşleşir
w - tek bir kelimeyle eşleşir
(A-Z) + - herhangi bir büyük harfle eşleşir
(a-z) + - küçük harfli herhangi bir kelimeyle eşleşir
(0-9) + - herhangi bir sayısal değerle eşleşir
Senaryo 7:Bir VuGen betiğinde bir işlev nasıl yazılır ve kullanılır
Diğer herhangi bir programlama dilinde olduğu gibi, bir işlevi manuel olarak (genellikle kullanıcı tanımlı işlev olarak adlandırılır) yazabilir / tanımlayabilir ve VuGen betiğinin herhangi bir yerinde kullanabiliriz.
Belirli bir komut dosyasının her isteğinde benzersiz bir plan adı göndermemiz gerektiğini varsayalım. Bu nedenle, gerekli kodu (benzersiz bir ad oluşturan) birden çok kez yazmak yerine, bir işlevi (benzersiz bir ad oluşturan) tanımlayabilir ve VuGen betiğinde ne zaman (ve her yerde) gerekli olursa çağırabiliriz.
Bir VuGen betiğindeki işlev herhangi bir eylemin içine yazılabilse de, genellikle 'Globals.h' dosya (VuGen komut dosyasının Ekstra Dosyalar bölümü altında) veya yeni oluşturulmuş bir dosyanın içinde (aynı 'Ekstra Dosyalar' bölümü altında). İşlev, yazıldıktan sonra herhangi bir Eylemden çağrılabilir.
Aşağıdaki resim, 'globals.h' dosyasının içine yazılmış, kullanıcı tanımlı bir 'MyFunction' işlevini göstermektedir.
Yukarıda tartışıldığı gibi, diğer yol yeni bir dosya oluşturmak ve içindeki işlevi yazmaktır.
Yeni bir dosya oluştururken hatırlamamız gereken tek şey, onu 'globals.h' dosyasına dahil etmemiz gerektiğidir (bu olmadan VuGen bu dosyayı tanımayacaktır).
Sonuç
Bu nedenle, bu eğitimde, VuGen komut dosyası oluşturmadaki bazı gerçek zamanlı zorlukların nasıl üstesinden gelineceğini gördük ve çeşitli uygulamalar üzerinde çalışırken açıkça birçok başka senaryo ile karşılaşacaktık.
Ayrıca, çeşitli senaryoların işlenmesinde C string işlevlerinin ve C dosya işlemlerinin çok gerekli (ve yararlı) olduğunu fark etmişsinizdir. Ancak, bunlarda ustalaşmak için biraz zaman ayırmanızı tavsiye ederim.
Bir sonraki eğitimimizde, VuGen betiklerinde kullanılan bazı önemli önceden tanımlanmış işlevleri görecek ve anlayacağız (bazı işlevleri zaten gördük).
=> LoadRunner Eğitimlerinin Eksiksiz Serileri İçin Burayı Ziyaret Edin
PREV Eğitimi | SONRAKİ Eğitici
Önerilen Kaynaklar
- LoadRunner VuGen Komut Dosyası Kullanarak Web Hizmetleri Performans Testi
- Gelişmiş Unix Kabuk Komut Dosyası: Diziler, Dosya ve Dize Test Operatörleri, Özel Değişkenler
- HP LoadRunner Öğreticileriyle Yük Testi
- LoadRunner'da VUGen Kayıt Seçenekleri
- LoadRunner VuGen Komut Dosyası Dosyaları ve Çalışma Zamanı Ayarları Nasıl Kurulur
- VuGen Komut Dosyalarında Örneklerle Kullanılan Önemli LoadRunner İşlevleri
- Micro Focus LoadRunner'a Giriş - LoadRunner Öğreticisi # 1 ile Yük Testi
- JMeter BeanShell Komut Dosyası Bölüm 2