Ubuntu 12.04 の PostgreSQL で Django 1.4 を使用しています。多くのテストがありますが、問題はテストの実行が非常に遅いことです。これは、各テストでデータベースがゼロから作成されるためだと思います。メモリー内のデータベース (ハードディスクではなく) でテストを実行することにより、テストを高速化したいと考えています。どうすればいいのですか?リンクやチュートリアルはありますか?
6 に答える
最適なオプションは、テスト用に別の設定ファイルを用意することです。settings_test.py では、デフォルトでメモリ内データベースを使用する sqlite を使用するように指示します。
from base_settings import *
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory'
}
}
そして、追加してテストを実行します--settings=settings_test
Django ドキュメントも参照してください:
https://docs.djangoproject.com/en/dev/topics/testing/overview/#the-test-database
2016 年に早送りすると、manage.py にテストを高速化するための非常に優れたオプションがあります。
--keepdb, -k¶ Django 1.8 で追加されました。テスト実行間でテスト データベースを保持します。これには、作成アクションと破棄アクションの両方をスキップできるという利点があり、特に大規模なテスト スイートのテストを実行する時間を大幅に短縮できます。テスト データベースが存在しない場合は、最初の実行時に作成され、その後の実行ごとに保持されます。テスト スイートを実行する前に、未適用の移行もテスト データベースに適用されます。
TransactionTestCase を使用しておらず、そのサブクラスである場合、テストの実行時間の大部分はデータベースの作成に費やされます。多数の移行がある場合、それは本当に悪いことになります。しかし、あなたとそれをすべて避ける
./manage.py test -k myapp
Python や Django には詳しくありませんが、概念的には次のことができるはずです。
- テストをブートストラップするときに、データベースを作成し、フィクスチャを一度ロードします
- セーブポイントを定義します。
- 各テストまたはテストのグループの後、そのセーブポイントにロールバックします。
(セーブポイントがサポートされていない場合は、テスト中に ORM の開始/終了トランザクション コードをオーバーライドする必要がある場合があります。)
http://www.postgresql.org/docs/current/static/sql-savepoint.html
(概念レベルでは、コンポーネントを分離してテストできるように、DBAL と ORM をテストでモックする必要があることを付け加えておきます。つまり、最初からデータベースに接続するべきではないということです。ほとんどのテストで使用できます。)
テスト用のデータベースを sqlite に変更するだけです。
import sys
if 'test' in sys.argv:
DATABASES['default']['engine'] = 'sqlite3'
データベース間の非互換性が原因で一部のテストが失敗する可能性があることに注意してください。ただし、通常はこれでうまくいくはずです。