2012-07-26 88 views
3

我有一个应用程序(谷歌应用程序引擎+高复制数据存储),直到现在还没有使用最终的一致性(高复制),我所有的测试都完美运行。如何在最终一致性的情况下进行测试?

现在,对于高度复制中的本地测试,只要我移动到最终一致性,他们就开始失败。我如何防止这种情况?或者我如何测试该部分? 我需要它为x实体事务。

我使用类似于https://developers.google.com/appengine/docs/python/tools/localunittesting#Writing_HRD_Datastore_Tests

编辑东西:

我需要正确测试代码。我遇到的问题是测试部分。任何人如何测试最终的一致性?

编辑1: 我在上面的链接示例中暂时解决了使用概率= 100%的问题。但想法是受欢迎的。

回答

0

修复故障。

由于您没有代码,而且含义很模糊,所以很难回答您的问题。但本质上,无论您的应用程序代码还是您的测试都没有考虑到最终的一致性(即,查询可能不会返回数据库中刚刚更新的值)。当您打开数据存储中的最终一致性时,您获得的查询结果将会不同。

您可能需要更新代码以处理事务的最终一致性情况,或更新测试以期望最终的一致性结果。

编辑

这个问题仍然过于笼统。这取决于你是否在做功能或系统测试。你在寻找特定的结果吗?或者只是一个HTTP状态= 200?

一般来说,像所有测试一样,您需要确定什么构成成功以及构成失败案例。在特定情况下,旧数据是否可以接受?在这种情况下,测试应该以旧值或新值成功。

我建议开始考虑是否要运行确定性或非确定性测试。对于确定性测试,您基本上希望以概率= 0和概率= 100运行相同的测试,并确保为两者获得正确的值。

我还没有想出如何以完全有用的方式编写非确定性测试,而不是作为压力测试。您可以验证是否满足某些必需的值,并且其他最终一致的值是否在有效范围内。这是很多工作,因为很可能你有一系列值可能取决于另一个值的范围,并且由于你的最终输出可能包含两者,所以你必须验证组合是否正确 - 本质上你已经结束了如果您确实想要验证一切正确,请重新生成一些应用程序逻辑。

+0

@iamgopal问如何编写测试来处理这个问题,你说他/他应该修复它们。这不是一个答案! – Joe 2012-07-26 15:37:04

+0

@Joe从我对他的问题的理解中,他问“我打开了最终的一致性,我的测试失败了,我该如何让它们停止失败?”,换句话说,“我如何编写应用程序在最终的一致性”。如果没有他的应用程序正在做什么的例子,无法真正回答。 – dragonx 2012-07-26 16:02:45

+0

@dragonx我可能不清楚,所以我已经更新了这个问题。我想修复测试而不是代码。而你的解决方案,“更新你的测试,以期望最终的一致性”< - 我想知道如何做到这一点? – iamgopal 2012-07-26 16:20:05

0

您面临的情况是High Replication Data Store的缺点之一(或称之为功能)。通常这些情况通过使用memcache的透明缓存来解决。如果您之前有过使用db主/从架构的经验,则可以采用类似的方式处理从站滞后。

相关问题