このトピックでは、カスタム負荷テスト コンポーネントを使用して Parasoft Load Test の機能を拡張する方法について説明します。このセクションの内容

カスタム負荷テストコンポーネントについて

カスタム負荷テストコンポーネントを作成して Parasoft Load Test の機能を拡張できます。Parasoft Load Test は、負荷テスト コンポーネントのコンテナーまたは負荷テスト bean として動作します。負荷テスト コンポーネントは、負荷テスト中の仮想ユーザーの動作を定義する機能的な中核です。負荷テスト コンテナーは、コンポーネントに以下のサービスを提供します。 

  • 負荷テスト シナリオに従った仮想ユーザー (および負荷テスト コンポーネント) の作成、呼び出し、廃棄
  • ローカル マシンおよびリモート マシンからのコンポーネント レポートの収集および複合負荷テスト レポートへの集積
  • 負荷テスト開始前にリモート マシンにコンポーネントをシリアライズ
  • 負荷テスト プロジェクトファイルへのコンポーネント設定の保存
  • GUI によるコンポーネント設定

負荷テスト コンポーネントを作成するには、com.parasoft.simulator.api パッケージに含まれる Load Test コンポーネント Java API の SimRunnable クラスを拡張します。SimRunnable は、Simulator runnable の略です。Simulator とは、Load Test コンテナーの名称であり、複数の仮想ユーザーのアクティビティをシミュレートします。

コンポーネント サンプルのビルド

コンポーネントのサンプルは、SOAtest/Load Test インストールディレクトリの examples\dev\components フォルダーにあります。simple-runnable-source.jar および socket-runnable-source.jarLoad Test のコンポーネント プロジェクト ディレクトリを手動で作成し、これらの jar ファイルを展開する必要があります。 

Load Test コンポーネント プロジェクト ディレクトリ

Load Test インストール ディレクトリの外にコンポーネント プロジェクト ディレクトリを作成するには、次の操作を行います。

  1. コンポーネント プロジェクト ディレクトリに simple-runnable-source.jar をコピーし、jar ファイルを展開します。
  2. SocketRunnable ディレクトリを手動で作成し、そこに socket-runnable-source.jar を展開します。それぞれのソース ディレクトリに component-build.xml ANT ビルド スクリプトがあります。
  3. このファイルを開き、load.test.install.root プロパティが SOAtest/Load Test インストール ディレクトリを正しく指していることを確認します。
  4. Load.test.jar.path プロパティが loadtest.jar (SOAtest/Load Test インストール ディレクトリの eclipse\plugins\com.parasoft.xtest.libs.web_[version_number]\root にあります) を指すよう変更します 。

SimpleRunnable Load Test コンポーネント プロジェクトの作成

Eclipse で SimpleRunnable 負荷テスト コンポーネント プロジェクトを作成するには、次の操作を行います。

  1. [新規プロジェクト] ウィザードで [Java Project] を選択し、[次へ] をクリックします。
  2. プロジェクト名として SimpleRunnable を指定します。
  3. [Create project from existing source] をオンにし、[SocketRunnable] ディレクトリを選択して [次へ] をクリックします。
  4. [Source] タブで、デフォルトの出力フォルダーとして [SocketRunnable/target/classes] が設定されていることを確認します。
  5. [Libraries] タブを開き、[Add External Jar] をクリックして、 parasoft.jar および com.parasoft.api.jar (SOAtest/Load Test インストール ディレクトリの eclipse\plugins\com.parasoft.xtest.libs.web_[version]\root ディレクトリにあります)を追加します。
  6. Eclipse で component-build.xml を右クリックし、[Run As] > [Ant Build] をクリックしてコンポーネントの .jar ファイルを作成します。

 

注意

コンポーネントは Java1.5 JRE (できれば JRE 1.5.0_18) でビルドする必要があります。

