@kotyのブログ

PythonとかAWSとか勉強会のこととかを、田舎者SEがつづります。記事のライセンスは"CC BY"でお願いします。

追記:migrateをスキップすることでDjangoのunittestを高速化する

この続きです。

koty.hatenablog.com

結論を先に書くと、以下のsettingsでテストを動かす。テスト用のsqlite3ファイルは使わない。 *1

from .base import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',
    }
}

# MIGRATION_MODULESは各installed_appsにある名前をkeyに、当該appのmigrationファイルのモジュール(既定ではmigrationsモジュール)をvalue指定した辞書。
# 以下のクラス、どんなキーを指定しても辞書に存在し、どんなキーを指定しても`nomigrations`を返す辞書を作っている。
# 'nomigrations'モジュールは存在しないので、既存のmigrationファイルは見つからずにmigration未済みという扱いになる。
class DisableMigrations(object):
    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        # return 'notmigrations'
        return False  # django 1.11にも対応するにはこちらで

MIGRATION_MODULES = DisableMigrations()

ドキュメントを見ると、

When using SQLite, the tests will use an in-memory database by default

とあるので、ファイルを指定しても :memory: で実行されるんだろうか。

また、core/management/commands/migrate.pydb/migrations/loader.pyを見るに、migrationファイルが見つからない場合はその場でmigrationファイルを作って実行してくれるようだ。

Two Scoops of Django: Best Practices for Django 1.8

Two Scoops of Django: Best Practices for Django 1.8

*1:ちゃんとdjangoのドキュメントやソースコードを読まないといかんですね。。。