У меня есть большая база данных 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 для подсчета всех слов, указывая, что он все еще не использует «настоящую» базу данных. Что я делаю не так?
Пожалуйста, перечитайте мой вопрос. Это база данных только для чтения с 86 тыс. Слов в ней, а также дополнительные модели, содержащие определения и теги части речи. Сбрасываемый как сжатый файл SQL, его размер составляет несколько сотен МБ. Вы когда-нибудь пробовали загружать крепкую арматуру? У меня есть. Это некрасиво. Django не предназначен для обработки таких больших объемов данных. – Cerin
Вы можете сбросить только часть этих данных. Тестирование должно быть независимым от любых «отдаленных» ресурсов. Если вы хотите провести живое тестирование, почему бы не сделать единое представление, которое запускает «тесты» в живой среде? –
Да, это похоже на самый практичный вариант. Есть способы сохранить тестовую базу данных, но они довольно сложны. Я надеялся получить доступ ко всему, но, я думаю, мне может быть достаточно подмножества. В результате я создал пользовательскую команду управления, чтобы упростить создание моего устройства. – Cerin