各サンプル プロジェクトに用意された Component-build.xml ANT スクリプトのデフォルト ターゲットは、コンポーネントの jar アーカイブをビルドします。その jar をカスタム コンポーネントまたはビルド コンポーネントとして Load Test にデプロイします。ここで説明しているとおり、Eclipse を使用してコンポーネント プロジェクトをコンパイルする場合、component-build.xml スクリプトの jar ターゲットから、コンパイル ターゲットの依存関係を削除します。 

SocketRunnable Load Test コンポーネント プロジェクトの作成

SocketRunnable コンポーネントは、SimpleRunnable コンポーネントを拡張します。先に SimpleRunnable をコンパイルし、SimpleRunnable プロジェクトのルート ディレクトリにある main.jar を SocketRunnable プロジェクトの lib ディレクトリに置きます。

Eclipse で SocketRunnable 負荷テスト コンポーネント プロジェクトを作成するには、次の操作を行います。

  1. [新規プロジェクト] ウィザードで [Java Project] を選択し、[次へ] をクリックします。
  2. [Create project from existing source] をオンにし、[SimpleRunnable] ディレクトリを選択して [次へ] をクリックします。
  3. [ソース] タブで、デフォルトの出力フォルダーとして [SimpleRunnable/target/classes] が設定されていることを確認します。
  4. [Libraries] タブを開き、[Add External Jar] をクリックして、 parasoft.jar および com.parasoft.api.jar (SOAtest/Load Test インストール ディレクトリの eclipse\plugins\com.parasoft.xtest.libs.web_[version]\root ディレクトリにあります)を追加します。
  5. [Libraries] タブで、lib/jtidy-r820.jar および lib/main.jar がプロジェクトのクラス パスに含まれていることを確認します。
  6. Eclipse で component-build.xml を右クリックし、[Run As] > [Ant Build] をクリックしてコンポーネントの .jar ファイルを作成します。

Load Test へのサンプル コンポーネントのロード/デプロイ

コンポーネントは、Load Test に外部アーカイブとしてロードするか、ビルトイン コンポーネントとしてデプロイできます。

外部アーカイブからのコンポーネントのロード

外部アーカイブからコンポーネントをロードするには、次の操作を行います。

  1. Load Test GUI で、Load Test コンフィギュレーション ツリーから [Profiles] ノードを選択します。
  2. プロジェクト設定パネルで [選択] をクリックします。
  3. [コンポーネント アーカイブの選択] ダイアログで [Local option] を選択して [次へ] をクリックし、負荷テスト コンポーネント アーカイブを選択します。
  4. [終了] をクリックします。次の図のように、コンポーネント デプロイメント ビューが表示されます。



コンポーネント検証が失敗した場合、デプロイメント ビューの下部にエラー メッセージが表示されます。 

コンポーネント アーカイブをビルトイン コンポーネントとしてデプロイ

コンポーネント アーカイブをビルトイン コンポーネントとして Load Test にデプロイするには、次の操作を行います。

  1. SOAtest/Load Test インストール ディレクトリの eclipse\plugins\com.parasoft.xtest.libs.web_[version]\root\lt-components\built-in フォルダーにコンポーネントの jar アーカイブを配置します。

  2. Load Test を再起動します。
  3. [ファイル] メニューの [設定のカスタマイズ] をクリックします。次の図のように、ビルトイン コンポーネント デプロイメント ビューにコンポーネント デプロイメントの詳細が表示されます。



    ビルトイン コンポーネントが正常にデプロイされていれば、次の図のように、[コンポーネント アーカイブの選択] ダイアログの [ビルトイン] ドロップダウン リストに表示されます。

Load Test コンポーネント API

Load Test コンポーネント API の Javadoc ドキュメントを参照するには、Load Test メニュー バーの [ヘルプ] メニューから [API] > [コンポーネント API] サブメニューをクリックします。

SimpleRunnable コンポーネント サンプルの詳細

このセクションでは、SimpleRunnable Load Test コンポーネントについて詳しく説明します。

SimpleRunnable は、指定された期間のテスト実行をエミュレートする簡単なコンポーネントであり、指定された周期でエラーを生成します。このサンプルを使用すると、Load Test コンポーネント API や、コンポーネント アーカイブの作成とデプロイメントの手順に慣れることができます。

