The HIRO Says

If you smell what The HIRO is cooking!!!

slim3のテストコードの注意点

slim3 でプログラムを生成すると、自動的にテストコードも作成してくれます。
ただ、テストコードは jUnit 4.7 を使用しているため、3.x 系とは色々と違うところがあります。
(私は知らなかったのでハマりました…)
今回は、jUnit 3.x 系との違いをまとめてみました。


具体的な違い

1.@Testアノテーションの存在

jUnit 4.x 系では、@Test アノテーションのついているメソッドがテストケース(テストメソッド)になります。
jUnit 3.x 系では、テストケースにいちいち testXxx() という名称をつける必要が(事実上)ありましたが、jUnit 4.x 系では、テストケースに好きな名称をつけることができます。
メソッドの命名に自由度が広がるので、テストコードの可読性・保守性を高められそうです。
EclipseMavenjUnit 3.x 系を実行すると、testXxx() という名称じゃないとテストケースと認識してくれないです。

2.検証メソッドの追加

自動生成されたコードを見てみると、以下のようなロジックがあります。

    assertThat(target, is(notNullValue()));


少なくとも、以下のメソッドが追加されていますよね。

  1. assertThat()
  2. is()
  3. notNullValue()

それぞれの意味は、以下の通りです。


(1)assertThat()
・org.junit.Assert#assertThat()
・org.hamcrest.Matchers を第2引数にとり、
 第1引数の値が Matchers で指定した内容か
 否かを判定します。


(2)is()
・org.hamcrest.CoreMatchers#is()
・引数にクラスを指定します。
・意味は instanceof と同じです。


(3)notNullValue()
・org.hamcrest.CoreMatchers#notNullValue()
・null ではないかをチェックすることを表します。


◆まとめると
assertThat(target, is(notNullValue())) で、
第一引数の target が null ではないかをチェックする内容となっています。


assertThat() を利用すると、第二引数の is() 以下で任意の Matcher を指定することで、複雑な検証も可能ということなのでしょうか?
Interpreter パターンチックですね。

slim3での基本的な開発手順

slim3 には、必要なプログラムを自動生成する機能が備わっています。
ですので、まずプログラムを自動生成し、要件に応じてロジックを個別に追加していくというのが基本的な開発スタイルになります。
今回は、この基本的な開発スタイルについて説明します。


1.プログラムの自動生成方法

プログラムの自動生成は、Ant を使用して行います。
slim3-blank プロジェクトの直下に、build.xml があります。
これを Eclipse 上で開くと、”gen-xxx”という名前のタスクを複数見つけることができます。
これらを実行することで、必要なプログラムを生成することができます。


ちなみに、各タスクと作成できる成果物は以下の通りです。

