FlexMonkey用のJavaクライアント、またはJavaスタイルのLocalConnection





Flexアプリケーションの開発に関係する多くのチームでは、遅かれ早かれ、自動化された製品テストの問題が発生すると思います。 そして、私たちのチームはオンラインポーカー用のAIRクライアントを開発しているので、この疑問が私たちに生じたのは当然です。



最初はQAチームによって排他的に解決され、FlexMonkeyを含むいくつかのツールを調査しました。 特に、Habréに関するこの記事は無視されませんでした。



テストサイクルには、管理パネルを介したテーブルの追加、サイトでの登録プロセス、クライアントのダウンロード、インストール、起動が含まれます。 このため、SeleniumテストケースはJavaで作成されました。 Seleniumの標準FlexMonkeyプラグイン-FlexMonkium-は、Flashプラグインのブラウザで実行されているFlexアプリケーションでのみ動作するため、次に何をするかは不明でした。これは、JSで記述され、 AIRランタイム 同様に、標準のFlexMonkeyコンソールは、以前はJava実装が存在しなかった純粋にFlashベースのLocalConnectionテクノロジーを介して、AIRを含むFlexアプリケーションと対話します。 今では存在します。



JavaでFlexMonkeyのクライアントを作成することが決定され、見積もりが行われ、仕事に取り掛かりました。 今年の7月19日に、ライブラリの主要な作業が完了した後、新世代のFlexMonkeyフレームワーク(現在はMonkeyTalkと呼ばれる)がリリースされ、すぐに紹介した後、クロステクノロジーの問題が解消されたソケットを介したクライアントとエージェントの接続の編成ですが、得られた経験に満足しており、GorillaLogicの古いアーキテクチャに基づいてこの製品を開発し続けると思います。



プロローグ


そのため、まず、LocalConnectionの概要とその操作方法を理解する必要がありました。 Web全体では、LocalConnectionの内部構造を完全に説明しているわけではありませんが、ソースは1つしかなく、そこにある情報は少し古くなっています。 こちらがこの記事です。



この記事から何を理解できますか? そのLocalConnectionは、システム内のMacromediaFMOmegaという名前の65535バイトのメモリファイルマッピングオブジェクトであり、MacromediaMutexOmegaという名前のミューテックスをキャプチャすることによって排他アクセスが提供されます。 このメモリ領域のマップ例は次のとおりです。







マップからわかるように、このプロトコルは両方のバージョンのAMFエンコードを完全に使用します。 AMF(Action Message Format)は、アドビが開発したバイナリデータプレゼンテーションプロトコルです。 AMF0の仕様はここで利用可能です 、AMF3のためにここで



一般に、メッセージを受信するプロセスは次のようになります。



メッセージを記録するプロセスは次のようになります。



Javaパーツ


Java標準ライブラリにはメモリファイルマッピングを操作するための通常のツールがないため、ネイティブJNIライブラリを作成してこのテクノロジを使用することが決定されました。 ライブラリはVisual Studio Express 2010のC ++で記述され、32ビットアーキテクチャでアセンブルされました。 ミューテックスの作成/キャプチャ/解放、ファイルマッピングオブジェクトの作成/取得/解放、オブジェクトへの書き込み/読み取り、およびタイムスタンプを取得するために必要なWinAPI関数GetTickCount()のラッパーメソッドが含まれています。



次に、LocalConnection Javaクラスが記述されました。これは、イベントを除き、Flashの対応するインターフェイスを完全に回転させます。 これには、LocalConnectionSinkインターフェースを実装するクラスのインスタンスを受け入れるsetClient()メソッドがあります。これは、onInvoke(Stringメソッド、Object ... args)メソッドを定義します。このメソッドは、パラメーターを持つターゲットメソッドの名前による着信呼び出しを実際に受け入れます。 send()メソッドは、Flashのメソッドを繰り返し、接続の名前、呼び出されるメソッドの名前、そのパラメーターを受け入れ、送信のためにすべてキューに入れます。



独立したスレッドがクラス自体で機能し、ループ内でリスナーを追加/メッセージを読み取り、受信者をチェック/メッセージを書き込みます。 新しいメッセージが到着すると、クライアントのonInvoke()メソッドをプルします。 AMFとの間のシリアライザ/デシリアライザとして、 BlazeDSの対応するライブラリが使用されます。 すべてが非常に簡単です。



