0

アプリケーションの実行時に異なる動作をする単一のsettings.py ファイルが必要です

./manage.py runserver

そしてテスト時

./manage.py test myapp

したがって、たとえば次のようにして、テスト データベースを sqlite に変更できます。

if IS_TESTING:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3', 
            'NAME': 'test_db',                      
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2', 
            'NAME': DATABASE_NAME,                      
            'USER': DATABASE_USER,                      
            'PASSWORD': DATABASE_PASS,                  
            'HOST': 'localhost',                      
            'PORT': '5432',                      
        }
    }

この動作は、manage.py スクリプトを次のように変更することで実現できます。

if __name__ == "__main__":
    os.environ.setdefault('IS_TESTING', 'false')
    print 'off'
    if sys.argv[1] == 'test':
        print 'on'
        os.environ['IS_TESTING'] = 'true'
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "frespo.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

しかし、IDE (PyCharm) 内でテストを実行すると、カスタムの manage.py ファイルが使用されないため、これでも十分ではないと思います。これには、Django 内にすでに変数が必要です。どこか分かりますか?

4

2 に答える 2

5

この条件が Django 単体テストの目的でのみ必要な場合は、settings.pyファイル内の次の行が機能するはずです。

if 'test' in sys.argv:
    DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'
    SOUTH_TESTS_MIGRATE = False # if you're using south

これは、他の標準DATABASES設定が常に宣言されていることを前提としています。上記の行sqliteは、単体テストの実行の場合にデータベースを設定するだけです。

于 2012-10-07T18:58:07.143 に答える
0

Afaik Django にはそのような変数はありません。PyCharm によって実行される正確なコマンドを編集できると仮定すると、そこに test 引数を追加して、settings.py ファイルでそれを探すことができます。

if "test-argument" in sys.argv:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3', 
            'NAME': 'test_db',                      
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2', 
            'NAME': DATABASE_NAME,                      
            'USER': DATABASE_USER,                      
            'PASSWORD': DATABASE_PASS,                  
            'HOST': 'localhost',                      
            'PORT': '5432',                      
        }
    }
于 2012-10-07T18:59:00.270 に答える