【问题标题】:Using a persistent database in Django unittests在 Django 单元测试中使用持久数据库
【发布时间】:2012-06-16 14:56:45
【问题描述】:

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

如何在单元测试中仅将我的 PostgreSQL 数据库用于 wordnet 应用程序,而不用于其他应用程序?

我熟悉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)

但是,当我运行我的单元测试(例如manage.py test myapp.Tests.test_wordnet)时,检查仍然失败,所有单词的计数返回 0,表明它仍然没有使用“真实”数据库。我做错了什么?

【问题讨论】:

    标签: python database django django-models wordnet


    【解决方案1】:

    你不应该使用真实的数据库进行测试。

    先转储你的生产数据库怎么样:看here

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

    【讨论】:

    • 请重新阅读我的问题。它是一个只读数据库,其中包含 86k 单词,以及包含定义和词性标签的附加模型。转储为压缩的 SQL 文件,大小为数百 MB。你有没有试过加载这么大的夹具?我有。这不漂亮。 Django 不是为处理如此大量的数据而设计的。
    • 您只能转储部分数据。测试应该独立于任何“远程”资源。如果您想要实时测试,为什么不在实时环境中运行“测试”的单一视图?
    • 是的,这似乎是最实用的选择。有一些方法可以持久化测试数据库,但它们非常复杂。我希望访问所有内容,但我想我可以满足一个子集。我最终创建了一个自定义管理命令来简化我的夹具的生成。
    猜你喜欢
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 2016-05-04
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多