"manage.py test"のように、テストを実行するたびにテストデータベースを作成します。テストを実行するたびにデータを切り捨てる(フラッシュする)たびに、テストデータベースを作成しないようにする方法はありますか?Djangoユニットテストは、毎回テストデータベースを作成せずに
私のテーブルは、約40テーブルです(プロジェクト全体ではなく、単一のアプリケーションであっても)、テストを実行するたびに気分が悪くなります。
"manage.py test"のように、テストを実行するたびにテストデータベースを作成します。テストを実行するたびにデータを切り捨てる(フラッシュする)たびに、テストデータベースを作成しないようにする方法はありますか?Djangoユニットテストは、毎回テストデータベースを作成せずに
私のテーブルは、約40テーブルです(プロジェクト全体ではなく、単一のアプリケーションであっても)、テストを実行するたびに気分が悪くなります。
ニーズに応じて、あなたはいくつかの選択肢があります。
あなたは、カスタムのテストランナーを書いたり、デフォルトのものを調整することができます:https://docs.djangoproject.com/en/1.6/topics/testing/advanced/#other-testing-frameworks
あなたがそこにSimpleTestCase
を使用することができますdjango-test-utilsのようなアドオンもあります(しかし、特定のものが現代のDjangoバージョンで動作するかどうかはわかりませんが)。
また、すべてを高速化するにはSQLite's in-memory databaseを使用するか、test database in RAM disk (like tmpfs or ramfs)を作成することができます。これは実際には他の手法を使用することと直交しています。
ジャンゴ・鼻はデータベースを再利用するサポートしています。
https://github.com/django-nose/django-nose#enabling-database-reuse
ただし、コメントを読んでください:
を1つの新しいしわが、そのたびにDBスキーマです変更すると、次回のテストを実行するときにフラグ をオフにしておく必要があります。これにより、テストランナー にテストデータベースを再初期化するように指示されます。あなたがそれを使用したい場合は
はまた、REUSE_DBは(下記参照)DBに ジャンクを残しTransactionTestCasesと互換性がありませんので、ご TransactionTestCasesが衛生的にするようにしてください。
次の解決策では、さらに多くの南のマイグレーションがある場合、dbの作成時間も短縮されます。単体テストでは、すべての南の移行を実行する代わりにsyncdbを実行する方がはるかに高速です。
私はこれを推測している#マイグレーションを無効にし、代わりに
を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/
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
あなたは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
ディレクティブによって実現されます。
最新のDjango(1.8以上)には、デフォルトのテストキットがあります。これが一番簡単です。 –
keepdbの場合でも、djangoは毎回実行中のマイグレーションを主張しています – Matt
@Matt _テストデータベース が存在しない場合、最初の実行時に作成され、それ以降の実行ごとに保存されます。適用されていないマイグレーションは、テストスイートを実行する前に、テスト データベースにも適用されます._ [django-docs](https://docs.djangoproject.com/ja/1.11/ref/django-admin/#cmdoption-test- keepdb) – Kim