メニュー

2013年2月12日

Go言語でGoogle App Engineの単体テストをするパッケージ

[追記] 1.8.6 からSDKに単体テストのためのパッケージが追加されました。

詳しくは http://najeira.blogspot.jp/2013/10/google-app-engine-186-go.html を読んでください。

----

Google App Engine Go で単体テストするためのパッケージを作りました。

こんな感じでテストを書けます。

package yourapp

import (
 "appengine/datastore"
 "net/http"
 "testing"
 "github.com/najeira/testbed"
)

const (
 PYTHON    = `/usr/local/bin/python27`
 TESTBED   = `/usr/local/google_appengine/goroot/src/pkg/github.com/najeira/testbed/testbed.py`
 APPENGINE = `/usr/local/google_appengine`
)

func TestAllocateIDs(t *testing.T) {
 bed := testbed.NewTestbed(PYTHON, TESTBED, APPENGINE)
 bed.Start()
 defer bed.Close()
 
 // create a dummy context
 r, _ := http.NewRequest("GET", "http://example.com/", nil)
 c := bed.NewContext(r)
 
 // write your test codes here
 low, high, err := datastore.AllocateIDs(c, "Test", nil, 10)
 if err != nil {
  t.Errorf("got error: %v", err)
 }
 if high - low != 10 {
  t.Errorf("wrong values: %d, %d", low, high)
 }
}


もともとAppEngine GoのSDKでは、Python版の開発サーバを動かしGo言語側とAPI経由で通信して動くようになっています。これは、Datastore等のAppEngineのスタブがPythonで実装されており、Go版がないためです。

このため、Go言語単体では、AppEngineのAPIを使った単体テストを行うことができませんでした。

このGo言語の testbed パッケージでは、Pythonのプロセスを起動してスタブを準備させ、Go言語側からプロセス間通信で呼び出してAPIを使えるようにしました。

Pythonを起動しないといけないので、環境に応じた引数を受け取らないと動きません。ここがダサいので、何かいい方法があれば pull request お待ちしております。