負荷テスト コンポーネントの主要なメソッドは run(PrivateContext context) です。コンポーネントがユーザー アクティビティをエミュレートする際の動作は、このメソッド内に記述します。コンポーネントの run メソッドは、特定のプロファイルの仮想ユーザー オブジェクトから呼び出されます。仮想ユーザーは、テスト シナリオに従って Load Test から呼び出されます。

SimpleRunnable のその他のメソッドは、コンテナーが要求するさまざまなサービスを実行します。この後で、主要なコンポーネント メソッドについて説明します。その他のメソッドの詳細については、SimpleRunnable クラスのソース コードおよび SimRunnable の JavaDoc を参照してください。 

ここでは、コンポーネントの重要なメソッドについて説明します。

  • SimRunnableOutput run(PrivateContext context) – コンポーネントの中核機能を果たすメソッドです。メソッドへの引数として渡される PrivateContext を通じて、さまざまなコンテナー固有の変数にアクセスできます。利用可能なコンテキスト変数については、API ドキュメントの PrivateContext を参照してください。
  • String canRun() – このメソッドは、コンテナーによって呼び出され、コンポーネントが適切に構成され、呼び出しが可能であるかをチェックします。コンポーネントのすべてのメンバー変数が適切に初期化されているかをチェックします。適切に初期化されていない場合、エラーが返されます。コンポーネントの準備ができている場合、null が返されます。Null 以外の説明が返されると、Load Test がテストを開始できず、エラー メッセージが表示されます。
  • boolean done() – このメソッドは、クラスの run() メソッドが呼び出された後に呼び出され、コンポーネントがアクティビティを完了したかどうかを確認します。コンポーネントは、複数ステップからなるユーザー アクティビティをエミュレートでき、各ステップの後に、負荷テスト プロファイルで設定された仮想ユーザーの思考時間の分だけ待機します。この場合、run() メソッドは、done() が true を返すまで繰り返し呼び出されます。false が返されると、コンポーネント クラスのインスタンスが所属する仮想ユーザーが保持され、再び run() メソッドが実行されます。true が返されると、コンポーネント クラスのインスタンスが所属する仮想ユーザーが仮想ユーザー プールから削除されます。

    重要 - 仮想ユーザーの解放

    仮想ユーザーがプールから削除されるようにするには、いずれかの時点で done() を返す必要があります。1 つの仮想ユーザーがプールから削除されると、負荷テスト シナリオで同じプロファイルの仮想ユーザーが必要とされる場合は、新規仮想ユーザーによって置き換えられます。仮想ユーザーを解放することは重要です。それによって、スケジュールされた仮想ユーザー数およびヒット (秒) 率の増減に従うことができます。

  • SimRunnable prototype() – このメソッドは、ファクトリ メソッドです。コンテナーによって仮想ユーザーが作成されるたびに、コンポーネント クラスの新規インスタンスが割り当てられます。コンポーネントがコンテナーにデプロイされると、コンテナーはコンポーネント クラスのインスタンスを作成します。このインスタンスは、負荷テスト中に仮想ユーザーに割り当てられるコンポーネント クラス オブジェクトのプロトタイプの役割を果たします。API フレームワークは、コンポーネント クラスの prototype() メソッドを呼び出して、コンポーネント プロトタイプのコピーを取得し、それによってコンポーネントはコピーの作成方法を決定できます。このメソッドを実装する場合、必要なすべてのコンポーネント メンバー変数が新しく作成されるインスタンスにコピーされるようにしてください。コンポーネント クラス メンバーは、値または参照によってコピーできます。
    • コンポーネント クラス メンバーを参照でコピーする場合、同時アクセスや変更から、それらのクラス メンバーが適切に保護されるよう気をつけてください。この点が問題になる場合、値によるコピー (ディープ コピー) を検討してください。
    • コンポーネント クラス メンバーを値でコピー (ディープ コピー) する場合、Load Test が負荷テストを実行する間、何百、ときには何千という仮想ユーザー (つまりこのクラスのインスタンス) が同時に存在する可能性があることに注意してください。Load Test 内に存在する仮想ユーザーの数は、Load Test のモードおよび負荷テスト シナリオでスケジュールされた値に依存します。負荷テスト コンポーネントが占有するメモリが大きすぎる場合、アプリケーションのメモリが不足する可能性があります。その場合は、メンバー変数を参照で渡すことを検討してください。
  • void onDeploy(DeploymentContext context) – このメソッドは、コンポーネント アーカイブがコンテナーにデプロイされたときに、コンテナーによって呼び出されます。メソッドへの引数として渡される DeploymentContext を通じて、デプロイメント固有のさまざまな変数にアクセスできます。SimpleRunnable クラスでの、このメソッドの実装を参照すると、コンポーネントのデプロイメントに含まれるコンフィギュレーション (およびその他の) ファイルへのアクセス方法がわかります。
  • void writeExternal() および void readExternal() – これらのメソッドは、コンポーネントの状態をリモート マシンに転送します。

