[追記] 1.8.6 からSDKに単体テストのためのパッケージが追加されました。
詳しくは http://najeira.blogspot.jp/2013/10/google-app-engine-186-go.html を読んでください。
----
Google App Engine Go で単体テストするためのパッケージを作りました。
詳しくは 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 お待ちしております。
0 件のコメント:
コメントを投稿