django-storagesのS3Botoに支えられたImageFieldを持つモデルがあります。「画像のアップロード」ビューを実行するテストがありますが、画像をS3にアップロードしているという事実により、テストスイートの速度が低下しています。
テストを高速化するために、この問題に対処するためのベストプラクティスは何ですか?S3Botoをモックアウトする必要がありますか?おそらく、テストに適したメモリバックアップストレージバックエンドがありますか(自動クリーンアップがいいでしょう!)?
django-storagesのS3Botoに支えられたImageFieldを持つモデルがあります。「画像のアップロード」ビューを実行するテストがありますが、画像をS3にアップロードしているという事実により、テストスイートの速度が低下しています。
テストを高速化するために、この問題に対処するためのベストプラクティスは何ですか?S3Botoをモックアウトする必要がありますか?おそらく、テストに適したメモリバックアップストレージバックエンドがありますか(自動クリーンアップがいいでしょう!)?
私もこの問題を抱えていました。を使用すると、はるかに高速なテストが可能になりましたdj-inmemorystorage
。
これを設定する簡単な方法test_settings.py
は、設定と同じフォルダにを作成することです。
from settings import *
DEFAULT_FILE_STORAGE = 'inmemorystorage.InMemoryStorage'
./manage.py test --settings=project.test_settings
...そしてテストを実行するために呼び出します。
私の好みの方法は、カスタムテストランナーを設定することです。
で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',
)
注:これにより、作成時間が大幅に改善さPASSWORD_HASHER
れるため、も設定されます。これは本番環境では設定しないでください。User
でproject/settings.py
:
TEST_RUNNER = 'project.test_runner.FastTestRunner'
要求事項:
pip install dj-inmemorystorage
更新:からdjango-inmemorystorage
に変更されましたdj-inmemorystorage
。
更新2django-discover-runner
: djangoのデフォルトのテストランナーになっているため、を削除し、PASSWORD_HASHER
関連するブログ投稿へのリンクを修正しました。
ちょうどこれにも遭遇したので、私は自分の解決策を立てると思いました。私のソリューションは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)
いくつかの落とし穴-設定に適切な設定があることを確認してくださいこれは1.6で修正されました。また、upload_toが通常のファイルシステムで機能することを確認してください。そうしないと、パーミッションエラーが発生します。MEDIA_ROOT
。django 1.4以降、テストコンテキストマネージャーを使用してオーバーライドすることはできないためMEDIA_ROOT
、個別の設定構成が必要です(https://code.djangoproject.com/ticket/17787)
私もS3Botoを使用していますが、テストには、ファイルシステムストレージの使用を含むカスタム設定を使用することをお勧めします。カスタム設定をファイルで宣言して、テストケースにインポートして使用することができます。それでも、ファイルが実際にディスクに書き込まれないように、ファイルストレージをモックすることができます。
これがサンプルですtest_settings.py
# myproject/myproject/test_settings.py
from django.test import override_settings
common_settings = override_settings(
DEFAULT_FILE_STORAGE='django.core.files.storage.FileSystemStorage',
PASSWORD_HASHERS=(
'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher',
),
)
使用法:
from django.test import TestCase
from myproject.test_settings import common_settings
@common_settings
class MyTestCase(TestCase):
"""Tests go here"""
ファイルシステムストレージのモックについては、SOで私の答えを確認できます。
テストには標準のDjangoStorageを使用することを提案します。ここでは、ストレージのカスタムパスを定義し、完了したらテストスイートでそのパスをクリーンアップできます。ストレージとパスの両方を設定で設定し、テスト用に上書きすることができます。