繁体   English   中英

Django Testcase,可以在类/模块级别加载夹具吗?

[英]Django Testcase, possible to load fixture at the class/module level?

我正在尝试将 json 夹具加载到 Python 2.6/Django 1.4 单元测试中。 我可以在测试级别使用 Django 的 TestCase 完成它,但是加载需要 8-10 秒(2M 的 json,不会变得更小)。 因此,运行十几个测试真的很慢,我只想加载一次测试数据库。 它看起来像它可能在Python 2.6是可能的,通过添加unittest2 ,但我还没有得到它工作。

# Works, but takes eight seconds per test.
class BaseStuff(django.test.testcases.TestCase):
    fixtures = ['test_data']

    def setUp(self):
        # stuff
    def test_one(self):
        # stuff

# Doesn't work - but runs *really* fast.
class BaseStuff(unittest2.TestCase):
    @classmethod
    def setUpClass(cls):  # Added in unittest2
        fixtures = ['test_data']
        print "in setupClass()"  # Does print, so function is called.

尝试setupModule()也不起作用。 肯定会调用 setup 函数,但似乎不知道夹具。

所以Django 的TestCase 会读取fixture,而unittest2 的TestCase 会在类/模块级别做事。 有没有办法结合这个操作,并在类/模块级别读取设备? 我尝试了多重继承,但无法加载数据。

更新:基于@robjohncox 的建议,此代码在模块级别:

from django.core import management
management.call_command('loaddata', 'test_data.json', verbosity=1, noinput=True)

似乎确实创建了一个数据库。 但是随后 Django 似乎为每个测试创建了另一个数据库(这是空的)。 不知道如何告诉 TestCase 使用第一个 db(我尝试了 Django 和 unittest2 TestCase)。

您可以通过在setUpClass方法中自己手动加载夹具数据来解决这个问题 - 有一个 django 管理命令 ( loaddata ) 可以为您执行此操作,可以从代码中调用它 正如您在示例中正确指出的那样,这需要是unittest2.TestCase

正如Django doc所建议的,您可以在夹具名称中使用数据库的名称,将数据加载到数据库中:

所以结合你的建议和我的:

在您的 settings.py 中,您有以下数据库:

DATABASES = {'default': ..., 'legacy_db': ...}

然后你可以像这样将夹具加载到数据库中:

from django.core import management
management.call_command('loaddata', 'test_data.legacy_db.json', verbosity=1, noinput=True)

参考: https : //docs.djangoproject.com/en/dev/ref/django-admin/#database-specific-fixtures

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM