Я пытаюсь загрузить json fixture в модульный тест Python 2.6/Django 1.4. Я могу сделать это на тестовом уровне, используя TestCase от Django, но для загрузки требуется 8-10 секунд (2M от json, а не намного меньше). Таким образом, запуск десятка тестов очень медленный, и я хотел бы загрузить тестовую базу данных только один раз. Похоже, может быть возможно в Python 2.6, с добавлением unittest2
, но я не получил его на работу.Django Testcase, можно загрузить крепление на уровне класса/модуля?
# Works, but takes eight seconds per test.
class BaseStuff(django.test.testcases.TestCase):
fixtures = ['test_data']
def setUp(self):
# stuff
def test_one(self):
# stuff
# Doesn't work - but runs *really* fast.
class BaseStuff(unittest2.TestCase):
@classmethod
def setUpClass(cls): # Added in unittest2
fixtures = ['test_data']
print "in setupClass()" # Does print, so function is called.
Попытка setupModule() не работает, либо. Функция настройки определенно вызывается, но, похоже, не знает об этом.
Итак, TestCase от Django будет считывать приборы, а TestCase от Unittest2 будет работать на уровне класса/модуля. Есть ли способ объединить эту операцию и прочитать приборы на уровне класса/модуля? Я попробовал множественное наследование и не смог загрузить его.
Update: на основе предложения @ robjohncox, этот код, на уровне модуля:
from django.core import management
management.call_command('loaddata', 'test_data.json', verbosity=1, noinput=True)
, похоже, для создания базы данных. Но затем Django, похоже, создает другую базу данных для каждого теста (который пуст). Не уверен, как сказать TestCase использовать первый db (я пробовал как Django, так и unittest2 TestCase).
Больше информации об использовании? Я попытался установить '--database = test_foo' и получил' connection test_foo не существует' (база данных с этим именем существует). Те же результаты при использовании 'loaddata' в командной строке, а не в коде. –
Я думаю, проблема в том, что, поскольку вы не используете django TestCase, база данных не создается явно при выполнении тестов. Я думаю, вы можете обойти это для своего случая, вызвав команду 'syncdb' (с аргументом' --noinput') в вашем 'setUpClass' перед запуском' loaddata'. Это не техника, которую я пробовал перед собой, но похоже, что она должна работать. Надеюсь это поможет. – robjohncox
На самом деле, я использовал Django TestCase (не изменил код), и я попробовал загрузить как в верхней части модуля, так и внутри TestCase. Попробуем syncdb - результаты, без радости ... Хм, теперь мне интересно, ищет ли он имя db в settings.py. Больше тестов ... –