장고 unittests에서 사용하고자하는 읽기 전용 Wordnet PostgreSQL 데이터베이스가 있습니다. 특히, 나는 워드 넷 (wordnet)이라 불리는이 워드 넷 데이터베이스를 감싸는 앱을 가지고있다. 아쉽게도 기본 Django unittest 프레임 워크는 모든 응용 프로그램에 빈 메모리 내 SQLite 데이터베이스를 사용합니다.Django unittests에서 영구 데이터베이스 사용
unittest 내에서 wordnet 앱에만 PostgreSQL 데이터베이스를 사용하고 다른 앱에는 어떻게 사용합니까?
저는 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은 다음과 같습니다 여전히 내 유닛 테스트를 실행할 때 (예를 들어 manage.py test myapp.Tests.test_wordnet
), 그러나
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)
검사를 실패하면 모든 단어의 수가 0이되어 "실제"데이터베이스를 사용하고 있지 않음을 나타냅니다. 내가 도대체 뭘 잘못하고있는 겁니까?
내 질문을 다시 읽어 보시기 바랍니다 확인 먼저 프로덕션 데이터베이스를 덤프에 대해 어떻게
. 그것은 정의와 품사 태그가 들어있는 추가 모델뿐만 아니라 86k 단어가 포함 된 읽기 전용 데이터베이스입니다. 압축 된 SQL 파일로 덤프되었지만 크기는 수백 메가입니다. 큰 조명기를 로딩하려 한 적이 있습니까? 나는 가지고있다. 꽤 아니야. Django는 많은 양의 데이터를 처리하도록 설계되지 않았습니다. – Cerin
해당 데이터의 일부만 덤프 할 수 있습니다. 테스트는 "원격"리소스와 독립적이어야합니다. 라이브 테스트를 원한다면 실제 환경에서 "테스트"를 실행하는 단일보기를 만들면 어떻습니까? –
그래, 그게 가장 실용적인 옵션 같아. 테스트 데이터베이스를 유지할 수있는 방법이 있지만 상당히 복잡합니다. 나는 모든 것을 접근하기를 희망했지만, 나는 부분 집합으로 충분할 수 있다고 생각한다. 필자의 조명기 생성을 단순화하기 위해 맞춤형 관리 명령을 작성했습니다. – Cerin