mic*_*mit 4 django unit-testing django-nose
我正在使用django-nose在django(1.4)中运行我的单元测试.
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
Run Code Online (Sandbox Code Playgroud)
创建数据库需要很长时间.
所以我发现把它放在settings.py中:
os.environ['REUSE_DB'] = "1"
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩.
实际上django itsellve给出了这个建议:
To reuse old database "<path not very interesting>/var/sqlite/unittest.db" for speed, set env var REUSE_DB=1.
Run Code Online (Sandbox Code Playgroud)
当然,您需要使用此标志= 0运行一次(或在每次数据库更改后)
但是,当您将标志设置为0时,我的测试以注释结束:
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)
因此,当我想重复运行它时......没有什么可以重用...而且我会得到错误,表示该表不存在
DatabaseError: no such table: <and than a table name>
Run Code Online (Sandbox Code Playgroud)
将reuse_db设置为0时,测试运行完美
我在我的开发设置中使用测试数据库别名:
DATABASES = {
'default': {
'NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'development.db'),
'TEST_NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'unittest.db'),
'ENGINE': 'django.db.backends.sqlite3',
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
}
Run Code Online (Sandbox Code Playgroud)
我没有使用内存中的sqllite数据库进行测试,因为我读到某个地方这对django-nose不起作用.
那么如何在最终销毁数据库时重用数据库...
根据这个https://docs.djangoproject.com/en/1.4/topics/testing/#the-test-database django这样做,但它没有显示如何防止这种情况(如果我可以),或者如何使用reuse_db选项.我应该使用其他设置吗?
如果我已正确理解,您将不知道如何首次创建测试数据库(以便稍后重用).
即使您设置REUSE_DB = 0,如果DB不存在,NoseTestSuiteRunner也应自动创建它.如果要手动创建测试数据库,可以创建以下文件:
test_db_settings.py
你在其中指定:
from settings import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
# TestRunner uses a database with name that consists
# of prefix test_ and your database name if your database
# name is db then the test database name has to be test_db
'NAME': 'test_db',
'USER': 'postgres_user',
'PASSWORD': 'postgres_user',
'HOST': 'localhost',
'PORT': '5432',
}
}
Run Code Online (Sandbox Code Playgroud)
之后创建test_db:
createdb -U postgres_user -h localhost test_db # if you use postgres
python manage.py syncdb --settings test_db_settings.py
python manage.py migrate --settings test_db_settings.py (only if you use South)
Run Code Online (Sandbox Code Playgroud)
现在我们有了TestRunner使用的DB.我们可以运行测试:
REUSE_DB=1 python manage.py test
Run Code Online (Sandbox Code Playgroud)
更新
你确定使用NoseTestSuiteRunner吗?以下是来自django_nose.NoseTestSuiteRunner的一些代码.我们可以看到是否设置了选项REUSE_DB,然后禁用了teardown_database.如果你想要你可以调试它,例如在这里设置一个断点来检查你真的使用它的Runner等.
def teardown_databases(self, *args, **kwargs):
"""Leave those poor, reusable databases alone if REUSE_DB is true."""
if not _reusing_db():
return super(NoseTestSuiteRunner, self).teardown_databases(
*args, **kwargs)
# else skip tearing down the DB so we can reuse it next time
Run Code Online (Sandbox Code Playgroud)