Flex Stress Testing Framework はその名のとおり Flex Data Services (FDS) のストレステスト用フレームワークです。Adobe Labs にベータ版が公開されています。(Flex Stress Testing Framework@Labs)
管理用のアプリケーションが提供され、受信したメッセージの数や終了したトランザクションの数などを知ることができます。Flex Stress Testing Framework では AMF や RTMP などのプロトコルでの接続にも対応しています。
Flex Stress Testing Framework (長いので以下 FSTF) はデータの記録にも FDS を使うため、FDS を使ったことの無い方には少し設定が分かりにくいかもしれません。よろしければこの機会に経験してみてください。
フレームワーク及び簡単なサンプルファイルは Labs からダウンロードできます。(flexstress_11_30_06.zip: 116K)
クライアント側の設定
FSTF を使うには、まずクライアント側の設定を行います。クライアント側では Test Browser Server と呼ばれるサーバを実行します。このサーバは負荷テストのクライアントとなるブラウザを起動する役目を持っていて、起動されたブラウザにテストの対象となる Flex アプリケーションが読み込まれます。
実行方法は次のとおりです。
> java -jar browserServer.jar ...: browserServer version 0.95 ...: starting server on port 7777 ...: server ready
メッセージの2行目でポート番号 7777 が使用されていることがわかります。これは jar ファイルと同じディレクトリにある browserServer.properties ファイル内の serverPort を編集すれば変えることができます。
ie="C:\\Program Files\\Internet Explorer\\iexplore.exe" firefox="C:\\Program Files\\Mozilla Firefox\\firefox.exe" default=ie serverPort=7777
テストに使用するブラウザもこのファイルに記述されている必要があります。IE や Firefox 以外のブラウザを追加する場合はパスを properies ファイルに追加してください。
なお browserServer は一度に複数のウインドウを起動することはできますが同じのブラウザのウインドウのみしか開けません。複数の種類のブラウザを実行する場合は browserServer を複数立ち上げる必要があります。
サーバ側の設定
さて、サーバ側では FDS を使用するための設定を行います。設定ファイルの詳細な説明は省きますので(すみません)製品のドキュメントも合わせてご覧ください。
まず、services-config.xml に以下の設定を追加します。
<channel-definition id="perf-rtmp" class="mx.messaging.channels.RTMPChannel"> <endpoint uri="rtmp://{server.name}:2296" class="flex.messaging.endpoints.RTMPEndpoint"/> <properties> <idle-timeout-minutes>20</idle-timeout-minutes> <client-to-server-maxbps>100K</client-to-server-maxbps> <server-to-client-maxbps>100K</server-to-client-maxbps> </properties> </channel-definition>
この設定で browserServer と FDS の通信用 RTMP サーバを設定します。上記ではポート 2296 を指定していますので、他の設定と重ならないよう注意してください。
次に data-namagement-config.xml に次のエントリを追加します。
<destination id="Perf.Participants" channels="perf-rtmp" adapter="java-dao"> <properties> <source>perf.controller.ParticipantAssembler</source> <scope>application</scope> <metadata> <identity property="id"/> </metadata> <network> <session-timeout>0</session-timeout> <paging enabled="false" /> <throttle-inbound policy="ERROR" max-frequency="500"/> <throttle-outbound policy="REPLACE" max-frequency="500"/> </network> <server> <fill-method> <name>fill</name> </fill-method> <sync-method> <name>sync</name> </sync-method> </server> </properties> </destination>
この Perf.Participants という id で追加された destination にストレステストの結果を各クライアントから受け取るプログラム(perf.controller.ParticipantAssembler)が指定されています。最終的な結果の取得もこの destination から行います。
次は proxy-config.xml 内の DefaultHTTP というエントリを少し修正します。
<destination id="DefaultHTTP"> <properties> <dynamic-url>*</dynamic-url> </properties> </destination>
この設定で任意の URL で DefaultHTTP が使用できるようになります。社内のテストサーバとかではなく公開されているサーバ等での設定の場合はちゃんとテスト環境に応じた設定を行うことをお勧めします。
さて、あとは必要なファイルをコピーして終わりです。
//WEB-INF\flex\user_classes に Participant.as events\TimeUpEvent.as events\StartRequestEvent.as qa\perf\BrowserServerManager.as qa\perf\BrowserServerTestRunner.as //WEB-INF\classes に perf\controller\Participant.class perf\controller\ParticipantAssembler.class //Web アプリケーションのルートディレクトリに管理用アプリケーションを TestAdmin.mxml
テストプログラムの作成
テストプログラムは通常の Flex アプリケーションに Participant クラスのインスタンス生成を追加したものになります。ASDoc が無いようですので、使い方は zip ファイル内の simpleLoadTest.mxml を参照してください。
主要な箇所のみ説明しますと、まず、管理アプリケーションから起動するとテストアプリケーションがロードされる際に Application.application.parameters に個々のクライアント専用の id が設定されているはずですので、これを Participant のコンストラクタに指定します。
var id:String = Application.application.parameters.id; // id があれば管理プログラムからの起動 var monitored:Boolean = (id != null); var name:String = id; p = new Participant(name,monitored);
それから管理アプリケーションからのイベントで呼び出されるイベントハンドラも設定します。インスタンスでなく Participant.eventdispatcher に設定します。
// テスト開始イベント Participant.eventdispatcher.addEventListener("startRequest",startTest); // テスト終了イベント Participant.eventdispatcher.addEventListener("timeUp", stopTest); ... private function startTest(e:Object):void { // テスト開始に必要な初期化を行う p.startTest(startTimer,e.duration); } private function startTimer():void { requestTimer.start(); } private function stopTest(e:Object):void { // テストの後処理を記述 if (p.testCount == 0) { // 初めてのテストなら 0 のはず requestTimer.stop(); p.testStopAt = getTimer(); ... } }
startRequest イベントで Participant インスタンスの startTest() メソッドを必ず呼ぶ必要があります。引数には実行する関数とテスト時間(イベントオブジェクトから取得)を設定します。
テストの実行
以上でようやくテスト環境が整いました。browserServer が起動されていること、ブラウザに必要なバージョンの Flash Player がインストールされていること、を確認したら TestAdmin.mxml をブラウザで開きます。
後は、以下のステップです。
- テストアプリケーションの URL を入力
- テストを実行する時間と必要な Flash Player のバージョンを指定
- 各 browserServer の情報(ホスト名、ポート、ブラウザの種類)を入力
- browserServer ごとに開くブラウザの数を指定
- ブラウザのタイムアウト値を指定(TestAdmin が正常に後処理をできなかったときのため-テスト時間より大きな値を入れること)
- LaunchBrowsers ボタンをクリックしてテスト開始
- 結果の確認
と、長くなってしまいましたがぜひお試しいただければと思います。フィードバックなどもお寄せください。
コメントする