2009年7月19日日曜日

#appengine のテスト用初期データを作成する

AppEngine用のプロジェクトをSDK上で起動してIntegration-Testしたり、Eclipse上のSDKで起動して手で動作確認したりするときのDatastoreの初期データをどーするか?といった話です。

単体テスト環境で使うDatastoreの初期化をちょっと弄ってやるだけで良かったよぅです。個人的にはずっとうまくいかずに悩んで、プロダクトコードに"ローカル環境で起動したときだけ初期データを作成する"を含めてしまうという馬鹿な事をやっていたけど、やっと初期データの作成方法がわかったのでメモ。

必要な情報

まずは、ApplicationID。これはappengine-web.xmlで記述しているapplication要素の値でおk。もうひとつは、VersionIDなんだけど、自分がずっとはまっていたのはコレ。この値もappengine-web.xmlversion要素の値を使用すりゃいいと思ったけど、ここがちょっと違う。たぶんappengine-web.xmlversion要素の値+".1"なのかな。正確な値は、SDK上でWebアプリとして起動したタイミングで以下を実行した値を使用する。

  • ApiProxy.getCurrentEnvironment().getAppId()
  • ApiProxy.getCurrentEnvironment().getVersionId()

例えば自分の環境だとappengine-web.xmlではそれぞれ"shin1ogawa", "wicket-snapshot"という値を使っているけど、実際に必要な値はそれぞれ"shin1ogawa", "wicket-snapshot.1"とかだった。

テストデータ出力モジュール

正しいバージョン番号さえわかれば後は簡単。

テストデータ作成時に上記のsetUp()を実行し、テストデータ作成はfactory.getPersistenceManager()を使うなり低レベルAPIを使うなりして普通にDatastoreに書き込みを行い、最後にtearDown()を実行する。上記の場合はtarget/testData/WEB-INF/appengine-generatedフォルダ配下にlocal_db.binというファイルができるので、それをSDKで実行する際のフォルダ(Google Plugin for Eclipseを使っているなら、デフォルトは${project}/war/WEB-INF/appengine-generated)にコピーしてからSDKを起動すればおk!

自分の場合はこれも通常のTestCaseとして毎回作成する事にしている(上記メソッドを@BeforeClass, @AfterClass にして、setUp()内ではtarget/testDataフォルダを最初に削除したり。)。

コメントを投稿