SimpleRunnable クラスの void writeExternal() および void readExternal() メソッドには実装のスケルトンしかなく、データの書き込みまたは読み取りを行わないことに注意してください。これらのメソッドは、コンポーネントの状態をリモート Load Test マシンに転送する際に使用されます。SimpleRunnable コンポーネントは、そのような状態の転送を必要としません。なぜなら、コンポーネントのアーカイブに含まれている外部構成ファイルを使用して、ローカルおよびリモートマシンでコンポーネントを設定するからです。writeExternal() および readExternal() の実装については、別のコンポーネントのサンプルで確認します。 

では次に、SimpleRunnable の外部構成ファイルを見てみましょう。SimpleRunnable コンポーネントのソース フォルダーには、2 つのコンポーネント構成ファイルがあります。LongExecTime.cfg および ZeroExecTime.cfgどちらか 1 つがコンポーネントのアーカイブに含められます (component-build.xml ANT スクリプトを参照) 

コンテナーにコンポーネント アーカイブがデプロイされると、アーカイブが展開され、DeploymentContext の DEPLOYMENT_BASE を使用して、コンポーネントがアーカイブのコンテンツを利用できるようになります。SimpleRunnable クラスの onDeploy メソッドの実装を確認すると、.cfg コンポーネント構成ファイルがどこにあり、どのように読み取られ、SimpleRunnableConfiguration のインスタンスが初期化されるかがわかります。負荷テスト構成にリモート マシンが含まれる場合、負荷テスト開始前にコンポーネント アーカイブが各リモート マシンに転送され、コンポーネントがデプロイされます。 

デプロイメント プロセスが完了すると、onDeploy メソッドが呼び出されます。onDeploy メソッドは、コンポーネント アーカイブに含まれている .cfg ファイルを読み取ってコンポーネントを初期化します。コンポーネント アーカイブは、リモート マシンに存在しないか、マスター マシンとリモート マシンでチェックサムが異なっている場合にだけ、シリアライズされてリモート マシンに送信されます。これにより、必要なときにだけリモート マシンへのコンポーネント アーカイブの転送が行われます。 

コンポーネント アーカイブの記述子

lt-jar.xml コンポーネント アーカイブ記述子が、コンポーネント アーカイブのルート ディレクトリになければなりません。記述子には、SimRunnable から派生されたメイン コンポーネント クラスの名前、および SimRunnableOutput から派生されたコンポーネント出力クラスの名前が記述されていなければなりません。コンポーネント アーカイブ記述子ファイルの書き方の例については、サンプル コンポーネントの lt-jar.xml ファイルを参照してください。

SimpleRunnable コンポーネントを使用した負荷テストの実行

