Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django单元测试中使用持久数据库_Python_Database_Django_Django Models_Wordnet - Fatal编程技术网

Python 在Django单元测试中使用持久数据库

Python 在Django单元测试中使用持久数据库,python,database,django,django-models,wordnet,Python,Database,Django,Django Models,Wordnet,我有一个大的只读Wordnet PostgreSQL数据库,我想从Django unittests使用它。具体来说,我有一个名为“wordnet”的应用程序,它包装了这个wordnet数据库。不幸的是,默认的Django unittest框架对所有应用程序使用一个空的内存SQLite数据库 如何在unittests中仅将PostgreSQL数据库用于wordnet应用程序,而不用于其他应用程序 我很熟悉,我认为这可能是一个解决方案。因此,我在我的routers.py中创建了以下内容: NEEDS

我有一个大的只读Wordnet PostgreSQL数据库,我想从Django unittests使用它。具体来说,我有一个名为“wordnet”的应用程序,它包装了这个wordnet数据库。不幸的是,默认的Django unittest框架对所有应用程序使用一个空的内存SQLite数据库

如何在unittests中仅将PostgreSQL数据库用于wordnet应用程序,而不用于其他应用程序

我很熟悉,我认为这可能是一个解决方案。因此,我在我的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\u wordnet
)时,检查仍然失败,所有单词的计数返回0,表明它仍然没有使用“real”数据库。我做错了什么?

您不应该使用真实数据库进行测试

首先转储生产数据库怎么样:看


然后将其加载到测试夹具中:检查

请重新阅读我的问题。这是一个只读数据库,其中包含86k个单词,以及包含定义和词性标记的其他模型。作为压缩SQL文件转储,它的大小为数百MB。你有没有试过装那么大的夹具?我有。这不漂亮。Django不适合处理如此大的数据量。您只能转储其中的一部分数据。测试应该独立于任何“远程”资源。如果您想要实时测试,为什么不在实时环境中运行“测试”的单一视图呢?是的,这似乎是最实用的选择。有一些方法可以持久化测试数据库,但它们相当复杂。我希望访问所有内容,但我想我只需要一个子集就足够了。我最终创建了一个自定义管理命令来简化夹具的生成。