2014-01-17 3 views
2

Я пытаюсь загрузить 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).

ответ

0

Вы можете быть в состоянии решить эту проблему путем загрузки данной арматуры вручную себя внутри setUpClass методы - есть команда Джанго администратора (loaddata), который может сделать это для вас, которые могут быть called from the code. Как вы правильно указали в своем примере, это должно быть unittest2.TestCase.

+0

Больше информации об использовании? Я попытался установить '--database = test_foo' и получил' connection test_foo не существует' (база данных с этим именем существует). Те же результаты при использовании 'loaddata' в командной строке, а не в коде. –

+0

Я думаю, проблема в том, что, поскольку вы не используете django TestCase, база данных не создается явно при выполнении тестов. Я думаю, вы можете обойти это для своего случая, вызвав команду 'syncdb' (с аргументом' --noinput') в вашем 'setUpClass' перед запуском' loaddata'. Это не техника, которую я пробовал перед собой, но похоже, что она должна работать. Надеюсь это поможет. – robjohncox

+0

На самом деле, я использовал Django TestCase (не изменил код), и я попробовал загрузить как в верхней части модуля, так и внутри TestCase. Попробуем syncdb - результаты, без радости ... Хм, теперь мне интересно, ищет ли он имя db в settings.py. Больше тестов ... –