AppEngine用のプロジェクトをSDK上で起動してIntegration-Testしたり、Eclipse上のSDKで起動して手で動作確認したりするときのDatastoreの初期データをどーするか?といった話です。
単体テスト環境で使うDatastoreの初期化をちょっと弄ってやるだけで良かったよぅです。個人的にはずっとうまくいかずに悩んで、プロダクトコードに"ローカル環境で起動したときだけ初期データを作成する"を含めてしまうという馬鹿な事をやっていたけど、やっと初期データの作成方法がわかったのでメモ。
必要な情報
まずは、ApplicationID。これはappengine-web.xml
で記述しているapplication
要素の値でおk。もうひとつは、VersionIDなんだけど、自分がずっとはまっていたのはコレ。この値もappengine-web.xml
のversion
要素の値を使用すりゃいいと思ったけど、ここがちょっと違う。たぶんappengine-web.xml
のversion
要素の値+".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フォルダを最初に削除したり。)。
0 件のコメント:
コメントを投稿