SimpleRunnable を Load Test にデプロイし、SimpleRunnable のソース コードやコンポーネント アーカイブの構造を理解したら、コンポーネント アーカイブの構成を変更し、負荷テストを実行して、構成の変更によって結果がどのように変化するかを確認できます。たとえば、コンポーネントがエミュレートするテストの実行時間を変更するには、次の操作を行います。

  1. .cfg ファイルに execTimeMs パラメーターを追加します。
  2. コンポーネント アーカイブの ANT ビルド スクリプトを実行します。
  3. Load Test のコンポーネント ビューで、[リロード] ボタンをクリックします。



  4. 負荷テストを再実行します。負荷テストレポートの統計セクションに表示されるテスト実行時間が、設定された実行時間に沿っていることを確認します。



    実行統計は、コンポーネント構成ファイルで execTimeMs パラメーターの値が 1200 に変更されたことを反映しています。

SocketRunnable コンポーネント サンプルの詳細

このセクションでは、SocketRunnable コンポーネントについて詳しく説明します。SocketRunnable クラスは SimpleRunnable クラスを拡張し、以下を行います。 

  • アプリケーション ログに内部エラーを記録します
  • コンポーネント設定 GUI パネルを作成します
  • 負荷テスト プロファイル GUI パネルを作成し、プロファイル固有のコンポーネント設定を行えるようにします。
  • コンポーネント設定を負荷テスト プロジェクトに保存します。
  • コンポーネント設定をリモート マシンに転送します。
  • Jar ライブラリを使用してコンポーネントの機能を拡張します。
  • コンポーネント リソースをローカライズします。

SocketRunnable コンポーネントは、SocketTest クラスのインスタンスを使用して特定のホストおよびポートへの通信を確立し、カスタマイズされたリクエストを送信し、Java ソケットを使用してレスポンスを受信します。このコンポーネントに所属する SocketTest インスタンスは、SocketRunnable コンポーネント ビューで設定をカスタマイズできます。

 

アプリケーション ログに内部エラーを記録

ログはすぐに必要になる可能性があるため、SocketRunnable のコンストラクターで Engine から取得します。
Engine engine = (Engine)context.get(PrivateContext.ENGINE);
ComponentLog log = engine.getComponentLog();

コンポーネント設定 GUI パネルの作成

SimRunnableConfigViewProvider インターフェイスを実装すると、コンテナーにコンポーネントのカスタム設定ビューを表示できます。コンテナーは、上の図のとおり、Load Test Runnable コンポーネント パネルの設定タブに、このビューを表示します。コンテナーは、SimRunnableConfigViewProvider インターフェイスの getConfigView() メソッドを呼び出し、コンポーネントの設定ビューを取得します。このサンプルでは、SocketRunnableView クラスは、コンポーネント設定ビューを実装しています。SocketRunnableView クラスはcom.parasoft.loadtest.component.example.socket.test.view パッケージにある SocketTest*View クラスを使用して、個々の SocketTest インスタンス設定に対応します。

負荷テスト プロファイル GUI パネルの作成 - プロファイル固有のコンポーネントの設定

負荷テスト コンポーネントは、負荷テスト プロファイル固有の動作を実装できます。ProfileRunnable または SubProfileRunnable インターフェイスを実行するクラスは、負荷テスト コンポーネントに対する、プロファイル固有のサブコンポーネントとして動作します。それらのクラスは、コンポーネントのプロファイル固有の動作を実装します。

ProfileRunnable インターフェイスを実装する SocketRunnable サンプルには 2 つのクラスがあります。SocketProfileRunnable と the SocketTestWrapper です。SocketProfileRunnable は、ルート実行コンポーネント プロファイルであり、SocketTestWrappers のコンテナーです。SocketRunnable クラスは、SocketProfileRunnable インスタンスを 1 つ保持します。このインスタンスに、すべての設定済み SocketTestWrappers が格納されます。SocketRunnable も、SocketTestWrappers の Vector を保持します。この Vector は、特定の Load Test プロファイルに対する ProfileRunnables の選択を表します。負荷テスト コンフィギュレーションに含まれるプロファイルごとに、コンポーネント クラスのコピーが保持されます。これによって、プロファイル固有のコンポーネント設定が競合せず、互いを上書きしないことが保証されます。

