2012-06-13 2 views
4

장고 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이되어 "실제"데이터베이스를 사용하고 있지 않음을 나타냅니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

2

테스트를 위해 실제 데이터베이스를 사용하지 않아야합니다. 시험 설비에 넣기 다음 here

및 모양 : this

+0

내 질문을 다시 읽어 보시기 바랍니다 확인 먼저 프로덕션 데이터베이스를 덤프에 대해 어떻게

. 그것은 정의와 품사 태그가 들어있는 추가 모델뿐만 아니라 86k 단어가 포함 된 읽기 전용 데이터베이스입니다. 압축 된 SQL 파일로 덤프되었지만 크기는 수백 메가입니다. 큰 조명기를 로딩하려 한 적이 있습니까? 나는 가지고있다. 꽤 아니야. Django는 많은 양의 데이터를 처리하도록 설계되지 않았습니다. – Cerin

+0

해당 데이터의 일부만 덤프 할 수 있습니다. 테스트는 "원격"리소스와 독립적이어야합니다. 라이브 테스트를 원한다면 실제 환경에서 "테스트"를 실행하는 단일보기를 만들면 어떻습니까? –

+0

그래, 그게 가장 실용적인 옵션 같아. 테스트 데이터베이스를 유지할 수있는 방법이 있지만 상당히 복잡합니다. 나는 모든 것을 접근하기를 희망했지만, 나는 부분 집합으로 충분할 수 있다고 생각한다. 필자의 조명기 생성을 단순화하기 위해 맞춤형 관리 명령을 작성했습니다. – Cerin

관련 문제