创建Django测试数据库

0 投票
1 回答
2511 浏览
提问于 2025-04-18 08:15

我在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)里创建这些数据。

单元测试的主要目的就是它们是完全独立的,不依赖任何外部状态:如果使用一个已经存在的数据库,那就违背了这个原则。

撰写回答