我正在尝试测试一个应从数据存储中获取某种特定对象的函数。

在测试中,我似乎必须插休眠眠以使查询找到所有已保存的项目。

下面的代码是可复制的示例。第一个日志跟踪来自注释掉 sleep 行时的记录,第二个跟踪跟踪来自未注释 sleep 时的记录。注意长度:0和长度:3

我假设这是最终的一致性问题,如果我坚持几个对象并立即查询它们,那么在生产中就会出现。但是在生产中,这些物品早就被保留了下来。由于这种情况仅在我的测试中出现,因此我是否打算采取某种措施来迫使数据存储区等待直到其完全保存项目后才能继续?

我尝试将测试保存内容包装在事务中,但出现“事务中仅允许祖先查询”错误。

type Thing struct {
  Str1 string
  Str2 string
}

func (thing Thing) Save(c appengine.Context) error {
  k := datastore.NewKey(c, "Thing", thing.Str1 + "_" + thing.Str2, 0, nil)
  if _, err := datastore.Put(c, k, &thing); err != nil {
    return err
  }
  return nil
}

func GetThings(c appengine.Context) ([]Thing, error) {
  var things []Thing
  q := datastore.NewQuery("Thing").
      Filter("Str1=", "thing")
  _, err := q.GetAll(c, &things)
  if err != nil {
    return nil, err
  }
  return things, nil
}



func TestGetThings(t *testing.T) {
  c, _ := aetest.NewContext(nil)
  defer c.Close()
  thing1 := Thing{"thing", "1"}
  thing2 := Thing{"thing", "2"}
  thing3 := Thing{"thing", "3"}
  thing1.Save(c)
  thing2.Save(c)
  thing3.Save(c)

//  time.Sleep(2000 * time.Millisecond)

  things, err := GetThings(c)
  if err != nil {
    t.Fatal(err)
  }
  t.Log("length:" + strconv.Itoa(len(things)))
}

记录 sleep 注释掉的时间

C:\Users\XXXX> goapp测试-test.v

2014/09/23 21:24:05 appengine:无法在devappserver2下运行;使用一些默认配置

===运行TestGetThings

INFO 2014-09-23 21:24:07,328 devappserver2.py:725]跳过SDK更新检查。

警告2014-09-23 21:24:07,328 devappserver2.py:741]无法使用--port = 0正确设置DEFAULT_VERSION_HOSTNAME

WARNING 2014-09-23 21:24:07,351 api_server.py:383]无法初始化图像API;您可能会缺少Python“PIL”模块。

INFO 2014-09-23 21:24:07,365 api_server.py:171]在以下位置启动API服务器:http://localhost:50153
INFO 2014-09-23 21:24:07,371 dispatcher.py:183]启动模块“默认”运行在:http://localhost:50154
INFO 2014-09-23 21:24:07,377 admin_server.py:117]在以下位置启动管理服务器:http://localhost:50155
INFO 2014-09-23 21:24:08,378 api_server.py:583]应用所有待处理的事务并保存数据存储

INFO 2014-09-23 21:24:08,388 api_server.py:586]保存搜索索引
---通过:TestGetThings(4.60秒)

something_test.go:87:长度:0

经过

好的东西4.729秒

在 sleep 未注释掉时记录日志

C:\Users\XXXX> goapp测试-test.v

2014/09/23 21:24:28 appengine:无法在devappserver2下运行;使用一些默认配置

===运行TestGetThings

INFO 2014-09-23 21:24:31,124 devappserver2.py:725]跳过SDK更新检查。

警告2014-09-23 21:24:31,124 devappserver2.py:741]无法使用--port = 0正确设置DEFAULT_VERSION_HOSTNAME

WARNING 2014-09-23 21:24:31,148 api_server.py:383]无法初始化图像API;您可能会缺少Python“PIL”模块。

INFO 2014-09-23 21:24:31,164 api_server.py:171]在以下位置启动API服务器:http://localhost:50191
INFO 2014-09-23 21:24:31,171 dispatcher.py:183]启动模块“默认”运行在:http://localhost:50192
INFO 2014-09-23 21:24:31,176 admin_server.py:117]在以下位置启动管理服务器:http://localhost:50193
INFO 2014-09-23 21:24:34,176 api_server.py:583]应用所有待处理的事务并保存数据存储

INFO 2014-09-23 21:24:34,176 api_server.py:586]保存搜索索引
---通过:TestGetThings(6.83秒)

something_test.go:87:长度:3

经过

好的东西6.987s

最佳答案

为了回答我自己的问题,解决方案是在创建aetest.NewContext时使用Options参数。

c, _ := aetest.NewContext(&aetest.Options{"", true})

Options结构中的第二项是一个名为StronglyConsistentDatastore的 bool 值。

关于google-app-engine - Appengine aetest的行为不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26004506/

10-15 00:35