Page tree

Skip to end of metadata
Go to start of metadata

このトピックでは、カスタム負荷テスト コンポーネントを使用して 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