タスク名 成果物
gen-controller FrontController+JSP
gen-controller-without-view FrontController(JSP なし)
gen-model Model(BigTable へ永続化するオブジェクト)
gen-service Service(ビジネスロジック
gen-gwt-service Google Web Toolkit に対応した Service


以下では、上記のうち特に使用頻度の高いであろう、
gen-controller・gen-model・gen-service の使い方を説明します。
※個別のプログラムについては、後日説明します。


2.gen-controller の使い方

(1)Eclipse で、build.xml を開きます。
(2)gen-controller タスクを右クリックし、
   「Run As」→「Ant Build」を選択します。

(3)ダイアログが表示されるので、
   controller のパスを指定します。
 (a) controller のパスは、
   "/" で始め、"/" で終了するようにします。
 (b) controller のパスは、小文字で指定します。
 (c) サブディレクトリを指定したい場合は、
   "/<ディレクトリ名>/<ディレクトリ名>/
   /" のように指定します。
 (d) 区切り文字に "." を指定すると
   エラーになるので注意して下さい。

(4)次の3つのプログラムが生成されます。

(a) src/<パッケージルート>/controller/<入力したパス>/IndexController.java
(b) test/<パッケージルート>/controller/<入力したパス>/IndexControllerTest.java
(c) war/<入力したパス>/index.jsp


プログラム生成後、http://localhost:8080/<入力したパス>/ を指定すると、追加した JSP を表示することができます。
※hot deploy なので、サーバの再起動は不要です。


3.gen-model の使い方

(1)Eclipse で、build.xml を開きます。
(2)gen-model タスクを右クリックし、
   「Run As」→「Ant Build」を選択します。

(3)ダイアログが表示されるので、
   Model のクラス名を指定します。
 (a) クラス名は、一文字目を大文字にします。
 (b) パッケージを指定したい場合は、
   "a.b.<クラス名>" のように指定します。
 (c) 区切り文字に "/" を指定すると
   エラーになるので注意して下さい。

(4)次の2つのプログラムが生成されます。

(a) src/<パッケージルート>/model/<入力したパッケージ>/<入力したクラス名>.java
(b) test/<パッケージルート>/model/<入力したパッケージ>/<入力したクラス名>Test.java


4.gen-service の使い方

基本的には、gen-model と同様です。
(1)Eclipse で、build.xml を開きます。
(2)gen-service タスクを右クリックし、
   「Run As」→「Ant Build」を選択します。

(3)ダイアログが表示されるので、
   Service のクラス名を指定します。
 (a) クラス名は、一文字目を大文字にします。
 (b) パッケージを指定したい場合は、
   "a.b.<クラス名>" のように指定します。
 (c) 区切り文字に "/" を指定すると
   エラーになるので注意して下さい。

(4)次の2つのプログラムが生成されます。

(a) src/<パッケージルート>/service/<入力したパッケージ>/<入力したクラス名>.java
(b) test/<パッケージルート>/service/<入力したパッケージ>/<入力したクラス名>Test.java


次回

次回は、Model クラスについて詳細に触れる予定です。

slim3のプロジェクト構成

slim3-blank のプロジェクト構成を、以下に記します。
(個々の意味は、逐次記述を追加していきます。)
slim3-blank-EA1-SNAPSHOT-11142009.zip を元にしています。


/
 ├ .apt_generated
 │
 ├ .externalToolBuilders
 │ ├ com.google.appengine.eclipse.core.enhancerbuilder (3).launch
 │ ├ com.google.appengine.eclipse.core.projectValidator (2).launch
 │ └ com.google.gdt.eclipse.core.webAppProjectValidator.launch
 │
 ├ .settings
 │ ├ com.google.appengine.eclipse.core.prefs
 │ ├ com.google.gdt.eclipse.core.prefs
 │ ├ org.eclipse.jdt.apt.core.prefs
 │ ├ org.eclipse.jdt.core.prefs
 │ └ org.eclipse.jdt.ui.prefs
 │
 ├ build
 │ ├ test-classes
 │ └ WEB-INF
 │   └ appengine-generated
 │
 ├ config
 │ └ sdk
 │   └ logging.properties
 │
 ├ lib : ライブラリの配置ディレクトリ
 │ ├ junit-4.7.jar
 │ └ slim3-gen-EA1-SNAPSHOT.jar
 │
 ├ libsrc : ライブラリ(ソース)の配置ディレクトリ
 │ ├ slim3-EA1-SNAPSHOT-sources.jar
 │ └ slim3-gen-EA1-SNAPSHOT-sources.jar
 │
 ├ src : ソースコードの配置ディレクトリ
 │ ├ application_en.properties
 │ ├ application_ja.properties
 │ └ logging.properties
 │
 ├ test : 単体テストコードの配置ディレクトリ
 │
 ├ war
 │ ├ css
 │ │ └ global.css : デフォルトの CSS
 │ │
 │ ├ WEB-INF
 │ │ ├ appengine-generated
 │ │ │ ├ datastore-indexes-auto.xml
 │ │ │ └ local_db.bin
 │ │ │
 │ │ ├ classes
 │ │ │
 │ │ ├ lib
 │ │ │ ├ appengine-api-1.0-sdk-1.2.8.jar
 │ │ │ ├ appengine-api-labs-1.2.8.jar
 │ │ │ └ slim3-EA1-SNAPSHOT.jar
 │ │ │
 │ │ ├ appengine-web.xml
 │ │ └ web.xml
 │ │
 │ ├ header.jsp
 │ ├ menu.jsp
 │ ├ index.jsp
 │ └ footer.jsp
 │
 ├ .classpath
 ├ .factorypath
 ├ .project
 ├ build.properties
 └ build.xml : slim3 の開発に使用するツール

アプリケーションのアップロード手順

作成した GAE/J アプリケーションのアップロードが、殊の外詰まるポイントだったので、手順をまとめることにします。


アプリケーションのアップロードには、次の5つの手順が必要です。

  1. アプリケーションIDの取得
  2. アプリケーションIDの設定
  3. JDKの設定
  4. アプリケーション名の設定
  5. アップロード


ちなみに今回は、App Engine SDK 1.2.8 を使用しています。


1.アプリケーションIDの取得

(1)GAEのトップページにアクセスし、App Engine アカウントを登録します。


(2)「Create an Application」を押下します。


(3)携帯電話のメールアドレスを指定し、
 そこにアプリケーション ID を送信してもらいます。
 iPhone ユーザは、i.softbank.jp を指定しましょう。


(4)携帯電話のメールに、以下の内容のメールが送られてきます。

Google App Engine Code:<アプリケーションID>

 このアプリケーション ID を使用して、アプリケーションをアップロードします。


2.アプリケーションIDの設定

(1)プロジェクトを選択・右クリックし、「Properties」を選択します。


(2)左のツリーから「Google」→「App Engine」を選択し、
 「Application ID」に、先に入手したアプリケーション ID を入力し、
 「OK」を押下します。


3.JDKの設定

ここが一番ハマるポイントです。
この設定を行わないと、以下のエラーが出て、アプリケーションをアップロードできません。
※見やすくするため改行しています。

Unable to update:
java.lang.IllegalStateException:
 cannot find javac executable based on java.home,
 tried "C:\jre6\bin\javac.exe" and "C:\\bin\javac.exe"

(1)Eclipse のメニューの「Window」→「Preferences」を選択します。


(2)左のツリーから「Java」→「Installed JREs」を選択し、
 「Add」を押下します。


(3)「Standard VM」を選択し、「Next >」を押下します。


(4)「JRE home」にJDKディレクトリを指定し、「Finish」を押下します。


(5)追加した JDK にチェックを入れ、「OK」を押下します。


【補足】appcfg.cmdを修正する方法

App Engine SDK の appcfg.cmd の、”@java”の部分を修正すれば解決できるという情報がありましたが、1.2.8 で確認してみたところ、この方法では問題を解決できませんでした。
バージョンがあがって対処方法が変わった?)


