【问题标题】:Create a separate clean database for tests in django在 django 中为测试创建一个单独的干净数据库
【发布时间】:2019-02-07 21:31:23
【问题描述】:

您好,我想为测试创建一个单独的空数据库。我阅读了 django 文档 (https://docs.djangoproject.com/en/2.1/topics/testing/overview/) 那:

默认测试数据库名称是通过在 DATABASES 中每个 NAME 的值前面添加 test_ 来创建的。使用 SQLite 时,测试将默认使用内存数据库(即,数据库将在内存中创建,完全绕过文件系统!)。 DATABASES 中的 TEST 字典提供了许多设置来配置您的测试数据库。例如,如果您想使用不同的数据库名称,请在 TEST 字典中为 DATABASES 中的任何给定数据库指定 NAME。

所以我尝试了:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'test_db': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'test_db.sqlite3'),
    }
}

但测试在运行时仍然使用默认数据库

./manage.py test

如何为测试目的创建和指定一个新的空数据库?

【问题讨论】:

  • 不,正如规范所说,数据库不是default,而是test_default,所以它已经创建了一个测试数据库,但没有指定。

标签: django


【解决方案1】:

我认为您误读了文档。 Django 自动使用一个独立的数据库。

假设您的配置文件如下所示:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

那么Django将使用'default'数据库,如果数据库名称是'FOO',它将创建一个名称为test_FOO的数据库.这样测试和运行 Django 项目应该——当然不“修补”这种行为——不会干扰(至少不会干扰数据库)。

如果您想指定一个不同的 NAME(或其他属性),您可以在数据库中添加一个'TEST' key [Django-doc],例如:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'TEST': {
            'NAME': os.path.join(BASE_DIR, 'other_db.sqlite3'),
        }
    }
}

【讨论】:

  • 非常感谢!但是当我运行我的 selenium 测试时,我可以看到数据库中填充了来自默认数据库的数据。当我在测试中创建对象(例如新用户)并尝试登录新帐户时,操作失败。您可能知道为什么会这样吗?
  • @madasionka:不,这很奇怪。也许值得分享所有(相关)设置。通常使用sqlite3,如文档中所述,文件系统中没有存储文件:数据库存储在内存中。所以所有查询都不应该对文件系统进行任何更改。
  • 我仔细查看了我的设置,没有发现任何可疑之处。奇怪的是,似乎测试确实以某种方式使用了不同的数据库(因为如果我创建一个用户,它不会在默认数据库中创建),但是我的应用程序的 chromium 窗口正在使用默认数据库。
猜你喜欢
  • 2023-03-15
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
相关资源
最近更新 更多