‎Slim3でAjaxを活用したアプリケーションを構築するAppEngineではサーバ側でページを出力するタイプではなく、サーバ側はデータを処理して必要な値をJSONで返すだけ、というAjaxを使った実装が標準だと感じています。サーバ側でページを出力していると、AppServerの異常時をハンドルできない。serverさえ無事なら何らかの処理が可能。リクエストがSpinUpに当たった場合に、Ajaxだとページの一部分の読み込みだけに時間がかかるので、SpinUpにかかる時間をごまかしやすい。これはAjaxの特徴そのまんまですが。サーバ側のJavaアプリケーションは全て自動テストできる。サーバ側(Java側)の自動テストが「できる部分」「できない部分」混在するよりはスッキリするという印象。Client側の自動テストの問題は残ってしまうが、それはAjax使っても使わなくても同じ。管理画面などは最も作りやすいフレームワークを使うのが良いと思いますけれども。Eclipseがインストール済みであるeclipseのclasspathの設定にmavenのローカルリポジトリへの参照として"M2_REPO"変数が定義されている手順ここではmavenを使った手順で説明します。CIまで考えると、Hudsonと相性が良いmavenを使っておくのが良いかなと思いますね。pluginを使ってプロジェクトを作成する。-DarchetypeCatalog=http://slim3.googlecode.com/svn/trunk/repositoryjson-libとhamcrest-libraryを利用したいので、pom.xmlに以下を追記する。pom.xml<dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.3</version><classifier>jdk15</classifier></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-library</artifactId><version>1.1</version><scope>test</scope></dependency>json-libの最新バージョンはmvnrepository.comで確認できる。実行してeclipseプロジェクトを生成する。生成したプロジェクトをeclipseにインポートするControllerの基底クラス次のような、必ずJSONをレスポンスする基底クラスを作成し、全てのControllerはこのクラスを継承するように作ることにします。"データストアがタイムアウトしました。"データストアのアクセスに失敗しました。"30秒を超えても処理が終了しませんでした。"予期せぬエラーが発生しました。null;}}ちょっと長いコードですが、ステータス・エラーコード・エラーメッセージ・リトライ可能かどうか、を表す専用のキー文字列を用意して、クライアント側(JavaScript)では必ずこれらの値に応じた処理をする、というようなルールにします。処理としては一部の例外を専用に用意したコードでハンドルし、それ以外の例外をまとめてUNKNOWNとしてレスポンスを組み立てているだけです。world!"を表示するアプリケーションを作ってみます。pluginを使ってプロジェクトを生成するといくつかソースのテンプレートが含まれますが、今回は必要ないので最初から存在するクラスは全て消してしまいましょう。新しくsrc/test/java/.../IndexControllerTest.javaを作成するとします。{tester.tearDown();}}Slim3のControllerTesterが大変便利なので、それを使います。この例ではHttpステータスと、レスポンスされた文字列からJSONObjectを組み立てて、"status"と"message"の内容を確認しています。例では単なる文字列しか使用していませんが、POJOやList<POJO>を返す場合はJSONObject#getJSONObject()やJSONObject#getJSONArray()を使用する事になります。このようにしてレスポンスを簡単に確認できるため、サーバ側のソースコードは100%自動テストの対象とすることができます。map;}}特に説明する内容はありません。Object>を組み立てて返すだけです。先に作成したIndexControllerTestクラスをJUnitで実行すると動作が確認できます。IndexControllerTestは、サクッとEclipseから実行しても構いませんし、もちろんmavenを使って実行することもできます。Hudson等のCI環境でも実行可能です。index.htmlまずはこのサンプルではjqueryを使うので、jquery-XXX.jsをプロジェクトのwarフォルダへコピーしておきます。次に、warフォルダ直下にindex.htmlを作成します。開いて動作確認します。サーバ側のJavaモジュールは既にテストを通しているので、Slim3のHotReloadingもオフで構いません。HTMLやJSの修正であればWebサーバの再起動も必要ありません。id="message"><span>ここにメッセージが表示されます。/></p></body></html>この例では、通信結果のstatusしか判断していませんが、基本形はこのようなものです。アプリケーションの規模に合わせて、以下のようにJS側もしっかりフレームワーク化しておいた方が良いです(このレイヤはAppEngineとは全然関係ない、一般的な話なのでJSに詳しいサイトを参照する方が良いです)。JS内でもMVCに分けてオブジェクトを管理するリトライ処理についてはライブラリ化するなどしてラップするスクリーンショットその他の工夫ブラウザからテストする際のリクエストの内容をログとして出力し、サーバ側の自動テストのインプットとして利用する事ができるような開発環境用のFilterを使ってみたり。手動でデータを叩いたなら、利用しないと勿体無いです。異常系のレスポンスをJS側でハンドルする処理を試すための専用のFilterを使ってみたり。課題JSのテストをするために、以下のような仕組みがあればもっと効率がよくなりそうです。サーバへリクエストを投げる際、通信処理を差し替えられる(サーバ側の静的に配置されたファイルを読むとか)ような仕組み。JS内の任意の箇所に、assertionを差し込んでログを取るような仕組み。どちらもAOPっぽく定義できると便利そう。