Светильники в тестировании Django с South / Selenium

Я пытаюсь запустить тесты Selenium для проекта Django (1.5.4), в котором используется South. Я думаю, что Юг конфликтует с моими тестами, когда я пытаюсь ввести исходные данные с помощью приборов, но я не уверен почему; Я ценю любую помощь.

В соответствии с документацией Django, приборы должны загружаться после первого syncdb, а затем применяются все миграции.

Вопрос 1) Учитывает ли это миграцию на юг?? Нужно ли запускать их отдельно?

Ошибка, которую я получаю, когда запускаю свои тесты, создает впечатление, что мои южные миграции все еще присутствуют в тестовой базе данных после первого теста... но я думал, что каждый тест имеет свою собственную базу данных (и миграции / фиксаторы)? Первый тест проходит / не проходит, но каждый последующий тест вызывает эту ошибку IntegrityError:

IntegrityError: Problem installing fixture '<PROJECT_PATH>/fixtures/toy_course.json': Could not load contenttypes.ContentType(pk=8): (1062, "Duplicate entry 'south-migrationhistory' for key 'app_label'")

Эта документация на юг и вопрос SO, похоже, указывают на то, что мне нужно переопределить какой-то метод форвардов, чтобы заставить работать приборы, но я не совсем уверен, как применить это к ситуации тестирования вместо производства (или если это решение мне нужно).

Вопрос 2) Должен ли я переопределять форварды в моей тестовой настройке? Где бы я это сделал?

Мой соответствующий тестовый код:

from django.conf import settings

from selenium import webdriver

from functional_tests.test import SeleniumTestCase

class Resources(SeleniumTestCase):
    fixtures = ['toy_course.json']

    def setUp(self):      
        self.browser = webdriver.Chrome(settings.SELENIUM_WEBDRIVER)
        self.browser.implicitly_wait(3)

    def tearDown(self):
        self.browser.quit()

    def test_main_page_renders_correctly(self):
        """
        User sees a properly formatted main page
        """
        self.open('/RDB/')

        h3_headers = self.browser.find_elements_by_tag_name('h3')
        self.assertIn(
                'Complete List of Resources',
                [header.text for header in h3_headers])

        self.assertTrue(self.check_exists_by_id('main_table'))
        self.assertTrue(self.check_exists_by_id('searchDiv'))

        self.assertTrue(self.check_exists_by_class_name('tablesorter'))

Спасибо!


ОБНОВИТЬ

Итак, согласно предложению Алекса ниже и этому южному документу, я добавил эту строку в мои settings.py:

SOUTH_TESTS_MIGRATE = False

Но теперь я получаю 8 из 8 ошибок (до того, как в первом тесте я получил 1 проход / неудачу, а затем 7 ошибок). Полная ошибка для одного теста ниже:

======================================================================
ERROR: test_table_sorts_on_click (functional_tests.tests.main_resources.Resources)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/test/testcases.py", line 259, in __call__
self._pre_setup()
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/test/testcases.py", line 479, in _pre_setup
self._fixture_setup()
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/test/testcases.py", line 518, in _fixture_setup
**{'verbosity': 0, 'database': db_name, 'skip_validation': True})
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/core/management/__init__.py", line 161, in call_command
return klass.execute(*args, **defaults)
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/core/management/base.py", line 255, in execute
output = self.handle(*args, **options)
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 193, in handle
obj.save(using=using)
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/core/serializers/base.py", line 165, in save
models.Model.save_base(self.object, using=using, raw=True)
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/db/models/base.py", line 626, in save_base
rows = manager.using(using).filter(pk=pk_val)._update(values)
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/db/models/query.py", line 605, in _update
return query.get_compiler(self.db).execute_sql(None)
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1014, in execute_sql
cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
cursor.execute(sql, params)
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 122, in execute
six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2])
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 120, in execute
return self.cursor.execute(query, args)
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/MySQLdb/cursors.py", line 201, in execute
self.errorhandler(self, exc, value)
  File "/<PATH TO VIRTUAL ENV>/virtual_environments/relate/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
IntegrityError: Problem installing fixture '/<PATH TO PROJECT>/RDB/fixtures/toy_course.json': Could not load contenttypes.ContentType(pk=8): (1062, "Duplicate entry 'south-migrationhistory' for key 'app_label'")

Команда, которую я выполнил:

$ python manage.py test functional_tests

Я не совсем уверен, сделал ли я проблему лучше, хуже или тем же, но мне кажется, что я в большей степени соответствую документации...

Спасибо!


ОБНОВЛЕНИЕ № 2 - с решением

Итак, пара других страниц, которые помогли мне понять это (в дополнение к указателю Алекса на Южный документ). Во-первых, у этого человека была похожая проблема, и он решил ее с помощью выражения SOUTH_TESTS_MIGRATE = False. Таким образом, половина моего решения было включить это.

Вторая половина моего решения состояла в том, чтобы исправить мой документ крепежа. Я бросил все в свой прибор с помощью:

$ python manage.py datadump > RDB/fixtures/toy-course.json

Это, по-видимому, плохой способ сделать это с южными приборами - потому что он также сбрасывает таблицы южных миграций в осветительные приборы. В посте выше показано, как блоггер использует специальные приложения (о которых также говорится в этом посте), и это было ключом к тому, чтобы мои приборы работали. Документы Django по осветительным приборам показывают необязательные параметры для выгрузки только приложения, но я не знал, что игнорирование их приведет к конфликту Юга. Таким образом, вторая половина моего решения состояла в том, чтобы создать мое приспособление, чтобы быть специфичным для приложения:

$ python manage.py datadump RDB > RDB/fixtures/toy-course.json

И мои тесты теперь работают нормально (медленно, но, вероятно, другая проблема)!

1 ответ

Решение

Ваша тестовая база данных создается с использованием южных миграций по умолчанию. Задавать SOUTH_TESTS_MIGRATE = False в вашем settings.py, цитата из документов:

Если это значение False, интеграция South Runner заставит тестовую базу данных создавать с помощью syncdb, а не с помощью миграций (по умолчанию).

Другие вопросы по тегам