0

我一直在使用测试驱动开发在应用引擎上开发一个 python 应用程序。我编写的测试之一向本地服务器发出了 2 个 HTTP 请求(模拟应用程序的正常行为)。第一个请求生成一个数据库实体并返回我在服务器上分配给它的一些 ID,第二个请求将它获得的 ID 与其他数据一起发送以更新第一条记录。我的问题是,尝试在第二个请求上使用 --high_replication (模拟高复制数据存储)运行服务器,服务器无法在数据存储中找到 ID。(没有 --high_replication 它正在工作)。我找到了一种解决方法,在每个请求之间添加睡眠,但我确信有更好的方法。

任何信息或帮助将非常感谢。

为了提供更多信息,这是测试的一部分:

response = self.sendPing()
response = self.updatePing(response['response'])
self.assertEquals(response['response'], 'OK')

我为此找到的解决方法是:

response = self.sendPing()
time.sleep(1)
response = self.updatePing(response['response'])
self.assertEquals(response['response'], 'OK')

在请求之间睡 1 秒时,我得到了很好的结果

科德科德

4

2 回答 2

0

您提供的代码并没有告诉我太多关于您如何查询数据的信息。

从纯理论的角度来看,您有几个选择:

  1. 使用创建的实体的键并在响应中返回该键,然后使用该键获取记录。最终一致性不适用于按键获取。
  2. 使用命名键。请参阅此问题中的答案
  3. 使用祖先查询。它们总是一致的。
于 2012-12-26T05:35:35.753 回答
0

当您使用 --high_replication 时,数据存储会模拟最终的一致性行为。

正如 Sologoub 所提到的,您可以进行适当的完全一致的数据存储调用以获得正确的读取。

另一种选择是强制 dev_appserver 数据存储以完全一致的方式运行。您可能希望使用它来简化某些测试,但请记住,它不是模拟现实世界的一致性行为。

请参阅文档:https ://developers.google.com/appengine/docs/python/tools/localunittesting#Writing_HRD_Datastore_Tests

您想将 PseudoRandomHRConsistencyPolicy 设置为 100

于 2012-12-27T00:43:12.723 回答