2012-08-27 11 views
12

私は、django-storageのS3BotoによってバックアップされたImageFieldを持つモデルを持っています。私は "画像のアップロード"の演習をテストしていますが、S3に画像をアップロードしているという事実は、私のテストスイートを遅くしています。Django Storages模型モデルImageFieldバックエンドS3

私のテストをスピードアップするために、この問題に対処するベストプラクティスは何ですか?私はS3Botoを嘲笑すべきですか?おそらく、メモリバックアップされたストレージバックエンドがテストに適しています(自動クリーンアップがうまくいくでしょう)。

答えて

7

私もこの問題を抱えていました。私はdj-inmemorystorageを使ってはるかに速いテストを得ました。

from settings import * 
DEFAULT_FILE_STORAGE = 'inmemorystorage.InMemoryStorage' 

...とテストを実行する./manage.py test --settings=project.test_settingsを呼び出す:この設定の

簡単な方法は、あなたの設定と同じフォルダ内にtest_settings.pyを作成することです。 project/test_runner.py

私の好ましい方法は、カスタムのテストランナーを設定することです

from django.conf import settings 
from django.test.runner import DiscoverRunner 

class FastTestRunner(DiscoverRunner): 
    def setup_test_environment(self): 
     super(FastTestRunner, self).setup_test_environment() 
     # Don't write files 
     settings.DEFAULT_FILE_STORAGE = 'inmemorystorage.InMemoryStorage' 
     # Bonus: Use a faster password hasher. This REALLY helps. 
     settings.PASSWORD_HASHERS = (
      'django.contrib.auth.hashers.MD5PasswordHasher', 
     ) 

注:それsignificantly improves User creation timeので、これはまた、PASSWORD_HASHERを設定します。 これは本番環境では設定しないでください。project/settings.py

TEST_RUNNER = 'project.test_runner.FastTestRunner' 

要件:

pip install dj-inmemorystorage 

UPDATEdj-inmemorystorage.

django-inmemorystorageへの変更UPDATE 2django-discover-runnerが削除されました。これは現在djangoのデフォルトテストランナーになっており、PASSWORD_HASHER関連のブログ記事へのリンクを修正しました。

0

標準のDjango Storageをテスト用に使用することをお勧めします。ここでは、完了したらテストスイート内のパスとストレージのクリーンアップを定義できます。ストレージとパスの両方を設定で設定し、テストのために上書きすることができます。

+1

私はカスタムStorageクラスを使用していて、フィールド内のこのモデル用に設定しています: models.FileField(storage = CustomS3Storage(...)) - 設定を入れ替えました本当にうまくいきません。 – erikcw

+0

@erikcw:モデルのFileFieldストレージをTestCase setUp(またはテストモジュールレベルなど)に上書きすることはできます。 –

1

ちょうどこれにも遭遇したので、私は私の解決策を入れたいと思った。私のソリューションは、いくつかの落とし穴Mock

import mock 
from django.core.files.storage import FileSystemStorage 
from django.test import TestCase 

class ATestCase(TestCase): 
    def setUp(self): 
     # Stuff Happens 

    def tearDown(self): 
     # more Stuff 

    @mock.patch('storages.backends.s3boto.S3BotoStorage', FileSystemStorage) 
    def test_file_stuff(self): 
     self.assertMagicPonies(True) 

を使用しています - あなたが設定で正気 MEDIA_ROOTセットアップを持っていることを確認してください。 django 1.4以降では、テストコンテキストマネージャを使用して MEDIA_ROOTを上書きすることはできませんので、別の設定を行う必要があります( https://code.djangoproject.com/ticket/17787これは1.6で修正されました。また、通常のファイルシステムでupload_toが動作することを確認してください。そうしないと、パーミッションエラーが発生します。

+0

これは私にとっては機能しませんが、FileFieldのストレージはFileSystemStorageではなく元の定義に設定されています – Peyman

関連する問題