Светильники в тестировании 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'")
Эта Южная документация и поэтому вопрос , кажется, указывает на то, что мне нужно переопределить некоторый типвперед метод, чтобы чтобы заставить светильники работать, но я не совсем уверен, как применить это к ситуации тестирования вместо производства (или если это то решение, которое мне нужно).
Вопрос 2) должен ли я переопределить forwards в моей тестовой установке? Где бы я это сделал?
Мой соответствующий тестовый код:
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
Это, по-видимому, плохой способ сделать светильники его с Югом-потому что он также сбрасывает таблицы миграции Юга в приспособление. В посте выше показано, что блоггер использует специальные приспособления для приложений (которые мы также говорили об этом в этом посте SO), и это было ключом к тому, чтобы заставить мои светильники работать. документы Django на fixtures действительно показывают необязательные параметры для сброса только приложения,но я не знал, что игнорирование их вызовет конфликт на юге. Поэтому вторая половина моего решения заключалась в том, чтобы создать свое приспособление для конкретного приложения:
$ python manage.py datadump RDB > RDB/fixtures/toy-course.json
И мои тесты теперь работают нормально (медленно, но, вероятно, другая проблема)!
1 ответ:
По умолчанию тестовая база данных создается с использованием миграции на юг. Установите
SOUTH_TESTS_MIGRATE = False
в вашемsettings.py
, цитата из docs:Если это ложь, интеграция тестового бегуна Юга сделает тест база данных создается с помощью syncdb, а не с помощью миграции (the по умолчанию).