4.アプリケーション名の設定

ここもハマるポイントです。
この設定を行わないと、以下のエラーが出て、アプリケーションをアップロードできません。

You do not have permission to modify this app


<プロジェクトルート>/war/WEB-INF/appengine-web.xml を開き、
application に、アプリケーション ID 取得時に登録したアプリケーション名を登録します。
※明示的に設定しないと、アプリケーションアップロード時にアプリケーション ID がセットされてしまい、アップロードに失敗します。


5.アップロード

(1)Eclipse にアップロード用ボタンがあるので、これを押下します。


(2)以下の情報を入力し、「Deploy」を押下します。

Project Eclipse のプロジェクト名
Email gmail のメールアドレス
Password gmail のパスワード


(3)エラーが出なければ、アップロード完了です。


アプリケーションの動作確認

「http://<アプリケーション名>.appspot.com/」をブラウザで指定すると、アプリケーションにアクセスできます。


アプリケーションの管理

GAEのトップページで、
App Engine アカウントの登録リンクをクリックすると、管理画面を表示できるようになります。

slim3の環境構築手順

slim3 とは、Seasar2 などでおなじみのひがやすおさんが開発されている、GAE/J のフレームワークです。
S2 と同様、hot deploy などの機能が用意されており、GAE/J の開発が容易になります。


ただ、公式サイトが英語なので、敬遠される方も多いと聞きます。
ですので今回は、この slim3 の環境構築手順を日本語でまとめてみます。


slim3 の環境構築には、次の4つの手順が必要です。

  1. GAE/J の開発環境の構築
  2. 雛型プロジェクトの取得・展開
  3. Eclipseの設定
  4. 動作確認

1.GAE/J の開発環境の構築

前回の記事をご確認下さい。


2.雛型プロジェクトの取得・展開

slim3 では、開発の雛型プロジェクトであるslim3-blank」というものが提供されています。
環境構築は、この「slim3-blank」をベースに行います。
手順は、以下の通りです。


(1)「slim3-blank」を、こちらからダウンロードします。
 ・ファイル名は、「slim3-blank-EA1-SNAPSHOT-MMddHHmm.zip」
  書式になっています。


(2)ダウンロードしたファイルを、適当なディレクトリに解凍します。


(3)Eclipse で、プロジェクトをインポートします。


Eclipse でのプロジェクトのインポートのしかた

(a)Eclipse を起動し、Eclipse のメニューの「File」→「Import」を選択します。


(b)「General」→「Existing Projects into Workspace」を選択し、
 「Next >」を押下します。


(c)「Select root directory」にファイルを解凍したディレクトリを指定すると、
 「slim3-blank」が見つかるので、これを選択した状態で「Finish」を
 押下します。


(d)「slim3-blank」が、Eclipse のプロジェクトとして認識されます。


3.Eclipseの設定

