LoginSignup
0
0

Django のテストで作られたファイルのクリーンナップ

Last updated at Posted at 2024-01-18

(Django 3.x ~5.x あたりの話です。)

テストでストレージ (FileSystemStorage) 上にファイルが作られた場合のクリーンナップについてです。
テストコードでモデルオブジェクトを作ったらファイルも保存された、という場合もあるので気を付けましょう。

ストレージを分けない場合

テスト時もサービス実行時と同じストレージを使うことにより、以下の点に注意が必要です。
本番環境とテスト環境を分けていても、ローカルでテストする場合などを考えて対応しておいた方が良いです。

  • 既存のファイルを上書きしないようにする (ファイル名に意味を持たせない)。
    • これはテスト時に限らず (運用にもよりますが基本的には) そのように実装すべきです。ごみファイルは定期的に削除するようにします。
  • テストで作ったファイルを削除できる仕組みを作る。
    • テスト中に作ったファイルを憶えておいて、tearDown() で削除します。tearDown() はテストが失敗したり例外で中断したりした場合でも実行されます。
    • オブジェクトの FileField のファイルは、オブジェクトが削除されたら 削除されるようにしておきます (テストではなく実装側で)。これにより tearDown() でオブジェクトをまとめて削除すれば良くなります。
      ※複数のオブジェクトが同じファイルを参照している場合等も、実装側で整合性をとるようにします。

ストレージを分ける場合

テスト時とサービス実行時でストレージを分ける方法もあります。
ローカルでテストする場合など、ファイルの保存先を別のフォルダにしたい場合は、テスト中だけ MEDIA_ROOT を変えるようにします。
これにより、テストで作ったファイルのクリーンナップが楽になります。

  1. 以下のような settings_test.py を作る。
    settings_test.py
    from .settings import *
    
    MEDIA_ROOT = '/path/to/test/media/'
    
  2. manage.py test コマンド実行時に、--settings パラメタで上記のファイルを指定する。

※固定で置いておくファイルがある場合はコピーするのを忘れないようにしましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0