Djangotesting不同的数据库?
DATABASES = { # 'default': { # 'ENGINE': 'postgresql_psycopg2', # ... # } # for unit tests 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'mydatabase' } }
我有两个数据库:一个我想用于unit testing,一个用于其他的。 有没有可能在Django 1.2.4中configuration?
(我问的原因是因为与postgresql我得到以下错误:
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进行unit testing,因为这很好。)
在您的settings.py
(或local_settings.py
)中:
import sys if 'test' in sys.argv: DATABASES['default'] = { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'mydatabase' }
我处理这个问题的方法是通过具有多个设置文件,因为我使用它来维护一组通用设置,并对每个实例进行修改。 比其他一些解决scheme的设置稍微复杂一点,但我仍然需要这样做,因为我对本地开发,远程开发,分期和生产的pipe理略有不同。
所以,在我的Django项目目录中,我有一个如下所示的设置文件夹:
$ tree settings settings ├── defaults.py ├── dev.py ├── dev.pyc ├── __init__.py ├── lettuce.py ├── travis.py ├── unittest.py
常见的设置是在settings / defaults.py中,我将它们导入到我的实例设置文件中。 所以settings / unittest.py看起来像这样:
from defaults import * DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'my_database', } }
然后,当我想运行testing,我只是执行:
$ ./manage.py test --settings=settings.unittest
使用sqlite进行testing。 如果我想使用不同的testing运行器或数据库configuration,我将使用不同的设置模块。
这加速了testing的执行。
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
如果你有手动创build数据库的权限,你可以使用django-nose作为你的TEST_RUNNER。 一旦安装,如果你传递下面的环境variables,它不会删除并重新创build数据库。
REUSE_DB=1 ./manage.py test
您还可以将以下内容添加到settings.py中,以便您不必在每次运行testing时都写REUSE_DB = 1。
os.environ['REUSE_DB'] = "1"
注意:这也会将所有表保留在数据库中,这意味着testing设置会更快一些,但是当您更改模型时, 您将不得不手动更新表 (或者自己删除并重新创build数据库)。
虽然这已经解决了…
如果你的数据库testing只是一个正常的数据库:
因为你依赖于数据库,所以我认为你没有进行unit testing。 无论如何,Django包含一个testingtypes(不单一): django.test.TestCase
您需要从django.test.TestCase
派生而不是unittest.TestCase
,它将为您创build一个新的rehershal数据库,在testing结束时将被销毁。
在下面的链接中有关于使用db进行testing的有趣的解释/提示
testingDjango应用程序
为什么我会得到这个错误?
由于权限不足 您可以通过ALTER USER username CREATEDB;
更改用户权限ALTER USER username CREATEDB;
在超级用户priviliges运行psql
后。
例,
$ sudo su - postgres $ psql psql (9.3.18) Type "help" for help. postgres=# ALTER USER username CREATEDB; ALTER ROLE