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-inmemorystoragedj-inmemorystorage

更新 2:删除django-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

我建议使用标准的 Django Storage 进行测试,您可以在其中定义自定义存储路径,并在完成后清理测试套件中的路径。存储和路径都可以在设置中设置并覆盖以进行测试。

于 2012-08-27T22:29:38.887 回答