Тестирование Django - множественные запросы при внешнем изменении данных.Проблема с кешем? - PullRequest
1 голос
/ 11 августа 2011

У меня есть устаревшее приложение, которое (в настоящее время) использует Django для эффективного отображения данных.Пример одного из моих рабочих тестов выглядит следующим образом.

def test_add_property_value(self):
    """Test set / get a value"""
    # This will do some external process which occcurs to the db.
    pm = Pm(mysql_db='test_bugs')
    tree =  pm.add_release_tree()
    prop_type, pmvalue = ("string", "Funny Business")
    pmproperty = "%s_%s_basic" % (tree[0].name, prop_type)
    pm.add_property_definition(pmproperty, prop_type=prop_type)
    pm.add_propval(pmproperty, value=pmvalue, project=tree[0].name)

    # Now use Django to pull the value back out..
    project = Project.objects.get(name=tree[0].name)
    property = project.get_property(pmproperty) # Custom query using sql.raw
    self.assertEqual(pmvalue, property.value)

Как видите, это базовое A / B-тестирование.Теперь я нашел ограничения и не могу обойтись в том, что несколько внешних запросов add - check - loop терпят неудачу .Изменение вышеуказанного кода завершается неудачно, потому что кажется запрос не может даже выполнить .

def test_add_property_value(self):
    """Test set / get a value"""

    # This will do some external process which occcurs to the db.
    pm = Pm(mysql_db='test_bugs', p4_port = settings.ICMSERVER_TEST_PORT)
    tree = pm.add_release_tree()
    prop_type, pmvalue = ("string", "Funny Business")
    pmproperty = "%s_%s_basic" % (tree[1].name, prop_type)
    pm.add_property_definition(pmproperty, prop_type=prop_type)
    pm.add_propval(pmproperty, value=pmvalue, project=tree[1].name)

    # Now use Django to pull the value back out..
    project = Project.objects.get(name=tree[1].name)
    property = project.get_property(pmproperty)
    self.assertEqual(pmvalue, property.value)

    # ONLY CHANGE WAS TO ADD THIS..

    # This will do some external process which occcurs to the db.
    pmproperty = "%s_%s_basic_two" % (tree[1].name, prop_type)
    pm.add_property_definition(pmproperty, prop_type=prop_type)
    pm.add_propval(pmproperty, value=pmvalue, project=tree[1].name)

    # Now use Django to pull the value back out..
    project = Project.objects.get(name=tree[1].name)
    property = project.get_property(pmproperty)
    self.assertEqual(pmvalue, property.value)

Я читал о CACHE_BACKEND это не помогло.Любые другие идеи?После дальнейшего исследования это, похоже, вообще не связано с моим внешним БД.Аааа ... Это похоже на понедельник!

  1. Это проблема с кешем? Кстати, установка CACHE_BACKEND = 'dummy: ///' или 'locmem: ///' ничего не сделала.* Как мне лучше диагностировать эту проблему ??

Спасибо

Обновление

Здесь был окончательный ответ - 2 небольших твика ..Основано на Данииле и Северио .Очень ценили указатели !!

class PropertyTests(TransactionTestCase):  #CHANGE1
    def test_add_property_value(self):
        """Test set / get a value"""

        import logging
        l = logging.getLogger('django.db.backends')
        l.setLevel(logging.DEBUG)
        l.addHandler(logging.StreamHandler())

        # This will do some external process which occcurs to the db.
        pm = Pm(mysql_db='test_bugs', p4_port = settings.ICMSERVER_TEST_PORT)
        tree = pm.add_release_tree()
        prop_type, pmvalue = ("string", "Funny Business")
        pmproperty = "%s_%s_basic" % (tree[1].name, prop_type)
        pm.add_property_definition(pmproperty, prop_type=prop_type)
        pm.add_propval(pmproperty, value=pmvalue, project=tree[1].name)

        # Now use Django to pull the value back out..
        project = Project.objects.get(name=tree[1].name)
        property = project.get_property(pmproperty)
        self.assertEqual(pmvalue, property.value)

        # This will do some external process which occcurs to the db.
        pmproperty = "%s_%s_basic_two" % (tree[1].name, prop_type)
        pm.add_property_definition(pmproperty, prop_type=prop_type)
        pm.add_propval(pmproperty, value=pmvalue, project=tree[1].name)

        # Now use Django to pull the value back out..
        Project.objects.update() #CHANGE2
        project = Project.objects.get(name=tree[1].name)
        property = project.get_property(pmproperty)
        self.assertEqual(pmvalue, property.value)

1 Ответ

1 голос
/ 11 августа 2011

Это, вероятно, не проблема транзакции. Менеджер (Project.objects) должен быть проинформирован об изменении данных, поскольку он рассчитан на короткое время.

Вы запрашиваете дважды один и тот же запрос Project.objects.get(name=tree[1].name), и менеджер не выполнит его снова, поскольку считает, что у него уже есть правильные данные.

Непосредственно перед вторым запросом выполните

Project.objects.update()

для аннулирования кэша менеджера. Результаты после признания недействительными должны быть обновлены.

...