Django(鼻子)测试加速,reuse_db无法正常工作

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选项.我应该使用其他设置吗?

And*_*dov 9

如果我已正确理解,您将不知道如何首次创建测试数据库(以便稍后重用).

即使您设置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)