2011-08-25 14 views
15

"manage.py test"のように、テストを実行するたびにテストデータベースを作成します。テストを実行するたびにデータを切り捨てる(フラッシュする)たびに、テストデータベースを作成しないようにする方法はありますか?Djangoユニットテストは、毎回テストデータベースを作成せずに

私のテーブルは、約40テーブルです(プロジェクト全体ではなく、単一のアプリケーションであっても)、テストを実行するたびに気分が悪くなります。

答えて

8

ニーズに応じて、あなたはいくつかの選択肢があります。

1

ジャンゴ・鼻はデータベースを再利用するサポートしています。

https://github.com/django-nose/django-nose#enabling-database-reuse

ただし、コメントを読んでください:

を1つの新しいしわが、そのたびにDBスキーマです変更すると、次回のテストを実行するときにフラグ をオフにしておく必要があります。これにより、テストランナー にテストデータベースを再初期化するように指示されます。あなたがそれを使用したい場合は

はまた、REUSE_DBは(下記参照)DBに ジャンクを残しTransactionTestCasesと互換性がありませんので、ご TransactionTestCasesが衛生的にするようにしてください。

1

次の解決策では、さらに多くの南のマイグレーションがある場合、dbの作成時間も短縮されます。単体テストでは、すべての南の移行を実行する代わりにsyncdbを実行する方がはるかに高速です。

私はこれを推測している#マイグレーションを無効にし、代わりに

0

をsyncdbの実行 を使用するために= FalseのSOUTH_TESTS_MIGRATEはベストプラクティスではありませんが、私は回避策として行っているものがいくつかの異なるテストを作成することですアプリケーション内の管理/コマンドディレクトリ内のプログラム。例えば

https://docs.djangoproject.com/en/1.7/howto/custom-management-commands/

、私は今、それはいくつかの先進的なPostgresの機能を必要とするアプリケーションに取り組んでいます(SQLiteにも使用することはできません)ので、代わりにtests.pyの一環として、テスト機能を作成するので、私はでtest_process.pyを作成myapp/management/commands/

17

Django 1.8からは、manageを呼び出すときに--keepdbフラグを使用することができました。ジャンゴ1.8でPY

新:あなたは、テストコマンドに--keepdbフラグを追加することによって破壊され からテスト・データベースを防ぐことができます。これにより、実行の間にテストデータベースを保持します( )。データベースに が存在しない場合は、最初に作成されます。最新の状態に保つため、移行には も適用されます。 (https://docs.djangoproject.com/en/1.8/topics/testing/overview/#the-test-database

次のようにだからあなたの呼び出しが見ることができる:

python manage.py test --keepdb 

または速記を使用して、それはそのようになります-k:

python manage.py test -k 
+0

最新のDjango(1.8以上)には、デフォルトのテストキットがあります。これが一番簡単です。 –

+0

keepdbの場合でも、djangoは毎回実行中のマイグレーションを主張しています – Matt

+0

@Matt _テストデータベース が存在しない場合、最初の実行時に作成され、それ以降の実行ごとに保存されます。適用されていないマイグレーションは、テストスイートを実行する前に、テスト データベースにも適用されます._ [django-docs](https://docs.djangoproject.com/ja/1.11/ref/django-admin/#cmdoption-test- keepdb) – Kim

0

あなたはpytestを持っている場合がありますテストランナーとして。設定例を次に示します。

サンプルpytest.iniファイル:

[pytest] 
norecursedirs= 
    *.egg 
    .git 
    .tox 
    .env 
    _sass 
    build 
    dist 
    migrations 
    fabfile 
    .tox 
python_files = 
    test_*.py 
    tests.py 
DJANGO_SETTINGS_MODULE=settings.dev 
addopts= 
    --reuse-db 
    --nomigrations 
    --cov=your_app 
    --ignore=.tox 
    --ignore=fabfile 
    --ignore=scripts 
    --ignore=settings 
    --ignore=tmp 
    --cov-report=html 
    --cov-report=term 
    --cov-report=annotate 

サンプルruntests.pyファイル:

#!/usr/bin/env python 
import os 
import sys 

import pytest 


def main(): 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.dev") 
    return pytest.main() 


if __name__ == '__main__': 
    sys.exit(main()) 

サンプルrequirements.txtファイル:

pytest==3.0.2 
pytest-django==2.9.1 
pytest-cov==2.2.1 

は、テストを実行します

./runtests.py 

この効果は、reuse-dbおよびnomigrationsディレクティブによって実現されます。

関連する問題