18

django-storagesのS3Botoに支えられたImageFieldを持つモデルがあります。「画像のアップロード」ビューを実行するテストがありますが、画像をS3にアップロードしているという事実により、テストスイートの速度が低下しています。

テストを高速化するために、この問題に対処するためのベストプラクティスは何ですか?S3Botoをモックアウトする必要がありますか?おそらく、テストに適したメモリバックアップストレージバックエンドがありますか(自動クリーンアップがいいでしょう!)?

4

4 に答える 4

15

私もこの問題を抱えていました。を使用すると、はるかに高速なテストが可能になりました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関連するブログ投稿へのリンクを修正しました。

于 2013-06-12T13:16:31.607 に答える
3

ちょうどこれにも遭遇したので、私は自分の解決策を立てると思いました。私のソリューションは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が通常のファイルシステムで機能することを確認してください。そうしないと、パーミッションエラーが発生します。

于 2012-10-22T08:55:28.957 に答える
3

私も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で私の答えを確認できます。

于 2019-09-08T21:42:43.477 に答える
0

テストには標準のDjangoStorageを使用することを提案します。ここでは、ストレージのカスタムパスを定義し、完了したらテストスイートでそのパスをクリーンアップできます。ストレージとパスの両方を設定で設定し、テスト用に上書きすることができます。

于 2012-08-27T22:29:38.887 に答える