Django(nose)测试加速,重用\u db不工作

Django(nose)测试加速,重用\u db不工作,django,unit-testing,django-nose,Django,Unit Testing,Django Nose,我使用django nose在django(1.4)中运行单元测试 创建数据库需要很长时间 所以我在settings.py中发现: os.environ['REUSE_DB'] = "1" os.environ['REUSE_DB'] = "1" 我们应该做到这一点 实际上,django Itselve给出了以下建议: To reuse old database "<path not very interesting>/var/sqlite/unittest.db" for s

我使用django nose在django(1.4)中运行单元测试

创建数据库需要很长时间

所以我在settings.py中发现:

os.environ['REUSE_DB'] = "1"
os.environ['REUSE_DB'] = "1" 
我们应该做到这一点

实际上,django Itselve给出了以下建议:

To reuse old database "<path not very interesting>/var/sqlite/unittest.db" for speed, set env var REUSE_DB=1.
所以当我想用重用来运行它时。。。。没有什么可重复使用的。。。我会得到错误,说这个表不存在

DatabaseError: no such table: <and than a table name>
我没有使用内存中的sqllite数据库进行测试,因为我在某个地方读到,这不适合django nose

因此,当数据库最终破坏数据库时,我如何重用它

根据本文,django正在这样做,但它没有显示如何防止这种情况(如果可以的话),也没有显示如何使用reuse_db选项。
我应该使用其他设置吗?

如果我理解正确,您不知道如何第一次创建测试数据库(以便以后重用它)

如果DB不存在,即使您将REUSE_DB设置为0,NoTestSuiteRunner也应该自动创建它。 如果要手动创建测试数据库,可以创建以下文件:

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',
        }
}
之后,创建测试数据库:

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)
现在我们有了TestRunner使用的DB。我们可以运行测试:

REUSE_DB=1 python manage.py test
更新

您确定要使用NoseTestSuiteRunner吗?下面是来自django_nose.NoseTestSuiteRunner的一些代码。我们可以看到,如果设置了重用数据库选项,那么拆卸数据库将被禁用。如果你想调试它,比如在这里设置一个断点来检查你是否真的使用了它的运行程序等等

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

我接受了安德烈·卡戈罗多夫的回答,因为他引导我找到了解决方案。。。读到他的答案,我想(我是多么的容易,多么的愚蠢…)

无论如何,请将此设置\u test\u db.py放在包含以下内容的设置旁边: (填写项目名称)

所以你可以用

python manage.py test

顺便说一下,不要使用单独的测试设置文件。。。 您可以在相同的设置中定义测试anme:

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': '', 
        }
    }
DATABASES = {
    'default': {
        'NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'test.db'),
        'TEST_NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'unittest.db'),
        'ENGINE': 'django.db.backends.sqlite3', 
        'USER': '',
        'PASSWORD': '',
        'HOST': '',  # empty string for localhost.
        'PORT': '',  # empty string for default.
        }
    }

Thanx,我正在尝试这个。。。并接受它的运作方式。。。。问题不是第一次创建db,而是在测试运行后删除它。这个给定的解决方案,再加上另一个运行syncdb和迁移的设置文件,看起来就足以解决我的问题了(这么简单,我本可以自己解决它。)我的设置中有这个。py:TEST_RUNNER='django_nose.NoseTestSuiteRunner'它确实在使用nose,它创建一个nosetests.xml并使用我在settings.py中输入的nose参数。。。。问题在于,如果我使用reuse_db=“0”运行它,它会撕裂数据库(如预期的那样),如果我使用reuse_db=“1”,它不会创建数据库,因此我无法运行测试。使用另一个设置文件手动创建,解决了此问题。
python manage.py syncdb --settings <myproject>.settings_test_db  
python manage.py migrate --settings <myproject>.settings_test_db
os.environ['REUSE_DB'] = "1" 
python manage.py test
DATABASES = {
    'default': {
        'NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'test.db'),
        'TEST_NAME': os.path.join(BUILDOUT_DIR, 'var', 'sqlite', 'unittest.db'),
        'ENGINE': 'django.db.backends.sqlite3', 
        'USER': '',
        'PASSWORD': '',
        'HOST': '',  # empty string for localhost.
        'PORT': '',  # empty string for default.
        }
    }