loadrunner vugen scripting challenges
LoadRunner VuGenスクリプティングに関連する課題の概要:
これで 有益なLoadRunnerトレーニングシリーズ 、私たちは約 VuGenスクリプトの機能強化 前のチュートリアルで。以前のチュートリアルから現在まで、VuGenで大きな進歩を遂げました。
Web HTTP / HTMLプロトコルでスクリプトを記録する方法、相関とパラメーター化を使用してデータ/値を処理する方法、チェックポイントで応答が正しいかどうかを確認する方法、ユーザーの速度と応答時間を測定するトランザクションを挿入する方法を学びました。アクションやその他のもの。
これらを使用すると、ほぼすべてのWebアプリケーションのスクリプトを正常に作成できるはずです。
=> LoadRunnerチュートリアルの完全なシリーズについては、ここをクリックしてください
LR言語
VuGenスクリプトでより難しいタスクを実行する必要がある場合があります。このチュートリアルでは、スクリプトの課題のいくつかと、それらを処理するために利用できる手法について説明します。
これらについて説明する前に、いくつかのことを理解しましょう。 VuGen(またはLoad Runner)は、それ自体の言語しか理解できません(これをLR言語と呼びます。LRは、Load Runnerの短縮形です)。したがって、生成されるスクリプトはすべてLR言語であると言えます。 LR言語では、データ型は文字列(より正確には「LR文字列」)の1つだけです。
現在、VuGenスクリプトで拡張を行うために、通常はC言語を使用しています。
C言語には、int、char、float、longなどの多くのデータ型があることがわかっています。リクエストでC値を直接定義して使用すると、VuGenは理解せず(「LR文字列」しか理解しないため)、スローします。エラー。したがって、リクエストで使用する前に、(任意のデータ型の)任意のC値を「LR文字列」に変換する必要があります。
これを理解したので、いくつかのリアルタイムの挑戦的なシナリオに行きましょう。
シナリオ1:シナリオ1:VuGenリクエストでC文字列を使用する方法
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パラメーター/変数に値を割り当てます。 2つの属性を取ります–最初の属性はソース(C文字列)で、2番目の属性は宛先(LRパラメーター/変数)です。
したがって、この関数は、定義したC変数の値をLRパラメーター「LRPlanName」に保存します。
これで、VuGenリクエストの他のパラメータと同じように「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' );
ここで、「pVuserId」と「pIteration」は「仮想ユーザーID」と「反復番号」のパラメーターです(前のチュートリアルのパラメータータイプで説明しました)。これらは、各仮想ユーザーとイテレーションに一意の名前を付けるためにプラン名で使用されます。
ザ・ ‘lr_eval_string’ 関数は、埋め込まれたパラメータを評価した後、入力文字列を返します。したがって、この場合、この関数の出力は、最初の仮想ユーザーの最初の反復では「MyFinancialPlan_1_1」、最初の仮想ユーザーの2番目の反復では「MyFinancialPlan_1_2」というようになります。
そしてもちろん、私たちは何を知っています ‘lr_save_string’ 機能はありません。
これで、上記のように「LRPlanName」パラメータを置き換えることができます。
シナリオ2:シナリオ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 ); }
ここでは、「SaveCount」属性とともに「ifステートメント」を使用しました。テキストの出現回数を保存する「WelcomeCount」パラメータは、ロードランナー文字列であるため、「if」条件で直接使用することはできません。したがって、このパラメータは最初にC文字列に変換してから、C整数に変換する必要があります。 ‘lr_eval_string’ そして 「アトイ」 これを処理するために、関数が(それぞれ)使用されます。
ザ・ 「アトイ」 C関数は、C文字列をC整数に変換します。
この変換後、これは他のC整数と同じように使用できます。
シナリオ3:リクエストでランダムな値を送信する方法
多くの場合、ランダムな値を選択する必要があるアプリケーションシナリオが発生します(ドロップダウンなどから)。 VuGenスクリプトでこれをどのように処理しますか?反復ごとにランダムな値が選択されるようにするにはどうすればよいですか?これを詳しく見てみましょう。
「Webツアー」アプリケーションの例を見てみましょう。前に見たように、フライトを選択する必要がある「フライトの検索」ページがあります。
リストの最初のものを選択するとします。スクリプト内の対応するリクエストは次のようになります(フライトに対応する値が選択されています)。
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 );
最初に、前の応答の1つから4つのフライトすべてに対応する値を取得する必要があります。これは、応答がこれらの値を持つリクエストの前に、「ORD = ALL」属性を持つ相関関数(web_reg_save_param)を使用して行うことができます。
この出力は次のようになります。ここで、相関パラメータ「cFlight」には、4つのフライトに対応する4つの値の配列があります。
次のステップは、これらの値の1つをランダムに選択し、リクエストで送信することです。これは、 ‘lr_paramarr_random’ 以下のように機能します。
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
への入力 ‘lr_paramarr_random’ 関数はパラメータ配列であり、出力はこの配列からのランダムな値です。したがって、ここでは、この関数の出力は4つのフライト値の1つです。また、このランダムな値はLR文字列であるため、「lr_eval_string」関数が使用されます(これをC文字列に変換するため)。
「strcpy」 C関数は、最終的にこの値をC文字列変数「flightVal」にコピーします。
ここでも、リクエストを送信できるように、このC文字列変数を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:シナリオ4:文字列をトークンに分割する方法
文字列を断片/トークンに分割する必要があるシナリオがあるとします。 「WebTours」アプリケーションの例を見てみましょう。フライトの値から 020 ; 338; 04/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を読み取り、それをスクリプトのリクエストとして使用する必要があるとします。
これを行うには、 「fread」 C関数。
この関数は4つの属性を取ります。
バッファ –データストリームを格納するバッファ。
サイズ –バッファーのサイズ。
カウント –読み取るバイト数。
file_pointer –ファイルポインタ
同じのサンプルコード(コメント付き)
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関数(これはあなたが探求するために残しておきます) 'カウント' の属性 「fread」 それに応じて機能します。
それでは、テキストファイルにデータを書き込む方法を見てみましょう。
例: 注文を作成して「orderid」を生成するスクリプトがあるとします。テストでスクリプトによって作成されたすべての注文IDを知りたい場合は、スクリプトにこれらの注文IDを外部テキストファイルにコピーさせることができます。
「fprintf」 – C関数は、フォーマットされた出力をファイルに書き込みます。
この関数は次の属性を取ります。
file_pointer –ファイルポインタ
format_string –ファイルに書き込むためのフォーマットされた文字列。
args –1つ以上のオプションの印刷引数。
サンプルコードを以下に示します。 「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:境界が変化しているときに相関を処理する方法
相関チュートリアルでは、境界ベースの相関関数を使用して、応答から動的な値を取得しました。しかし、境界が変化しているシナリオがある場合はどうなるでしょうか。このような状況を処理する方法はいくつかあります。これらを詳しく見てみましょう。
a)「IC」、「DIG」、および「ALNUM」フラグの使用:
IC - このフラグは、左/右境界の大文字と小文字を無視するようにVuGenに指示します。
例: 左境界が大文字の場合と小文字の場合がある場合は、このフラグを使用します。
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
君は - このフラグは、ワイルド文字「#」が左/右の境界で使用されている単一の数値を考慮するようにVuGenに指示します。
例: 左の境界(または右の境界)がこのように変化している場合(特定の位置に1つの数字のみ)。
GJHi3rty
1GJHi8rty
GJHi7rty
以下に示すように、「DIG」フラグを使用して、番号の変更を処理できます。
LB / DIG = GJHi#rty
ハンノキ- このフラグは、ワイルド文字「^」が左/右の境界で使用されている単一の英数字を考慮するようにVuGenに指示します。
例: 左の境界(または右の境界)がこのように変化している場合(特定の位置に1文字の英数字のみ)。
GJHi3rty
GJHiKrty
GJHitrty
以下に示すように、「ALNUM」フラグを使用すると、英数字の変化に対応できます。
LB / ALNUM = GJHi ^ rty
また、「ALNUM」と「IC」の両方である「ALNUMIC」のように、2つのフラグを一緒に使用することもできます。
b)「SaveLen」および「SaveOffset」属性の使用:
これらの2つの属性を使用できます ‘web_reg_save_param’ 左/右境界の静的部分のみを入力するように適切に機能します。
c)正規表現の使用:
使用できます ‘web_reg_save_param_regexp’ 正規表現に一致する動的な値を(パラメーターに)保存する相関関数。
例: キャプチャしたい動的な値が、指定されたテキストの「3959339」であるとします。
PriceControl_ctl01「Name = jack」、「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 –1桁に一致
0から1の間の乱数c ++
w –単一の単語に一致します
(A-Z) + –大文字の任意の単語に一致します
(a-z) + –小文字の任意の単語に一致します
(0-9) + –任意の数値に一致
シナリオ7:VuGenスクリプトで関数を記述して使用する方法
他のプログラミング言語と同様に、関数を手動で記述/定義し(通常はユーザー定義関数と呼ばれます)、VuGenスクリプトの任意の場所で使用できます。
特定のスクリプトのすべてのリクエストで一意のプラン名を送信する必要があると仮定します。したがって、必要なコード(一意の名前を生成する)を複数回記述する代わりに、関数(一意の名前を生成する)を定義し、VuGenスクリプトで必要なときにいつでも(どこでも)呼び出すことができます。
VuGenスクリプトの関数は任意のアクション内に記述できますが、通常はアクション内に記述されます。 「globals.h」 ファイル(VuGenスクリプトの(追加ファイル)セクションの下)または新しく作成されたファイル内(同じ(追加ファイル)セクションの下)。一度記述されると、関数は任意のアクションから呼び出すことができます。
以下の画像は、「globals.h」ファイル内に記述されたユーザー定義関数「MyFunction」を示しています。
上で説明したように、もう1つの方法は、新しいファイルを作成し、その中に関数を書き込むことです。
新しいファイルを作成するときに覚えておくべき唯一のことは、それを「globals.h」ファイルに含める必要があるということです(これがないと、VuGenはこのファイルを認識しません)。
結論
したがって、このチュートリアルでは、VuGenスクリプトでいくつかのリアルタイムの課題を処理する方法を確認しました。さまざまなアプリケーションで作業するときに、他の多くのシナリオに遭遇することは明らかです。
また、さまざまなシナリオを処理するには、C文字列関数とCファイル操作が非常に必要である(そして役立つ)ことに気付いたでしょう。ただし、これらを習得するために時間をかけることをお勧めします。
次のチュートリアルでは、VuGenスクリプトで使用されるいくつかの重要な事前定義された関数を見て理解します(いくつかの関数はすでに見てきました)。
=> LoadRunnerチュートリアルの完全なシリーズについては、こちらをご覧ください
推奨読書
- LoadRunnerVuGenスクリプトを使用したWebサービスパフォーマンステスト
- 高度なUnixシェルスクリプト:配列、ファイルおよび文字列のテスト演算子、特殊変数
- HPLoadRunnerチュートリアルを使用した負荷テスト
- LoadRunnerのVUGen記録オプション
- LoadRunnerVuGenスクリプトファイルとランタイム設定をセットアップする方法
- 例を含むVuGenスクリプトで使用される重要なLoadRunner関数
- Micro Focus LoadRunnerの概要-LoadRunnerチュートリアル#1を使用した負荷テスト
- JMeterBeanShellスクリプティングパート2