创建测试数据库 Django

Cod*_*mon 0 python django unit-testing

我在 settings.py 中定义了一个 mysql 数据库

DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'<name>',
            'USER':'<user>',
            'PASSWORD':'<password>'
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在我需要为我的单元测试创​​建一个测试数据库。哪里需要提到测试数据库的设置,或者我根本不必提到它们?

当我这样做时进行测试:

python manage.py test my_app
Run Code Online (Sandbox Code Playgroud)

它说:

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'...
Run Code Online (Sandbox Code Playgroud)

测试给出的错误是错误的。因为我的数据库中有那个对象,所以我从 ORM 中检查过。为什么会出现这个错误?我的数据库没有正确链接?

Dan*_*man 5

测试文档确实解释了这一点。您无需为测试创建数据库,Django 会在测试运行时自动创建。但是数据库每次都是从头开始创建的,因此您的测试本身需要使用任何所需的数据填充数据库:通过夹具,或者直接在测试或 setUp 方法中创建实体。

单元测试的全部意义在于它们是完全独立的,并且不依赖于任何外部状态:使用现有数据库会违反这一点。

  • 您不会从生产数据库中导入它们。您创建要“手动”测试的状态。 (2认同)