模拟Django存储模型ImageField后端S3

eri*_*kcw 15 django unit-testing mocking

我有一个带有由django-storages的S3Boto支持的ImageField的模型.我测试了练习"上传图片"视图,但是它将图像上传到S3的事实正在减慢我的测试套件.

为了加速我的测试,处理这个问题的最佳做法是什么?我应该嘲笑S3Boto吗?也许有一个内存支持的存储后端适用于测试(自动清理会很好!)?

mes*_*shy 14

我也遇到了这个问题.我通过使用获得了更快的测试dj-inmemorystorage.

快速设置方法test_settings.py在与设置相同的文件夹中创建:

from settings import *
DEFAULT_FILE_STORAGE = 'inmemorystorage.InMemoryStorage'
Run Code Online (Sandbox Code Playgroud)

...并呼吁./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',
        )
Run Code Online (Sandbox Code Playgroud)

注意:这也设置了PASSWORD_HASHER,因为它显着User缩短了创建时间.这不应该在生产中设置.

project/settings.py:

TEST_RUNNER = 'project.test_runner.FastTestRunner'
Run Code Online (Sandbox Code Playgroud)

要求:

pip install dj-inmemorystorage
Run Code Online (Sandbox Code Playgroud)

更新:从django-inmemorystorage改为dj-inmemorystorage.

更新2:删除django-discover-runner,因为它现在是django中的默认测试运行器,并修复了PASSWORD_HASHER相关博客文章的链接.


gia*_*tas 5

我也使用 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',
    ),
)
Run Code Online (Sandbox Code Playgroud)

用法:


from django.test import TestCase

from myproject.test_settings import common_settings

@common_settings
class MyTestCase(TestCase):
    """Tests go here"""
Run Code Online (Sandbox Code Playgroud)

关于模拟文件系统存储,您可以在此处查看我的答案SO