最近我一直在玩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."
我正在尝试做什么有意义,或者是否有更简单的方法来实现更好的测试时间。
答案 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
可能会稍微快一些,但是,在本地数据存储区中,我怀疑这不会产生可衡量的差异。