(1)Eclipse のメニューの「Window」→「Preferences」を選択します。


(2)左のツリーから「Java」→「Code Style」→「Organaize Imports」を
 選択し、「Number of static imports needed for .*」に「1」を指定し、
 「Apply」を押下します。


(3)左のツリーから「Java」→「Editor」→「Content Assist」→「Favorites」を
 選択し、「New Type」で以下の3つを指定し、「Apply」を押下します。
 (a) org.hamcrest.CoreMatchers
 (b) org.junit.Assert
 (c) org.junit.matchers.JUnitMatchers


(4)プロジェクトを選択・右クリックし、「Refactor」→「Rename」を選択し、
 プロジェクト名を好きな名前に変更します。
 この際、ファイルシステムディレクトリ名も指定した名前に
 変更されます。

 ※以下、「hageyahhoo」と設定したものとして説明します。


(5)<プロジェクトルート>/war/WEB-INF/web.xml を開き、
 「slim3.rootPackage」を、使用するパッケージ構成に変更します。
 ※以下、「com.hageyahhoo」と設定したものとして説明します。


(6)プロジェクトを選択・右クリックし、「Properties」を選択します。


(7)左のツリーから「Java Compiler」→「Annotation Processing」→
 「Factory Path」を選択し、「Add JARs」を押下します。


(8)<プロジェクトルート>/lib/slim3-gen-EA1-SNAPSHOT.jar を選択し、
 「OK」を押下します。


(9)<プロジェクトルート>/lib/slim3-gen-EA1-SNAPSHOT.jar
 選択されていることを確認し、「Apply」を押下します。


(10)プロジェクトの再ビルドを要求されますので、
 「Yes」を押下してプロジェクトを再ビルドします。


以上で、Eclipse の設定は完了です。


4.動作確認

作成したプロジェクトを動作確認してみましょう。


(1)プロジェクトを選択・右クリックし、「Run As」→「Web Application」を選択します。


(2)コンソールに「The server is running at http://localhost:
 <ポート番号>/」と表示されます。
 ※右にある赤い四角のボタンを押下すると、サーバ?を停止することが
  できます。


(3)コンソールに表示された URL をブラウザで指定すると、
 以下の画面が表示されます。

GAE/Jの開発環境の構築方法

今何かと話題のクラウド技術。
SalesForce とか Amazon とか色々ありますが、この度 Google App Engine(GAE)Java 版を使ってみることにしました。
詳しいことは公式サイトに書いてありますが、色々と試していこうと思います。
(アクセスするには、Google アカウントが必要です。)


ひとまず今回は、Eclipse での開発環境の構築方法を説明します。


GAE/J の開発環境の構築には、次の3つの手順が必要です。

  1. JDK のインストール
  2. Eclipse のインストール
  3. Google Plugin for Eclipse のインストール

1.JDK のインストール

GAE/J では、JDK 1.5/1.6 をサポートしています。
ですが、本番環境が 1.6 を使用しているので、開発環境も 1.6 にした方がよいです。

※ダウンロードはこちら


2.Eclipse のインストール

GAE/J 開発用のプラグインである「Google Plugin for Eclipse」が対応しているバージョンが 3.3(Europa)または 3.4(Ganymede)なので、このどちらかをインストールします。

※ダウンロードはこちら

以下、3.4 をベースに説明します。


3.Google Plugin for Eclipse のインストール

(1)Eclipse を起動します。
(2)メニューの「Help」→「Software Updates」を選択します。


(3)「Available Software」タブを選択し、「Add Site」を押下します。


(4)「Location」に”http://dl.google.com/eclipse/plugin/3.4”を指定して、「OK」を押下します。


(5)以下を選択し、「Install」を押下します。
 (a)Google Plugin for Eclipse 3.4 (Eclipse で GAE/J の開発・テスト・アップロードが可能に)
 (b)Google App Engine Java SDK (GAE/J の開発環境)
 (c)Google Web Toolkit SDK (オプション。AJAX などを特に使いたい場合のみ指定。)


(6)指定したものがすべてチェックされていることを確認し、「Next >」を押下します。


(7)「I accept the terms of the license agreements」を選択し、「Finish」を押下します。


(8)Eclipse の再起動を求められるので、「Yes」を押下して再起動します。


プロジェクトの作り方

Eclipse のメニューの「File」→「New」→「Web Application Project」を選択すれば、GAE/J のプロジェクトを作成できます。


次回の予定

次回は、GAE/J 専用フレームワークslim3 の環境構築手順を説明します。