2012-06-13 4 views
4

У меня есть большая база данных PostgreSQL для чтения в Word, которую я хотел бы использовать с Django unittests. В частности, у меня есть приложение, называемое «wordnet», которое обертывает эту базу данных Wordnet. К сожалению, по умолчанию Django unittest framework использует пустую базу данных SQLite в памяти для всех приложений.Использование постоянной базы данных в Django unittests

Как использовать мою базу данных PostgreSQL только для приложения wordnet и других приложений в рамках unittests?

Я знаком с Django database routers, и я думаю, что они могут быть решением. Таким образом, я создал следующий в моем routers.py:

NEEDS_REAL_DB_APPS = (
    'wordnet', 
    'auth', 
    'contenttypes', 
) 
REAL_DB = 'default' 

class UseRealDBRouter(object): 

    def db_for_read(self, model, **hints): 
     if model._meta.app_label in NEEDS_REAL_DB_APPS: 
      return REAL_DB 
     return None 

    def db_for_write(self, model, **hints): 
     if model._meta.app_label in NEEDS_REAL_DB_APPS: 
      return REAL_DB 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     if obj1._meta.app_label in NEEDS_REAL_DB_APPS and obj2._meta.app_label in NEEDS_REAL_DB_APPS: 
      return True 
     return None 

    def allow_syncdb(self, db, model): 
     if db == REAL_DB: 
      return model._meta.app_label in NEEDS_REAL_DB_APPS 
     elif model._meta.app_label in NEEDS_REAL_DB_APPS: 
      return False 
     return None 

И мой tests.py выглядит следующим образом:

from django.test import TestCase 
from wordnet import models as wn_models 

class Tests(TestCase): 

    def test_wordnet(self): 
     q = wn_models.Word.objects.all() 
     self.assertEqual(q.count(), 86547) 

Однако, когда я бегу мой UnitTest (например manage.py test myapp.Tests.test_wordnet), чек до сих пор fail, возвращая 0 для подсчета всех слов, указывая, что он все еще не использует «настоящую» базу данных. Что я делаю не так?

ответ

2

Вы не должны использовать настоящую базу данных для тестирования.

Как насчет первого демпинг базы данных производства: смотрите here

, а затем загрузить его в тестовых: проверить this

+0

Пожалуйста, перечитайте мой вопрос. Это база данных только для чтения с 86 тыс. Слов в ней, а также дополнительные модели, содержащие определения и теги части речи. Сбрасываемый как сжатый файл SQL, его размер составляет несколько сотен МБ. Вы когда-нибудь пробовали загружать крепкую арматуру? У меня есть. Это некрасиво. Django не предназначен для обработки таких больших объемов данных. – Cerin

+0

Вы можете сбросить только часть этих данных. Тестирование должно быть независимым от любых «отдаленных» ресурсов. Если вы хотите провести живое тестирование, почему бы не сделать единое представление, которое запускает «тесты» в живой среде? –

+0

Да, это похоже на самый практичный вариант. Есть способы сохранить тестовую базу данных, но они довольно сложны. Я надеялся получить доступ ко всему, но, я думаю, мне может быть достаточно подмножества. В результате я создал пользовательскую команду управления, чтобы упростить создание моего устройства. – Cerin

Смежные вопросы