次に、アプリケーションのFlexMonkey自動化エージェントとのメッセージを確立する必要がありました。 SWCライブラリを追加してプロジェクトに接続し、MonkeyLinkクラスがエントリポイントとして機能し、プロトコル自体が実際に呼び出されます。エージェント側では、エンドポイントを「_agent」という名前で登録し、クライアントは「_flexMonkey」という名前で登録する必要があります。 このクラスには、いくつかのパブリックメソッドが含まれています。 pingメソッドは、クライアント/エージェントを0.5秒ごとに対称的にpingするために使用されます。 呼び出し中にisConnectedフラグが設定されます。これは、反対側がまだ生きており、メッセージを受信して​​いることを示します。 タイマーにより、5秒ごとに、このフラグはリセットされます。



このクラスには、MonkeyRunnableクラスの子孫のインスタンスを受け入れるいくつかのメソッドも含まれています。 これらは、従来のFlexMonkeyコンソールのツールバーに表示されるアクションです。



これに基づいて、このクラスのJavaアナログ、およびActionScriptのFlexMonkeyコマンドのJavaアナログが開発されました。 これらは、SetProperty、CallFunction、VerifyProperty、UIEventなどのコマンドです。 このクラスにはplayCommand()メソッドが含まれます。このメソッドは、必要なパラメーターを使用してコマンドのインスタンスを取得し、シリアル化し、LocalConnectionを介してエージェントに送信します。



また、このクラスには2つの追加スレッドが含まれます。最初に0.5秒でエージェントにpingを送信し、5秒で2回目にisConnectedフラグを破棄します。



その上に、FlexMonkeyAutomatorクラスの形式でラッパーが作成されました。これは、エージェントで同時にアクションを呼び出すためのシンプルなAPIをQAエンジニアに提供します。 また、アクションを呼び出す試行回数とそれらの間の遅延を指定することもできます。 一般に、テストアプリケーションとのセッションは次のようになります。



MonkeyLink monkeyLink = new MonkeyLink(); if (monkeyLink.startLink(2000)) { //   ,  2  FlexMonkeyAutomator flexMonkeyAutomator = new FlexMonkeyAutomator(monkeyLink); flexMonkeyAutomator.setProperty(... flexMonkeyAutomator.storeValue(... flexMonkeyAutomator.uiEvent(... flexMonkeyAutomator.verifyProperty(... flexMonkeyAutomator.callFunction(... monkeyLink.disconnect(); }
      
      







すべてのFlexMonkeyAutomatorメソッドには、タイムアウトを最後のパラメーターとして使用するオーバーロードバージョンが含まれています。 これは特にこの場合に便利です:最後のアクションで、アプリケーションの終了ボタンをクリックすると、アプリケーションが閉じてアクションの結果を送信する時間がありません。この場合、アクション呼び出しメソッドの通常のバージョンは制御を返さず、テストスクリプトは終了しませんが、ここで、タイムアウトバージョンは正常に完了します。



このライブラリのすべてのソースは、 BitBucketで入手できます。 govnokodが豊富なテストSwingアプリケーションを含むJMonkeyLinkTestプロジェクトを真剣に受け止めないでください。これは、個々のライブラリ機能の状況テストのみを目的としており、主なテストは戦闘スクリプトのQAによって実行されます。



PS:私は完全に忘れていました。 Java側でコマンドをシリアル化する場合、ActionScriptのFQDNに対応するFQDNを割り当てますが、何らかの理由でそれらは通常のオブジェクトに非シリアル化されるため、テスト対象のアプリケーションではregisterClassAlias()を介して次のように登録する必要があります:

 registerClassAlias("com.gorillalogic.flexmonkey.monkeyCommands.CallFunctionMonkeyCommand", CallFunctionMonkeyCommand);
      
      





まあ、この製品が誰かに利益をもたらし、LocalConnectionを使用してプロジェクトのJavaとFlash / Flexコード間の相互作用を構築したい人にも役立つことを願っています。 ご清聴ありがとうございました。



All Articles