APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

GAE/GoのテストでDatastoreの状態を確認できるようにする

始めに

先進サービス開発事業部の山岡です。

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)
}