在 Django 中测试不同的数据库?

DATABASES = {
#    'default': {
#        'ENGINE': 'postgresql_psycopg2',
#        ...
#    }


# for unit tests
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydatabase'
}
}

我有两个数据库: 一个用于单元测试,另一个用于其他所有内容。是否可以在 Django 1.2.4中配置它?

(我之所以问这个问题,是因为我得到了如下错误:

foo@bar:~/path/$ python manage.py test
Creating test database 'default'...
Got an error creating the test database: permission denied to create database


Type 'yes' if you would like to try deleting the test database 'test_baz', or 'no' to cancel: yes
Destroying old test database...
Got an error recreating the test database: database "test_baz" does not exist

为什么我会得到这个错误?我想我并不在乎是否总是可以使用 SQLite 进行单元测试,因为它工作得很好。)

48503 次浏览

在你的 settings.py(或 local_settings.py) :

import sys
if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydatabase'
}

如果可以手动创建数据库,则可以使用 姜戈鼻子作为 TEST _ RUNNER。一旦安装,如果你通过以下环境变量,它将不会删除和重新创建数据库。

REUSE_DB=1 ./manage.py test

您还可以将以下内容添加到 setings.py,这样您就不必在每次运行测试时都编写 REUSE _ DB = 1:

os.environ['REUSE_DB'] = "1"

注意: 这也会将所有表保留在数据库中,这意味着测试设置会快一些,但是当您更改模型时,您将不得不手动更新表(或者自己删除并重新创建数据库)。

我处理这个问题的方法是使用多个设置文件,因为我使用它来维护一组公共设置,并对每个实例进行修改。与其他一些解决方案相比,设置起来要复杂一些,但我还是需要这样做,因为我管理的本地开发、远程开发、登台和生产的设置略有不同。

Https://code.djangoproject.com/wiki/splitsettings 有很多管理设置的选项,我选择了一个类似于 href = “ https://code.djangoproject.com/wiki/SplitSettings # SimplePackageOrganization/forEnvironment”> https://code.djangoproject.com/wiki/splitsettings#simplepackageorganizationforenvironments 中描述的做法

因此,在我的 Django 项目目录中,我有一个设置文件夹如下:

$ tree settings
settings
├── defaults.py
├── dev.py
├── dev.pyc
├── __init__.py
├── lettuce.py
├── travis.py
├── unittest.py

常见的设置位于 sets/defaults.py 中,我将它们导入到实例设置文件中。设置/unittest.py 如下:

from defaults import *


DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'my_database',
}
}

然后,当我想运行测试时,我只需执行:

$ ./manage.py test --settings=settings.unittest

使用 sqlite 进行测试。如果我想使用不同的测试运行器或数据库配置,我将使用不同的设置模块。

虽然这个问题已经解决了。

如果用于测试的数据库只是一个普通的 DB:

我认为您没有进行单元测试,因为您依赖于数据库。无论如何,django 包含一个用于该(非酉)的测试类型: django.test.TestCase

您需要从 django.test.TestCase而不是从 unittest.TestCase派生,这将为您创建一个新的重试数据库,将在测试结束时被销毁。

以下连结载有有关使用 db 进行测试的有趣解释/提示
测试 Django 应用程序

这极大地加速了测试执行。

import sys


if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
'TEST_CHARSET': 'UTF8', # if your normal db is utf8
'NAME': ':memory:', # in memory
'TEST_NAME': ':memory:', # in memory
}


DEBUG = False # might accelerate a bit
TEMPLATE_DEBUG = False


from django.core.management import call_command
call_command('syncdb', migrate=True) # tables don't get created automatically for me

为什么我会得到这个错误?

由于权限不足。在使用超级用户权限运行 psql之后,可以通过 ALTER USER username CREATEDB;更改用户权限。

例如,

$ sudo su - postgres
$ psql
psql (9.3.18)
Type "help" for help.


postgres=# ALTER USER username CREATEDB;
ALTER ROLE

可以在 settings.py中指定测试数据库 Https://docs.djangoproject.com/en/3.0/topics/testing/overview/#the-test-database

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'USER': 'mydatabaseuser',
'NAME': 'mydatabase',
'TEST': {
'NAME': 'mytestdatabase',
},
},
}

我解决了这个问题只是创建其他设置常数 DATABASES_AVAILABLE

DATABASES_AVAILABLE = {
'main': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'nep',
'USER': 'user',
'PASSWORD': 'passwd',
'HOST': 'localhost',
},
'remote': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'nes_dev',
'USER': 'usr',
'PASSWORD': 'passwd',
'HOST': '200.144.254.136',
},
'sqlite': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
},
}


# This solves the problem with tests
# Define a system variable called DJANGO_DATABASE_TEST and set it to the
# the database you want
database = os.environ.get('DJANGO_DATABASE_TEST', 'main')
DATABASES = {
'default': DATABASES_AVAILABLE[database]
}

您可以通过编辑 settings.py来镜像数据库:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'USER': 'mydatabaseuser',
'NAME': 'mydatabase',
'TEST': {
'MIRROR': 'default',
},
},
}

我和你有同样的问题。我解决了这个问题,只需在 settings.py中添加数据库中的 TEST 值,在我的 Django 版本4.0.2中可以找到,如下所示:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'HOST': host,
'NAME': name,
'TEST': {'NAME': 'test_db'},
'USER': user,
'PASSWORD': your_password,
}
}.

这个临时变量使用不同的名称创建 db,并解决了冲突。