SocketRunnable の populateSubProfileRunnables() メソッドは、プロファイル固有の PrivateContext から取得した ProfileRunnableMap に基づいて、selectedProfileRunnables Vector を設定します。ProfileRunnableMap には、負荷テスト プロファイル固有の ProfileRunnable の選択が保持されます。

負荷テスト プロファイル固有の ProfileRunnable を選択するには、次の図のように、SocketRunnable コンポーネントが ProfileRunnableViewProvider インターフェイスを実装していなければなりません。 

 

 

SocketRunnable は、API の ProfileRunnableTreeView を使用します。

コンポーネント設定を Load Test プロジェクトに保存

SaveablePropertiesProvider インターフェイスを実装すると、負荷テスト コンポーネントの設定を Load Test プロジェクトに保存できます。コンポーネントの設定は、SimRunnableProperties クラスによって表されます。SimRunnableProperties クラスは、コンポーネントのプロパティ名/値のペアを格納します。 

コンポーネント プロパティは、コンポーネント クラスとは独立した String 値として保存する必要があります。それにより、コンポーネントがデプロイされていなくても、プロジェクトを Load Test に読み込むことができます。同時に、プロジェクトに複数のコンポーネント タイプの設定を格納できるようになります。コンテナーは、SimRunnableProperties クラスの tag フィールドを使用して、コンポーネントに適切なプロパティ インスタンスを返します。tag の値は、コンポーネント開発者によって設定されます。SoatestRunnable は、保存可能なプロパティのタグとして、"SOCKET_RUNNABLE_SAVEABLE_PROPS_V.1" という文字列を使用します。 

コンポーネント設定を保存する際に、名前/値のプロパティ ペアよりも複雑なデータ構造が必要な場合、名前/値ペアの代わりに XML を使用できます。コンポーネント設定を XML 表現にシリアライズし、XML 文字列を SimRunnableProperties インスタンスの単一の名前/値ペアに保存します。XML を使用してコンポーネント設定を保存する方法の例については、SocketRunnableXMLSerializer を参照してください。

コンポーネント設定のリモート マシンへの転送

負荷テスト コンポーネント設定は、負荷テスト プロジェクトから読み取られたり、チーム メンバーによって変更される場合があり、リモート 負荷テスト マシンに転送する必要があります。コンポーネント クラスによって実装される ParasoftExternalizable インターフェイスの readExternal/writeExternal メソッドで、コンポーネントの状態の転送処理を実装する必要があります。SocketRunnable コンポーネントの設定可能な部分は、SocketProfileRunnable 型の rootProfileRunnable メンバー変数で表されるため、この変数をリモート マシンに転送します。SocketProfileRunnable クラスをシリアライズしてリモート マシンに送信する処理は、このクラスの readFrom/writeOn および readExternal/writeExternal メソッドの実装に記述されています。負荷テスト プロジェクトにコンポーネント設定を保存するコードを再利用して、リモート マシンへのシリアライズを行うこともできます。SocketRunnable サンプルの場合、SocketRunnableXMLSerializer クラスの機能を再利用して、コンポーネント設定をリモート マシンにシリアライズ/デシリアライズできます。 

Jar ライブラリを使用したコンポーネントの機能の拡張

コンポーネントのコードで、任意の Java ライブラリを使用できます。SocketRunnable サンプルのコードは、Web ページのリクエストに対するレスポンスとして受信した HTML コードを解析するために JTidy ライブラリを使用しています (SocketTest クラスの checkTidy メソッドを参照)。コンポーネントの依存先 jar ファイルは、コンポーネントの jar アーカイブの lib フォルダーになければなりません (component-build.xml ANT スクリプトでビルドされた socket.jar コンポーネント アーカイブを参照)。 

コンポーネント リソースのローカライズ

LocalizationUtil API クラスを使用して、コンポーネントの文字列をローカライズできます。SocketRunnable サンプルの Localization クラスは、適切なリソース バンドルをロードし、LocalizationUtil メソッドをラップしてアクセスを容易にします。

  • No labels