2010年10月15日金曜日

#slim3 のテスト環境で投入したデータを削除せずファイルに保存する #appengine

AppEngine/Javaで、開発サーバで実行するときのテストデータの初期状態を作っておきたい時、私はよくAppEngine SDKのLocalServiceTestHelperを使ってテスト環境を作成してデータ投入し、そこで作成したファイル(local_db.bin)をwar/WEB-INF/appengine-generatedフォルダにコピーしていました。これと同じことをSlim3のAppEngineTesterを使ってできないかなー?と思って試してみました。

Slim3のAppEngineTester#tearDown()はテスト中に投入されたデータは全部消してしまう(それが便利なわけですが)仕様です。これはtearDown()をオーバーライドして削除処理をしないようにすれば回避できます。
それだけだと良いんですが、環境終了時にApiProxyLocalImpl#stop()を呼んでいません。これが無いとデータがlocal_db.binに永続化されないので、ファイルが作成できません。そこで次のようなAppEngineTesterのサブクラスを作って使うことにしました。テスト中に投入したデータのクリア処理を外し、各LocalServiceクラスを停止するためのApiProxyLocalImpl#stop()を実行するようにしただけです。

以下のように使うことになります。

  1. テストデータ投入前に、上記のAppEngineTesterのサブクラスをインスタンス化し、setUp()を実行する
  2. 開発サーバで実行するときのアプリケーションIDを返すApiProxy.EnvironmentのインスタンスをApiProxy#setEnvironmentForCurrentThread()で設定する
  3. テストデータを投入する
  4. 上記のAppEngineTesterのサブクラスのオブジェクトのtearDown()を実行する
  5. build/test-classes/WEB-INF/appengine-generated/local_db.binwar/WEB-INF/appengine-generated/local_db.binにコピーする

データファイルに保存されるエンティティにはアプリケーションIDも合わせて永続化されるので、データ投入時と開発サーバ実行時で同じになる必要がある点に注意が必要です。

コメントを投稿