4

django-nose を使用して、django (1.4) で単体テストを実行しています。

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

データベースの作成には時間がかかります。

それで、これをsettings.pyに入れることがわかりました:

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

トリックを行う必要があります。

実際に django itsellve はこの提案をします:

To reuse old database "<path not very interesting>/var/sqlite/unittest.db" for speed, set env var REUSE_DB=1.

もちろん、このフラグ =0 を使用して一度 (またはデータベースの変更ごとに) 実行する必要があります

ただし、フラグを 0 に設定すると、私のテストは次のコメントで終了します。

Destroying test database for alias 'default'...

したがって、再利用して実行したい場合....再利用するものは何もありません...そして、テーブルが存在しないというエラーが表示されます

DatabaseError: no such table: <and than a table name>

reuse_db を 0 に設定すると、テストは完全に実行されます

開発設定で test データベース エイリアスを使用しています。

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': '', 
        }
    }

これはdjango-noseではうまく機能しないとどこかで読んだので、テストにインメモリsqlliteデータベースを使用していません。

では、最終的にデータベースを破壊しているときに、どうすればDBを再利用できますか...

これによるとhttps://docs.djangoproject.com/en/1.4/topics/testing/#the-test-database django はこれを行っていますが、これを防ぐ方法 (できれば)、またはその方法を示していません。 reuse_db オプションを使用します。他の設定を使用する必要がありますか?

4

3 に答える 3

9

私の理解が正しければ、(後で再利用するために) 最初にテスト データベースを作成する方法がわかりません。

REUSE_DB = 0 に設定しても、DB が存在しない場合は、NoseTestSuiteRunner が自動的に作成する必要があります。手動でテスト DB を作成する場合は、次のファイルを作成できます。

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',
        }
}

その後、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)

これで、TestRunner が使用する DB ができました。テストを実行する場合があります。

REUSE_DB=1 python manage.py test

更新しました

NoseTestSuiteRunner を使用してもよろしいですか? django_nose.NoseTestSuiteRunner のコードを次に示します。オプション REUSE_DB が設定されている場合にわかるように、teardown_database は無効になっています。必要に応じて、たとえばここでブレークポイントを設定して、実際にランナーなどを使用していることを確認してデバッグできます。

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
于 2013-06-19T09:12:41.247 に答える
1

ところで、別のテスト設定ファイルを使用する代わりに...同じ設定でテスト anme を定義できます。

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.
        }
    }
于 2015-09-18T12:29:25.380 に答える