web-dev-qa-db-ja.com

Djangoでテストするための別のデータベース?

DATABASES = {
#    'default': {
#        'ENGINE': 'postgresql_psycopg2',
#        ...
#    }

    # for unit tests
    'default': {
        'ENGINE': 'Django.db.backends.sqlite3',
        'NAME': 'mydatabase'
    }
}

2つのデータベースがあります。1つは単体テストに使用したいデータベースで、もう1つは他のすべてに使用したいデータベースです。これをDjango 1.2.4で設定できますか?

(私が尋ねる理由は、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を使用できるかどうかはあまり気にしないと思います。

51
Nick Heiner

あなたのsettings.py(またはlocal_settings.py):

import sys
if 'test' in sys.argv:
    DATABASES['default'] = {
        'ENGINE': 'Django.db.backends.sqlite3',
        'NAME': 'mydatabase'
    }
67
Sam Dolan

これを処理する方法は、複数の設定ファイルを使用することです。これを使用して、各インスタンスに変更を加えた共通設定のセットを維持するためです。他のいくつかのソリューションよりもセットアップが少し複雑ですが、ローカル開発、リモート開発、ステージング、およびプロダクションの設定が少し異なるため、とにかくそれを行う必要がありました。

https://code.djangoproject.com/wiki/SplitSettings には、設定を管理するための多くのオプションがあり、 https:// code.djangoproject.com/wiki/SplitSettings#SimplePackageOrganizationforEnvironments

だから、私の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',
    }
} 

次に、テストを実行するときに、次のコマンドを実行します。

$ ./manage.py test --settings=settings.unittest

テストにsqliteを使用します。別のテストランナーまたはデータベース構成を使用する場合は、別の設定モジュールを使用します。

32
Geoffrey Hing

settings.pyに既にテストデータベースを指定できることに言及したいです。 https://docs.djangoproject.com/en/2.0/ref/settings/#test を参照してください:

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.postgresql',
        'USER': 'mydatabaseuser',
        'NAME': 'mydatabase',
        'TEST': {
            'NAME': 'mytestdatabase',
        },
    },
}
15
Leon Mak

これにより、テストの実行が劇的に加速しました。

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
7
laffuste

これはすでに解決されていますが...

テスト用のデータベースが通常のDBである場合:

データベースに依存しているため、ユニットテストを行っていないと思います。とにかく、Djangoにはそのテストタイプが含まれています(ユニタリではない):Django.test.TestCase

Django.test.TestCaseの代わりにunittest.TestCaseから派生する必要があります。これは、テストの終了時に破棄される新しい復元データベースを作成します。

次のリンクには、dbを使用したテストに関する興味深い説明/ヒントがあります。
テストDjangoアプリケーション

3
Mario Corchero

データベースを手動で作成するアクセス権がある場合は、TEST_RUNNERとして Django-nose を使用できます。インストール後、次の環境変数を渡すと、データベースは削除および再作成されません。

REUSE_DB=1 ./manage.py test

また、以下をsettings.pyに追加して、テストを実行するたびにREUSE_DB = 1を記述する必要がないようにすることもできます。

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

注:これにより、すべてのテーブルがデータベースに残り、テストのセットアップが少し速くなりますが、モデルを変更するときに、テーブルを手動で更新する必要があります(またはデータベースを削除して再作成する必要があります)。

3
mhost

他の設定定数を作成するだけでこの問題を解決しましたDATABASES_AVAILABLE

DATABASES_AVAILABLE = {
    'main': {
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': 'nep',
        'USER': 'user',
        'PASSWORD': 'passwd',
        'Host': 'localhost',
    },
    'remote': {
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': 'nes_dev',
        'USER': 'usr',
        'PASSWORD': 'passwd',
        'Host': '200.144.254.136',
    },
    'sqlite': {
        'ENGINE': 'Django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
}

# This solves the problem with tests
# Define a system variable called Django_DATABASE_TEST and set it to the
# the database you want
database = os.environ.get('Django_DATABASE_TEST', 'main')
DATABASES = {
    'default': DATABASES_AVAILABLE[database]
}
2
Caco

このエラーが発生するのはなぜですか?

権限が不十分なため。スーパーユーザー権限でpsqlを実行した後、ALTER USER username CREATEDB;によってユーザーのアクセス許可を変更できます。

例、

$ Sudo su - postgres
$ psql
psql (9.3.18)
Type "help" for help.

postgres=# ALTER USER username CREATEDB;
ALTER ROLE
1
Samkit Jain