このトピックでは、カスタム負荷テスト コンポーネントを使用して Parasoft Load Test の機能を拡張する方法について説明します。このセクションの内容
カスタム負荷テストコンポーネントを作成して Parasoft Load Test の機能を拡張できます。Parasoft Load Test は、負荷テスト コンポーネントのコンテナーまたは負荷テスト bean として動作します。負荷テスト コンポーネントは、負荷テスト中の仮想ユーザーの動作を定義する機能的な中核です。負荷テスト コンテナーは、コンポーネントに以下のサービスを提供します。
負荷テスト コンポーネントを作成するには、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 インストール ディレクトリの外にコンポーネント プロジェクト ディレクトリを作成するには、次の操作を行います。
simple-runnable-source.jar
をコピーし、jar ファイルを展開します。SocketRunnable
ディレクトリを手動で作成し、そこに socket-runnable-source.jar
を展開します。それぞれのソース ディレクトリに component-build.xml
ANT ビルド スクリプトがあります。load.test.install.root
プロパティが SOAtest/Load Test インストール ディレクトリを正しく指していることを確認します。Load.test.jar.path
プロパティが loadtest.jar
(SOAtest/Load Test インストール ディレクトリの eclipse\plugins\com.parasoft.xtest.libs.web_[version_number]\root
にあります) を指すよう変更します 。Eclipse で SimpleRunnable 負荷テスト コンポーネント プロジェクトを作成するには、次の操作を行います。
SimpleRunnable
を指定します。SocketRunnable/target/classes
] が設定されていることを確認します。eclipse\plugins\com.parasoft.xtest.libs.web_[version]\root
ディレクトリにあります)を追加します。
コンポーネントは Java1.5 JRE (できれば JRE 1.5.0_18) でビルドする必要があります。 各サンプル プロジェクトに用意されたComponent-build.xml ANT スクリプトのデフォルト ターゲットは、コンポーネントの jar アーカイブをビルドします。その jar をカスタム コンポーネントまたはビルド コンポーネントとして Load Test にデプロイします。ここで説明しているとおり、Eclipse を使用してコンポーネント プロジェクトをコンパイルする場合、component-build.xml スクリプトの jar ターゲットから、コンパイル ターゲットの依存関係を削除します。 |
SocketRunnable コンポーネントは、SimpleRunnable コンポーネントを拡張します。先に SimpleRunnable
をコンパイルし、SimpleRunnable プロジェクトのルート ディレクトリにある main.jar
を SocketRunnable プロジェクトの lib
ディレクトリに置きます。
Eclipse で SocketRunnable 負荷テスト コンポーネント プロジェクトを作成するには、次の操作を行います。
SimpleRunnable/target/classes
] が設定されていることを確認します。eclipse\plugins\com.parasoft.xtest.libs.web_[version]\root
ディレクトリにあります)を追加します。lib/jtidy-r820.jar
および lib/main.jar
がプロジェクトのクラス パスに含まれていることを確認します。コンポーネントは、Load Test に外部アーカイブとしてロードするか、ビルトイン コンポーネントとしてデプロイできます。
外部アーカイブからコンポーネントをロードするには、次の操作を行います。
コンポーネント検証が失敗した場合、デプロイメント ビューの下部にエラー メッセージが表示されます。
コンポーネント アーカイブをビルトイン コンポーネントとして Load Test にデプロイするには、次の操作を行います。
SOAtest/Load Test インストール ディレクトリの eclipse\plugins\com.parasoft.xtest.libs.web_[version]\root\lt-components\built-in
フォルダーにコンポーネントの jar アーカイブを配置します。
Load Test コンポーネント API の Javadoc ドキュメントを参照するには、Load Test メニュー バーの [ヘルプ] メニューから [API] > [コンポーネント API] サブメニューをクリックします。
このセクションでは、SimpleRunnable Load Test コンポーネントについて詳しく説明します。
SimpleRunnable は、指定された期間のテスト実行をエミュレートする簡単なコンポーネントであり、指定された周期でエラーを生成します。このサンプルを使用すると、Load Test コンポーネント API や、コンポーネント アーカイブの作成とデプロイメントの手順に慣れることができます。
負荷テスト コンポーネントの主要なメソッドは run(PrivateContext context) です。コンポーネントがユーザー アクティビティをエミュレートする際の動作は、このメソッド内に記述します。コンポーネントの run メソッドは、特定のプロファイルの仮想ユーザー オブジェクトから呼び出されます。仮想ユーザーは、テスト シナリオに従って Load Test から呼び出されます。
SimpleRunnable のその他のメソッドは、コンテナーが要求するさまざまなサービスを実行します。この後で、主要なコンポーネント メソッドについて説明します。その他のメソッドの詳細については、SimpleRunnable クラスのソース コードおよび SimRunnable の JavaDoc を参照してください。
ここでは、コンポーネントの重要なメソッドについて説明します。
boolean done() – このメソッドは、クラスの run() メソッドが呼び出された後に呼び出され、コンポーネントがアクティビティを完了したかどうかを確認します。コンポーネントは、複数ステップからなるユーザー アクティビティをエミュレートでき、各ステップの後に、負荷テスト プロファイルで設定された仮想ユーザーの思考時間の分だけ待機します。この場合、run() メソッドは、done() が true を返すまで繰り返し呼び出されます。false が返されると、コンポーネント クラスのインスタンスが所属する仮想ユーザーが保持され、再び run() メソッドが実行されます。true が返されると、コンポーネント クラスのインスタンスが所属する仮想ユーザーが仮想ユーザー プールから削除されます。
仮想ユーザーがプールから削除されるようにするには、いずれかの時点で done() を返す必要があります。1 つの仮想ユーザーがプールから削除されると、負荷テスト シナリオで同じプロファイルの仮想ユーザーが必要とされる場合は、新規仮想ユーザーによって置き換えられます。仮想ユーザーを解放することは重要です。それによって、スケジュールされた仮想ユーザー数およびヒット (秒) 率の増減に従うことができます。 |
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 を Load Test にデプロイし、SimpleRunnable のソース コードやコンポーネント アーカイブの構造を理解したら、コンポーネント アーカイブの構成を変更し、負荷テストを実行して、構成の変更によって結果がどのように変化するかを確認できます。たとえば、コンポーネントがエミュレートするテストの実行時間を変更するには、次の操作を行います。
このセクションでは、SocketRunnable コンポーネントについて詳しく説明します。SocketRunnable クラスは SimpleRunnable クラスを拡張し、以下を行います。
SocketRunnable コンポーネントは、SocketTest クラスのインスタンスを使用して特定のホストおよびポートへの通信を確立し、カスタマイズされたリクエストを送信し、Java ソケットを使用してレスポンスを受信します。このコンポーネントに所属する SocketTest インスタンスは、SocketRunnable コンポーネント ビューで設定をカスタマイズできます。
ログはすぐに必要になる可能性があるため、SocketRunnable のコンストラクターで Engine から取得します。Engine engine = (Engine)context.get(PrivateContext.ENGINE);
ComponentLog log = engine.getComponentLog();
SimRunnableConfigViewProvider インターフェイスを実装すると、コンテナーにコンポーネントのカスタム設定ビューを表示できます。コンテナーは、上の図のとおり、Load Test Runnable コンポーネント パネルの設定タブに、このビューを表示します。コンテナーは、SimRunnableConfigViewProvider インターフェイスの getConfigView() メソッドを呼び出し、コンポーネントの設定ビューを取得します。このサンプルでは、SocketRunnableView クラスは、コンポーネント設定ビューを実装しています。SocketRunnableView クラスはcom.parasoft.loadtest.component.example.socket.test.view パッケージにある SocketTest*View クラスを使用して、個々の SocketTest インスタンス設定に対応します。
負荷テスト コンポーネントは、負荷テスト プロファイル固有の動作を実装できます。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 を使用します。
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 クラスの機能を再利用して、コンポーネント設定をリモート マシンにシリアライズ/デシリアライズできます。
コンポーネントのコードで、任意の Java ライブラリを使用できます。SocketRunnable サンプルのコードは、Web ページのリクエストに対するレスポンスとして受信した HTML コードを解析するために JTidy ライブラリを使用しています (SocketTest クラスの checkTidy メソッドを参照)。コンポーネントの依存先 jar ファイルは、コンポーネントの jar アーカイブの lib フォルダーになければなりません (component-build.xml ANT スクリプトでビルドされた socket.jar コンポーネント アーカイブを参照)。
LocalizationUtil API クラスを使用して、コンポーネントの文字列をローカライズできます。SocketRunnable サンプルの Localization クラスは、適切なリソース バンドルをロードし、LocalizationUtil メソッドをラップしてアクセスを容易にします。