(Django 3.x ~5.x あたりの話です。)
テストでストレージ (FileSystemStorage
) 上にファイルが作られた場合のクリーンナップについてです。
テストコードでモデルオブジェクトを作ったらファイルも保存された、という場合もあるので気を付けましょう。
ストレージを分けない場合
テスト時もサービス実行時と同じストレージを使うことにより、以下の点に注意が必要です。
本番環境とテスト環境を分けていても、ローカルでテストする場合などを考えて対応しておいた方が良いです。
- 既存のファイルを上書きしないようにする (ファイル名に意味を持たせない)。
- これはテスト時に限らず (運用にもよりますが基本的には) そのように実装すべきです。ごみファイルは定期的に削除するようにします。
- テストで作ったファイルを削除できる仕組みを作る。
- テスト中に作ったファイルを憶えておいて、
tearDown()
で削除します。tearDown()
はテストが失敗したり例外で中断したりした場合でも実行されます。 - オブジェクトの
FileField
のファイルは、オブジェクトが削除されたら 削除されるようにしておきます (テストではなく実装側で)。これによりtearDown()
でオブジェクトをまとめて削除すれば良くなります。
※複数のオブジェクトが同じファイルを参照している場合等も、実装側で整合性をとるようにします。
- テスト中に作ったファイルを憶えておいて、
ストレージを分ける場合
テスト時とサービス実行時でストレージを分ける方法もあります。
ローカルでテストする場合など、ファイルの保存先を別のフォルダにしたい場合は、テスト中だけ MEDIA_ROOT
を変えるようにします。
これにより、テストで作ったファイルのクリーンナップが楽になります。
- 以下のような settings_test.py を作る。
settings_test.py
from .settings import * MEDIA_ROOT = '/path/to/test/media/'
-
manage.py test
コマンド実行時に、--settings
パラメタで上記のファイルを指定する。
※固定で置いておくファイルがある場合はコピーするのを忘れないようにしましょう。