2014-01-08 26 views
0

美好的一天。在pymongo中測試組的潛伏期

我所面臨的python2.7使用pymongo==2.1.1以下問題與mongo 2.4.8

我曾嘗試使用谷歌和堆棧溢出來找到解決,但失敗了。

這是什麼問題?

我有以下功能

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)]) 

這個測試,因爲我理解,因爲延遲有時會失敗。正如我可以看到響應沒有清除其中的數據

如果我添加延遲後刪除測試通過所有的時間。

是否有任何正確的方法來測試此功能?

在此先感謝。

+0

你應該檢查你的服務器在寫作方面有什麼樣的行爲。如果您必須添加延遲,可能是您的服務器速度很慢或超負荷,並且您的移除需要比平均時間更長的時間並觸發超時。如果您在本地運行服務器時嘗試在寫入問題中使用w:0,那麼您的機器可能可能處理多個請求,並且無法寫入觸發錯誤,請將w:0用於測試目的。 –

回答

0

謝謝所有。

pymongo版本中沒有MongoClient我使用。所以我被迫弄清楚究竟有什麼不同。

只要我升級到2.2+,我會測試是否一切正常MongoClient。但對於連接類,可以使用寫入關注來控制此延遲。

我的舊版本一個應該創建連接與相應的參數。

我已經試過這兩個journal=True, safe=True(寫日記的關注不能在非安全模式下使用)

J或雜誌:阻止,直到寫操作已經將提交給雜誌。如果服務器沒有日誌記錄運行,則忽略。意味着安全=真。

我認爲這會使性能變差,但對於自動測試,這應該沒問題。

1

關於環境/代碼的幾個問題:

  • 您正在使用什麼版本pymongo的?
  • 如果您正在使用任何具有MongoClient的新版本,是否有任何具體原因使用Connection而不是MongoClient?

我之所以問的第二個問題是因爲連接提供發射後不管那種對你正在做的業務功能,同時MongoClient工作在默認情況下在安全模式下,也較好,因爲MongoDB的使用方法2.2+ 。

您看到的behviour對於連接使用而非MongoClient非常確定。在使用Connection時,remove會被髮送到服務器,當它從客戶端發送出去的時候,程序執行會轉到下一步,即添加新條目。根據延遲/刪除操作完成時間,這些將會發生衝突,因爲您已經注意到您的測試用例。

你可以改變使用MongoClient,看看是否可以幫助你與你的測試代碼?

其他參考:pymongo: MongoClient or Connection

+0

另外,你應該檢查你的服務器在編寫問題方面有什麼樣的行爲。如果您必須添加延遲,可能是您的服務器速度很慢或超負荷,並且您的移除需要比平均時間更長的時間並觸發超時。 –