この章では、OpenScript共有データ・モジュールの使用手順について説明します。このモジュールでは、共有データ・キューを使用してスクリプト間でデータを渡すことができます。
共有データ・モジュールは、他のテスト・モジュールを拡張してメッセージ・キューやハッシュ・マップ機能を提供する、OpenScript基本モジュールの拡張モジュールです。
共有データは、一般に、Oracle Load Testingで仮想ユーザーとして実行される負荷テスト・スクリプト間のデータの受渡しに使用されます。共有データは、コマンドラインから実行される機能テスト・スクリプト間のデータの受渡しにも使用できます。
仮想ユーザーは、メッセージ・オブジェクトをキューに配置し、同じキューからメッセージ・オブジェクトを取得します。仮想ユーザーは、ハッシュ・マップの作成、既存マップの取得、ハッシュ・マップへのキー/値の追加を行うこともできます。異なるエージェントやマシンの同じキューまたはハッシュ・マップに対して、メッセージ・オブジェクトの追加と取得も可能です。
共有データ詳細設定を設定するには、次のようにします。
OpenScriptを起動します。
「ビュー」メニューから「OpenScript 詳細設定」を選択します。
「OpenScript」ノード配下の「再生」カテゴリを開きます。
「共有データ」を選択します。
共有データの詳細設定を次のように設定します。
OATS 認証: 共有キューと仮想ユーザー間の通信を確立するために使用する認証設定を指定します。
グローバル共有データ アクセス認証を有効にする: 選択すると、共有データ・アクセス認証が有効になります。「アドレス」、「ユーザー名」および「パスワード」を指定します。
アドレス: 共有データ・サービスに使用する、Oracle Load Testing for Web Applicationサーバーのアドレスを指定します。
ユーザー名: 認証に使用するユーザー名を指定します。Oracle Application Testing Suite構成で変更しないかぎり、デフォルト名はoats
です。
パスワード: 認証に使用するパスワードを指定します。「スクリプト データを暗号化する」設定が選択されている場合は、「一般」詳細設定の「暗号化設定」で指定されているパスワードと同じパスワードにする必要があります。
共有データ アクション: 共有データに対するアクションを指定します。
タイムアウト: 共有データに対するアクションが発生するまで最大何秒待機するとタイムアウトするかを指定します。
「OK」をクリックします。
この項では、共有データ・サービスを有効にして使用する方法について説明します。
共有データ・サービスを使用する際の基本的なシナリオは、次のとおりです。
キュー・モード: アイテムが順次キューに格納されます。スクリプトはキューの最初または最後のデータ・アイテムを取得できます。他のアイテムにランダムにアクセスすることはできません。
スクリプトAは100の仮想ユーザーによって実行され、この仮想ユーザーは共有データ・キューにメッセージ・オブジェクトを追加するメッセージ・プロデューサとして機能します。
スクリプトBは別の100仮想ユーザーによって実行され、この仮想ユーザーは共有データ・キューからメッセージ・オブジェクトを取得するコンシューマとして機能します。
コンシューマ仮想ユーザーは、キューの情報の最初または最後からオブジェクトを取得します。キューが空の場合、コンシューマ仮想ユーザーはタイムアウトに達するまでブロックされます。オブジェクトを取得可能になると、コンシューマ仮想ユーザーは再開されます。
ハッシュ・マップ・モード: キーを使用して任意のアイテムにアクセスできます。ハッシュ・マップがあらかじめキーのマッピングを含んでいることもあります。ハッシュ・マップは、新しいアイテムをハッシュ・マップに追加する前にチェックする必要があります。
スクリプトAは100の仮想ユーザーによって実行され、この仮想ユーザーがキー/値オブジェクトを共有データ・ハッシュ・マップに追加します。
スクリプトBは別の100仮想ユーザーによって実行され、この仮想ユーザーが共有データ・ハッシュ・マップからキーによって値を取得します。
指定したキーがマップされている値を仮想ユーザーが取得できない場合、仮想ユーザーはタイムアウトに達するまで、またはキー/値がマップに追加されるまでブロックされます。
共有データ・サービスを有効にするには、次のようにします。
OpenScriptを起動します。
既存のスクリプトを開くか、新しいスクリプトを作成して記録します。
「スクリプト」メニューから「スクリプト プロパティ」を選択します。
「モジュール」カテゴリを選択します。
「共有データ」モジュールを選択します。
「OK」をクリックします。次のように、共有データ・サービスがJavaコードのスクリプト・クラスに追加されます。
@ScriptService oracle.oats.scripting.modules.sharedData.api.SharedDataService sharedData;
共有データ・サービスを有効にした後、パスワード暗号化と接続パラメータを設定してから、共有データAPIを使用してメッセージ・キューやハッシュ・マップを操作できます。メッセージ・キューやハッシュ・マップの作成および操作には、Javaコード・ビューでsharedData
クラスを使用します。
パスワード暗号化は、「一般」詳細設定で設定します。パスワード暗号化を設定するには、次のようにします。
「ビュー」メニューから「OpenScript 詳細設定」を選択します。
「OpenScript」ノード配下の「一般」カテゴリを開きます。
「暗号化」を選択します。
共有データ・サービスへの接続で隠されたパスワードか暗号化されたパスワードを使うには、「スクリプト データを隠す」または「スクリプト データを暗号化する」を選択します。
「スクリプト データを暗号化する」を選択した場合は、パスワードを入力します。
「OK」をクリックします。
接続パラメータは、共有データ・サービスおよび認証の設定に使用するOracle Load Testingサーバーを指定します。負荷テストの際、共有データ・サービスはテストを実行しているOracle Load Testingコントローラでしか実行できません。接続パラメータを設定するには、次のようにします。
共有データ・サービスが有効であり、パスワード暗号化が以前に設定したとおりに指定されていることを確認してください。
接続パラメータを設定するスクリプト・ノードを選択します。
「スクリプト」メニューから「追加」を選択して、「その他」を選択します。
「共有データ」フォルダを開きます。
「接続パラメータ設定」を選択して「OK」をクリックします。
接続パラメータを次のように設定します。
アドレス: 共有データ・サービスに使用するマシンのアドレスを指定します。たとえば、t3://localhost:8088やt3://machinename.us.oracle.com:8088のようになります。
ユーザー名: 認証に使用するユーザー名を指定します。Oracle Application Testing Suite構成で変更しないかぎり、デフォルト名はoats
です。
パスワード: 認証に使用するパスワードを指定します。
「OK」をクリックします。接続パラメータ・ノードがスクリプト・ツリーに追加されます。
Javaコード・ビューの接続パラメータは、sharedData.setConnectionParameters
プロシージャで実行されるコードで構成されています。
sharedData.setConnectionParameters("t3://localhost:8088", "oats", decrypt("L4I57b+KpnI2BQSRKPG88w=="));
接続パラメータの設定後、Javaコード・ビューで共有データAPIを使用して、メッセージ・キューやハッシュ・マップ内のデータを操作できます。
共有データ・キューを作成するには、次のようにします。
スクリプト・プロジェクトを作成します。
共有データ・サービスが有効であり、すでに説明したようにパスワード暗号化と接続パラメータが指定されていることを確認します。
Javaコード・ビューを開き、キューを作成したいスクリプトに、ライフ・タイム値を指定したsharedData.createQueue
コードを次のように挿入します。
info("Create queueA with life time of 10 minutes"); sharedData.createQueue("queueA", 10);
キューの最大数は1000、キューの最大容量は65535です。この最大値を超えると例外が発生します。ライフ・タイムの期限が切れると、キューは破棄されます。
キューに追加できる値の種類は、次のとおりです。
文字列
ブール値
整数
Long
Double
Float
上記のデータ型のリスト
ユーザー定義のシリアライズ可能なJavaオブジェクト
既存のキューにデータを挿入するには、次のようにします。
すでに説明したように、共有データ・サービスを設定してキューを作成します。
Javaコード・ビューを開き、キューにデータを挿入したいスクリプトに、値を指定したsharedData.offerFirst
またはsharedData.offerLast
コードを次のように挿入します。
int iterationNum = getIteration().getTotalIterationsCompleted() + 1; info("Insert data at the front of an existing queueA"); sharedData.offerFirst("queueA", "first" + iterationNum);
または
int iterationNum = getIteration().getTotalIterationsCompleted() + 1; info("Insert data at the end of an existing queueA"); sharedData.offerLast("queueA", "last" + iterationNum); info("parameter type - String"); sharedData.offerFirst("queueA", "value"); info("parameter type - list of Strings"); ArrayList<String> listOfStr = new ArrayList<String>(); listOfStr.add(0, "val1"); listOfStr.add(1, "val2"); sharedData.offerFirst("queueA", listOfStr); ArrayList<String> queueValue = (ArrayList<String>) sharedData.pollFirst("queueA"); info("parameter type - boolean"); sharedData.offerFirst("queueA", true); info("parameter type - int"); sharedData.offerFirst("queueA", 10); info("parameter type - double"); sharedData.offerFirst("queueA", 10.5); info("parameter type - long"); sharedData.offerFirst("queueA", 100);
キューからデータを取得するには、次のようにします。
すでに説明したように、共有データ・サービスを設定してキューを作成し、キューにデータを挿入します。
Javaコード・ビューを開き、キューからデータを取得したいスクリプトに、データの取得に使用する共有データ・メソッドを挿入します。共有データ・サービスには、次のように長さおよびピークの取得(データの取得)と、データのポーリング(データの取得と削除)を行うメソッドが含まれています。
info("Get the length of queueA"); int actualLength = sharedData.getLengthOfQueue("queueA"); info("Get the most current item of queueA"); String queueValue1 = (String) sharedData.peekFirst("queueA"); info("Get the most current item of queueA - timeout after 5 seconds"); String queueValue2 = (String) sharedData.peekFirst("queueA", 5000); info("Get the oldest item of queueA"); String queueValue1 = (String) sharedData.peekLast("queueA"); info("Get the oldest item of queueA - timeout after 5 seconds"); String queueValue2 = (String) sharedData.peekLast("queueA", 5000); info("Get and remove the most current item from queueA"); String pollValue1 = (String) sharedData.pollFirst("queueA"); info("Remove the most current item from queueA - Timeout after 5 seconds"); String pollValue2 = (String) sharedData.pollFirst("queueA", 5000); info("Remove the oldest item from queueA"); String pollValue1 = (String) sharedData.pollLast("queueA"); info("Remove the oldest item from queueA - Timeout after 5 seconds"); String pollValue2 = (String) sharedData.pollLast("queueA", 5000); info("Waiting for an existing value 100 in queueA"); boolean isFound1 = sharedData.waitFor("queueA", 100); info("Waiting for an existing value 100 in queueA - timeout afer 5 seconds"); boolean isFound2 = sharedData.waitFor("queueA", 100, 5000);
キューからデータを使用するスクリプトに、他のカスタム・コードを追加します。
データを使用するスクリプトが終了したら、キューをクリアします。
共有データ・キューをクリアするには、次のようにします。
Javaコード・ビューを開き、キューをクリアしたいスクリプトに、クリアするキューの名前を指定したsharedData.clearQueue
コードを次のように挿入します。
info("Clear queueA"); sharedData.clearQueue("queueA");
データを使用するスクリプトが終了したら、キューを破棄します。キューを破棄すると、キューのデータとそのリスナーが開放され、キューに割り当てられていたメモリーが開放されます。
共有データ・キューを破棄するには、次のようにします。
Javaコード・ビューを開き、キューを破棄したいスクリプトに、破棄するキューの名前を指定したsharedData.destroyQueue
コードを次のように挿入します。
info("Destroy queueA"); sharedData.destroyQueue("queueA");
共有データ・ハッシュ・マップを作成するには、次のようにします。
スクリプト・プロジェクトを作成します。
共有データ・サービスが有効であり、すでに説明したようにパスワード暗号化と接続パラメータが指定されていることを確認します。
Javaコード・ビューを開き、ハッシュ・マップを作成したいスクリプトに、ライフ・タイム値を指定したsharedData.createMap
コードを次のように挿入します。
info("Create mapA with life time of 10 minutes"); sharedData.createMap("mapA", 10);
ハッシュ・マップの最大数は1000、ハッシュ・マップの最大容量は65535です。この最大値を超えると例外が発生します。ライフ・タイムの期限が切れると、ハッシュ・マップは破棄されます。
ハッシュ・マップに追加できる値の種類は、キューの場合と同じです。データ型のリストについては、「共有データ・キューへのデータの挿入」を参照してください。
既存のハッシュ・マップにデータを挿入するには、次のようにします。
すでに説明したように、共有データ・サービスを設定してハッシュ・マップを作成します。
Javaコード・ビューを開き、ハッシュ・マップにデータを挿入したいスクリプトに、キーと値を指定したsharedData.putToMap
コードを次のように挿入します。
int iterationNum = getIteration().getTotalIterationsCompleted() + 1; info("put key/value pair to an existing mapA"); sharedData.putToMap("mapA", "key" + iterationNum, "value" + iterationNum); info("parameter type - String"); sharedData.putToMap("mapA", "key", "value"); String mapValue = (String) sharedData.getFromMap("mapA", "key"); info("parameter type - list of Strings"); ArrayList<String> listOfStr = new ArrayList<String>(); listOfStr.add(0, "val1"); listOfStr.add(1, "val2"); sharedData.putToMap("mapA", "key", listOfStr); ArrayList<String> mapVal = (ArrayList<String>) sharedData.getFromMap("mapA", "key"); info("parameter type - boolean"); sharedData.putToMap("mapA", "key", true); info("parameter type - int"); sharedData.putToMap("mapA", "key", 10); info("parameter type - double"); sharedData.putToMap("mapA", "key", 10.5); info("parameter type - long"); sharedData.putToMap("mapA", "key", 100);
ハッシュ・マップからデータを取得するには、次のようにします。
すでに説明したように、共有データ・サービスを設定してキューを作成し、ハッシュ・マップにデータを挿入します。
Javaコード・ビューを開き、ハッシュ・マップからデータを取得したいスクリプトに、データの取得に使用する共有データ・メソッドを挿入します。共有データ・サービスには、次のようにハッシュ・マップのキーを取得し、ハッシュ・マップに対してデータの取得と削除を行うメソッドが含まれています。
info("Get all keys of mapA"); String [] lsKey = sharedData.getKeysOfMap("mapA"); info("Get key/value pair from mapA"); String actualValue = (String) sharedData.getFromMap("mapA", "key"); info("Get key/value pair from mapA - timeout after 5 seconds"); String actualValue1 = (String) sharedData.getFromMap("mapA", "key", 5000); info("Remove key/value pair from mapA"); String removeValue = (String) sharedData.removeFromMap("mapA", "key"); info("Remove key/value pair from mapA - timeout after 5 seconds"); String removeValue1 = (String) sharedData.removeFromMap("mapA", "key", 5000);
ハッシュ・マップからデータを使用するスクリプトに、他のカスタム・コードを追加します。
共有データ・モジュールには、共有データ・アクション用のスクリプトのAPI(アプリケーション・プログラミング・インタフェース)が含まれます。共有データAPIを使用して、Oracle Load Testingで仮想ユーザーとして実行される負荷テスト・スクリプト間でデータを受渡しできます。共有データは、コマンドラインから実行される機能テスト・スクリプト間のデータの受渡しにも使用されます。共有データ・モジュールに固有のコマンドは、"sharedData"クラスに属しています。共有データ・サービスを他のタイプのスクリプトと使用するには、個別に有効にする必要があります。また、有効にした他のクラス(サービス)のその他のコマンドや一般的なJavaコマンドをスクリプトで利用することもできます。
共有データ・モジュールAPIの例は次のとおりです。
clearMap
clearQueue
createMap
createQueue
destroyMap
destroyQueue
getFromMap
getKeysOfMap
getLengthOfQueue
offerFirst
offerLast
peekFirst
peekLast
pollFirst
pollLast
putToMap
removeFromMap
setConnectionParameters
waitFor
setConnectionParameters APIメソッドはスクリプトのツリー・ビューを使用して追加することができます。Javaコード・ビューを使用してさらにメソッドを追加することができます。