[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ディレクトリが一つもなかったので、試しに消してみたら、テストが実行できるようになりました。

さいごに

これを発見するまでは、マイグレーションファイルの作成とテストを行ってマイグレーションファイルを削除するコマンドを自作して対応していたのでかなりスッキリしました。
それにしてもディレクトリ消すだけでよかったなんて、ものすごく時間をかけていろいろ探したのに…