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

时间:2014-01-17 18:36:05

标签: python django unit-testing module django-fixtures

我正在尝试将json fixture加载到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()也不起作用。设置函数肯定被调用,但似乎没有夹具感知。

因此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)。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

在您的 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