jjzjj

google-app-engine - appengine aetest 的不一致行为

coder 2023-06-29 原文

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

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

下面的代码是一个可重现的例子。第一个日志跟踪来自 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 thing -test.v

2014/09/23 21:24:05 应用引擎:未在 devappserver2 下运行;使用一些默认配置

=== 运行 TestGetThings

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

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

警告 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 秒)

thing_test.go:87: 长度:0

通过

好的东西 4.729s

sleep 未注释掉时的日志

C:\Users\XXXX>goapp test thing -test.v

2014/09/23 21:24:28 应用引擎:未在 devappserver2 下运行;使用一些默认配置

=== 运行 TestGetThings

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

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

警告 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 秒)

thing_test.go:87: 长度:3

通过

好的东西 6.987s

最佳答案

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

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

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

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

有关google-app-engine - appengine aetest 的不一致行为的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  4. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  5. ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错 - 2

    我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension

  6. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  7. ruby-on-rails - Ruby 中意外的大小写行为 - 2

    我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。

  8. ruby - 使对象的行为类似于 ruby​​ 中并行分配的数组 - 2

    假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje

  9. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  10. ruby - Google-api-ruby-client 翻译 API 示例 - 2

    很高兴看到google代码:google-api-ruby-client项目,因为这对我来说意味着Ruby人员可以使用GoogleAPI-s来完善代码。虽然我现在很困惑,因为给出的唯一示例使用Buzz,并且根据我的实验,Google翻译(v2)api的行为必须与google-api-ruby-client中的Buzz完全不同。.我对“Explorer”演示示例很感兴趣——但据我所知,它并不是一个探索器。它所做的只是调用一个Buzz服务,然后浏览它已经知道的关于Buzz服务的事情。对我来说,Explorer应该让您“发现”所公开的服务和方法/功能,而不一定已经知道它们。我很想听听使用这个

随机推荐