创建Django测试数据库
我在settings.py里定义了一个mysql数据库。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'<name>',
'USER':'<user>',
'PASSWORD':'<password>'
}
}
现在我需要为我的单元测试创建一个测试数据库。我需要在哪里提到测试数据库的设置,还是根本不需要提到?
在测试的时候,我执行:
python manage.py test my_app
结果提示:
Creating test database for alias 'default'...
Skipping creation of NoticeTypes as notification app not found
E
======================================================================
ERROR: test_update_quiz (toolbox.tests.TestQuizCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/opt/2.0/site/toolbox/tests.py", line 20, in test_update_quiz
akit = AssignmentKit.objects.get(pk = akit_id)
File "/usr/local/lib/python2.7/site-packages/django/db/models/manager.py", line 131, in get
return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 366, in get
% self.model._meta.object_name)
DoesNotExist: AssignmentKit matching query does not exist.
----------------------------------------------------------------------
Ran 1 test in 0.003s
FAILED (errors=1)
Destroying test database for alias 'default'...
测试给出的错误信息是错的。因为我在数据库里确实有那个对象,我是通过ORM检查过的。这个错误为什么会出现?我的数据库是不是没有正确连接?
1 个回答
5
测试的文档里有解释这一点。你不需要为测试自己创建一个数据库,Django会在运行测试时自动创建一个。不过,每次测试运行时,数据库都是从头开始创建的,所以你的测试需要自己往数据库里填充需要的数据:可以通过预设数据(fixtures)来填,或者直接在测试里或者在设置方法(setUp)里创建这些数据。
单元测试的主要目的就是它们是完全独立的,不依赖任何外部状态:如果使用一个已经存在的数据库,那就违背了这个原则。