[Django] マイグレーションファイルなしでテストを実行する
Djangoでテストを行うときに、モデルを利用したテストを行うことがあると思うのですが、そのときに毎回マイグレーションファイルを作成してからテストをしないと
Creating test database for alias 'default'...
Traceback (most recent call last):
File "/home/user/.pyenv/versions/djboost/lib/python3.7/site-packages/Django-3.0.2-py3.7.egg/django/db/backends/utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
File "/home/user/.pyenv/versions/djboost/lib/python3.7/site-packages/Django-3.0.2-py3.7.egg/django/db/backends/sqlite3/base.py", line 396, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: tests_model
こんなエラーが出るのでマイグレーションファイルなしでテストを実行できないものかといろいろ試して答えを見つけたのでその方法のメモ
はじめに
そもそもなぜこんなことをやりたかったかと言うと、筆者が公開しているライブラリのテストの中に、モデルを利用したテストを実行したい箇所があったのですが、gitで管理するファイルにテストの為だけのマイグレーションファイルを含めたくなかったからです。
特に、テストは機能の追加があれば書き足すものなので、その都度マイグレーションファイルを増やしていく事になるとキレイじゃないように思えたのでマイグレーションファイルなしでテスト出来ないものかと考えたからです。
マイグレーションファイルなしでテストを実行出来るようにする
DBを利用しないように設定をいろいろ追加するのかと思っていましたが、方法はものすごく簡単でした。
アプリケーションのmigrations
ディレクトリを削除するだけ。
app
├── __init__.py
├── apps.py
├── migrations < -- 削除
├── models.py
└── tests
これで、マイグレーションファイルがなくてもテストが実行できます。
GithubのDjangoのコードを読んでいたらtestsのアプリケーションにmigrations
ディレクトリが一つもなかったので、試しに消してみたら、テストが実行できるようになりました。
さいごに
これを発見するまでは、マイグレーションファイルの作成とテストを行ってマイグレーションファイルを削除するコマンドを自作して対応していたのでかなりスッキリしました。それにしてもディレクトリ消すだけでよかったなんて、ものすごく時間をかけていろいろ探したのに…