Python Django测试用例,是否可以在类/模块级别加载fixture?
我正在尝试将json装置加载到Python 2.6/Django 1.4单元测试中。我可以使用Django的TestCase在测试级别完成,但加载需要8-10秒(200万json,不会变得更小)。因此,运行十几个测试非常慢,我只想加载测试数据库一次。在Python2.6中,添加了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
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版了。