латентност с група в pymongo в тестове

Добър ден.

Сблъсках се със следния проблем при използване на pymongo==2.1.1 в python2.7 с mongo 2.4.8

Опитах се да намеря решение с помощта на Google и Stack Overflow, но не успях.

какъв е проблемът

Имам следната функция

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

този тест понякога се проваля, доколкото разбирам, поради забавяне. Както виждам отговорът не е изчистил данните в него

Ако добавя забавяне след премахване на теста, преминава през цялото време.

Има ли някакъв подходящ начин за тестване на такава функционалност?

Благодаря предварително.


person oleg    schedule 08.01.2014    source източник
comment
Трябва да проверите какво поведение има вашият сървър по отношение на загрижеността за писане. Ако трябва да добавите забавяне, може сървърът ви да е много бавен или претоварен и премахването ви отнема повече време от средното и задейства изчакване. Ако използвате вашия сървър локално, опитвайки се да използва w:0 при запис, вашата машина вероятно може да обработва много заявки и не успява да напише, задействайки грешка, използвайте w:0 за тестови цели.   -  person Maximiliano Rios    schedule 10.01.2014


Отговори (2)


Няколко въпроса относно вашата среда/код:

  • Каква версия на pymongo използвате?
  • Ако използвате някоя от по-новите версии, които имат MongoClient, има ли някаква конкретна причина да използвате Connection вместо MongoClient?

Причината, поради която задавам втория въпрос, е, че Connection предоставя вид функционалност за запалване и забравяне за операциите, които извършвате, докато MongoClient работи по подразбиране в безопасен режим и също е предпочитан подход за използване от mongodb 2.2+.

Поведението, което виждате, е много убедително за използване на Connection вместо MongoClient. Докато използвате Connection, вашето премахване се изпраща до сървъра и в момента, в който бъде изпратено от страна на клиента, изпълнението на вашата програма преминава към следващата стъпка, която е добавяне на нови записи. Въз основа на латентност/време за завършване на операцията за премахване, те ще бъдат в конфликт, както вече сте забелязали във вашия тестов случай.

Можете ли да промените да използвате MongoClient и да видите дали това ще ви помогне с вашия тестов код?

Допълнителна справка: pymongo: MongoClient или връзка

person aks    schedule 09.01.2014
comment
Също така трябва да проверите какво поведение има вашият сървър по отношение на загрижеността за писане. Ако трябва да добавите забавяне, може сървърът ви да е много бавен или претоварен и премахването ви отнема повече време от средното и задейства изчакване. - person Maximiliano Rios; 10.01.2014

Благодаря на всички.

Няма MongoClient клас във версията на pymongo, която използвам. Така че бях принуден да разбера какво точно се различава.

Веднага след като надстроя до 2.2+, ще тествам дали всичко е наред с MongoClient. Но що се отнася до класа на връзката, човек може да използва загриженост за запис, за да контролира тази латентност.

I по-стара версия Трябва да се създаде връзка със съответните аргументи.

Опитах тези twojournal=True, safe=True (загрижеността за запис в дневника не може да се използва в небезопасен режим)

j или дневник: Блокирайте, докато операциите за запис не бъдат ангажирани в дневника. Игнорира се, ако сървърът работи без журналиране. Подразбира безопасно=вярно.

Мисля, че това влошава производителността, но за автоматичните тестове това трябва да е добре.

person oleg    schedule 12.01.2014