【问题标题】:how to test in case of eventual consistency?在最终一致性的情况下如何测试?
【发布时间】:2012-07-26 14:00:37
【问题描述】:

我有一个应用程序(谷歌应用程序引擎 + 高复制数据存储)直到现在还没有使用最终一致性(高复制),我的所有测试都运行良好。

现在,对于高复制的本地测试,一旦我转向最终一致性,它们就会开始失败。我该如何防止呢?或者我如何测试那部分? 我需要它来进行 x 实体交易。

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

编辑:

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

编辑 1: 我在上面链接的示例中使用probability=100% 暂时解决了这个问题。但欢迎提出想法。

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    修复失败。

    由于您没有代码并且非常模糊,因此很难回答您的问题。但本质上,您的应用程序代码或您的测试都没有考虑最终的一致性(即,查询可能不会返回刚刚在数据库中更新的值)。当您在数据存储中开启最终一致性时,您得到的查询结果会有所不同。

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

    编辑

    这个问题还是太笼统了。这取决于你是在做功能测试还是系统测试。您是否正在寻找特定的结果?还是只是一个 HTTP 状态=200?

    通常,与所有测试一样,您需要确定什么是成功,什么是失败案例。在给定的情况下,旧数据出现是否可以接受?在这种情况下,测试应该使用旧值或新值成功。

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

    除了作为压力测试之外,我还没有弄清楚如何以一种完全有用的方式编写非确定性测试。您可以验证是否满足某些要求的值,以及其他最终一致的值是否在有效范围内。这是很多工作,因为很可能您的值范围可能取决于另一个值范围,并且由于您的最终输出可能包含两者,因此您必须验证组合是否正确 - 基本上您结束了如果您真的想验证一切是否正确,请复制您的一些应用程序逻辑。

    【讨论】:

    • @iamgopal 询问如何编写测试来处理这个问题,你是说他/她应该修复它们。这不是答案!
    • @Joe 根据我对他的问题的理解,他在问“我打开了最终一致性,但我的测试失败了,我该如何让它们停止失败?”,或者换句话说,“如何我编写的应用程序可以最终保持一致”。如果没有他的应用在做什么的例子,我无法真正回答这个问题。
    • @dragonx 一开始我可能不清楚,所以我更新了这个问题。我想修复 TEST 而不是代码。而你的解决方案,“更新你的测试以期望最终的一致性”
    【解决方案2】:

    您面临的情况是 High Replication Data Store 的缺点之一(或称其为功能)。通常这些情况是通过使用 memcache 的透明缓存来解决的。如果您之前有使用数据库主/从架构的经验,那么从属滞后会以类似的方式解决。

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 2015-04-23
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2021-01-14
      • 2011-06-13
      相关资源
      最近更新 更多