【问题标题】:latency with group in pymongo in tests测试中 pymongo 中的组延迟
【发布时间】:2014-01-12 19:18:34
【问题描述】:

美好的一天。

我在python2.7mongo 2.4.8 中使用pymongo==2.1.1 时遇到了以下问题

我曾尝试使用 google 和堆栈溢出找到解决方案,但失败了。

有什么问题?

我有以下功能

from bson.code import Code
def read(groupped_by=None):
    reducer = Code("""
           function(obj, prev){
             prev.count++;
           }
           """)

    client = Connection('localhost', 27017)
    db = client.urlstats_database

    results = db.http_requests.group(key={k:1 for k in groupped_by},
                                     condition={},
                                     initial={"count": 0},
                                     reduce=reducer)
    groupped_by = list(groupped_by) + ['count']
    result = [tuple(res[col] for col in groupped_by) for res in results]
    return sorted(result)

然后我正在尝试为这个函数编写测试

class UrlstatsViewsTestCase(TestCase):
    test_data = {'data%s' % i : 'data%s' % i for i in range(6)}

    def test_one_criterium(self):
        client = Connection('localhost', 27017)
        db = client.urlstats_database
        for column in self.test_data:
            db.http_requests.remove()
            db.http_requests.insert(self.test_data)

            response = read([column])
            self.assertEqual(response, [(self.test_data[column], 1)])

据我所知,由于延迟,此测试有时会失败。如我所见,响应没有清理其中的数据

如果我一直在删除测试通过后添加延迟。

有什么合适的方法来测试这些功能吗?

提前致谢。

【问题讨论】:

  • 你应该检查你的服务器在写问题方面有什么样的行为。如果您必须添加延迟,可能是您的服务器非常慢或过载,并且您的删除时间比平均时间长并触发超时。如果你在本地运行你的服务器尝试在写关注中使用 w:0,你的机器可能可以处理许多请求并且写失败触发错误,使用 w:0 进行测试。

标签: python mongodb unit-testing pymongo


【解决方案1】:

关于您的环境/代码的几个问题:

  • 您使用的是什么版本的 pymongo?
  • 如果您使用任何具有 MongoClient 的较新版本,您使用 Connection 而不是 MongoClient 是否有任何具体原因?

我问第二个问题的原因是因为 Connection 为您正在执行的操作提供了一种即发即弃的功能,而 MongoClient 默认在安全模式下工作,并且也是自 mongodb 2.2+ 以来的首选使用方法。

您看到的行为对于 Connection 使用而不是 MongoClient 是非常确定的。在使用 Connection 时,您的删除被发送到服务器,并且从客户端发送它的那一刻,您的程序执行将移至下一步,即添加新条目。根据延迟/删除操作完成时间,这些将是冲突的,正如您在测试用例中已经注意到的那样。

你能改用 MongoClient 看看这是否对你的测试代码有帮助吗?

其他参考:pymongo: MongoClient or Connection

【讨论】:

  • 另外你应该检查你的服务器在写问题方面有什么样的行为。如果您必须添加延迟,可能是您的服务器非常慢或过载,并且您的删除时间比平均时间长并触发超时。
【解决方案2】:

谢谢大家。

我使用的pymongo 版本中没有MongoClient 类。所以我不得不找出到底有什么不同。

一旦我升级到 2.2+,我将测试 MongoClient 是否一切正常。但是对于连接类,可以使用写入关注来控制这种延迟。

我的旧版本应该使用相应的参数创建连接。

这两个我都试过journal=True, safe=True(日记写关注不能在非安全模式下使用)

j or journal:阻塞直到写入操作被提交到日志。如果服务器在没有日志的情况下运行,则忽略。暗示 safe=True。

我认为这会使性能变差,但对于自动测试,这应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 2021-04-21
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2018-09-19
    • 2022-01-12
    • 2019-09-16
    相关资源
    最近更新 更多