go / appengine:更快的数据存储测试

时间:2015-11-25 23:37:06

标签: unit-testing google-app-engine go

最近我一直在玩golang和google的应用引擎。

在实施存储库时,我经历了非常慢的单元测试执行。

我所做的是在每个测试中调用ctx,_ := aetest.NewContext(nil)以获得干净的数据库。这会在每个测试中启动一个新服务器,从而导致测试速度慢。

最近,我一直试图通过在TestMain中启动它来解决这个问题。

var ctx aetest.Context

func TestMain(m *testing.M) {
    ctx,_ = aetest.NewContext(nil)
    code := m.Run()
    ctx.Close()
    os.Exit(code)
}

func TestMyRepository(t *testing.T){
    cleanDatastore()
    repo := &MyRepository{ctx}
    repo.DoSomething()
}

在函数cleanDatastore中,我一直在执行一个bash脚本,它基本上运行一个SQLite命令来清理保存在/ tmp中的本地数据库。

#!/usr/bin/env bash

PATH=$1
cd $PATH

echo "Cleaning datastore..."

/usr/bin/sqlite3 datastore "delete from \"dev~testapp!!EntitiesByProperty\";"
/usr/bin/sqlite3 datastore "delete from \"dev~testapp!!Entities\";"

echo "Datastore is clean."

我正在尝试做什么有意义,或者是否有更简单的方法来实现更好的测试时间。

1 个答案:

答案 0 :(得分:1)

无用的,仅限密钥的查询(获取所有实体的密钥,无论其类型)都应该有所帮助:

   q := datastore.NewQuery("").KeysOnly()

然后,循环遍历所有这些键并删除它们中的每一个,例如:

   for t := q.Run(ctx); ; {
        key, err := t.Next(nil)
        if err == datastore.Done {
            break
        }
        if err != nil {
            serveError(c, w, err)
            return
        }
        datastore.Delete(ctx, key)
    }

将密钥放入数组并使用DeleteMulti可能会稍微快一些,但是,在本地数据存储区中,我怀疑这不会产生可衡量的差异。