始めに
先進サービス開発事業部の山岡です。
GAE/Goでは goapp test
を使うことでローカル環境に仮のGAEを再現しDatastoreのアクセスや非同期処理の挙動を確認することができますが、テスト終了後にその環境は自動で破棄されてしまいDatastoreがどのような状態であったか確認することができません。
少し細工するとこれを見ることができ手元のデバッグが楽になるので紹介したいと思います。
開発環境を破棄されないようにする
※testeratorを使用していることが前提です。
単純に破棄されないようにするのであれば下記のように最後の testerator.SpinDown()
をコメントアウトしてあげるだけでOKです。こうしておけばテスト開始時に出力される INFO 2019-01-31 08:35:32,267 admin_server.py:150] Starting admin server at: http://localhost:39505
のようなメッセージの通りにアクセスが可能です。
func TestMain(m *testing.M) { if _, _, err := testerator.SpinUp(); err != nil { log.Fatal(err.Error()) } exitCode := m.Run() //testerator.SpinDown() // os.Exit() では defer が働かないので手動で SpinDown() する os.Exit(exitCode) }
このままだとずっと環境が残ってしまいますので、用が終わったらプロセスをkillしましょう。
$ ps aux | grep dev_appserver.py xxx 22449 0.2 0.4 824448 76244 pts/1 Sl 17:35 0:00 /usr/bin/python2.7 /opt/google-cloud-sdk/platform/google_appengine/dev_appserver.py --port=0 --api_port=0 --admin_port=0 --automatic_restart=false --skip_sdk_update_check=true --clear_datastore=true --clear_search_indexes=true --datastore_path /tmp/appengine-aetest374698611/datastore --datastore_consistency_policy=consistent /tmp/appengine-aetest374698611 $ $ $ ps axu | grep _go_app xxx 22501 0.0 0.0 7780 4344 pts/1 Sl 17:35 0:00 /tmp/tmp6qauztappengine-go-bin/_go_app $ $ $ kill -9 22449 22501
テストNGの場合のみ環境を残す
下記のようにif文で分岐すれば結果がNGの場合のみ残すことができます。後始末については先と同様です。
func TestMain(m *testing.M) { if _, _, err := testerator.SpinUp(); err != nil { log.Fatal(err.Error()) } exitCode := m.Run() if exitCode == 0 { testerator.SpinDown() } os.Exit(exitCode) }