Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.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测试用例,是否可以在类/模块级别加载fixture?_Python_Django_Unit Testing_Module_Django Fixtures - Fatal编程技术网

Python Django测试用例,是否可以在类/模块级别加载fixture?

Python Django测试用例,是否可以在类/模块级别加载fixture?,python,django,unit-testing,module,django-fixtures,Python,Django,Unit Testing,Module,Django Fixtures,我正在尝试将json装置加载到Python 2.6/Django 1.4单元测试中。我可以使用Django的TestCase在测试级别完成,但加载需要8-10秒(200万json,不会变得更小)。因此,运行十几个测试非常慢,我只想加载测试数据库一次。在Python2.6中,添加了unittest2,这似乎是可能的,但我还没有让它工作 # Works, but takes eight seconds per test. class BaseStuff(django.test.testcases.T

我正在尝试将json装置加载到Python 2.6/Django 1.4单元测试中。我可以使用Django的TestCase在测试级别完成,但加载需要8-10秒(200万json,不会变得更小)。因此,运行十几个测试非常慢,我只想加载测试数据库一次。在Python2.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的测试用例将读取fixture,unittest2的测试用例将在类/模块级别执行操作。是否有任何方法可以组合此操作,并在类/模块级别读取fixture?我尝试了多重继承,但无法让它加载数据

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

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

似乎创建了一个数据库。但Django似乎为每个测试创建了另一个数据库(该数据库为空)。不确定如何告诉测试用例使用第一个db(我尝试了Django和unittest2测试用例)。

您可以通过在
setUpClass
方法中手动加载夹具数据来解决这个问题-有一个Django admin命令()可以为您执行此操作,它可以是。正如您在示例中正确指出的,这需要是一个
unittest2.TestCase

,正如Django doc所建议的,您可以在fixture的名称中使用DB的名称,以在DB中加载数据:

因此,结合你的建议和我的建议:

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

DATABASES = {'default': ..., 'legacy_db': ...}
然后您可以像这样将fixture加载到db:

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

参考资料:

有关用法的更多信息?我尝试设置
--database=test\u foo
,但得到的
连接test\u foo不存在(具有该名称的数据库确实存在)。在命令行上使用
loaddata
与在代码中使用时的结果相同。我认为问题在于,因为您没有使用django测试用例,所以在运行测试时没有显式创建数据库。我认为您可以通过在运行
loaddata
之前在
setUpClass
方法中调用
syncdb
命令(带参数
--noinput
)来解决这个问题。这不是我以前尝试过的一种技术,但它听起来应该是可行的。希望这能有所帮助。实际上,我使用的是Django测试用例(没有更改代码),我尝试在模块顶部和测试用例内部加载。将尝试syncdb-结果,没有乐趣。。。嗯,现在我想知道它是否在settings.py中查找db名称。更多的测试…很抱歉听到这对你不起作用:(一旦有人能给你提供有用的东西,就会删除答案。祝你好运。不是说你的答案错了,只是这更多的是一个提示。:)不知道你是否使用过此方法,可能有更多信息。我实际上正在取得进展——在设置了一个假名称,而没有设置db名称之后,它会在命令行上运行。只是还没有在代码中。你有没有找到这样做的方法?@n00b没有,而且已经有一段时间没有使用Django了。事实上,这是1.4版的问题,我认为Django现在已经升级到2.2版了。