我的模型有一个由django-storages的S3Boto支持的ImageField。我测试了“上传图片”视图,但是将图片上传到S3这一事实正在减慢我的测试套件。
为了加快测试速度,处理这个问题的最佳做法是什么?我应该嘲笑S3Boto吗?也许有一个内存支持的存储后端适用于测试(自动清理会很好!)?
答案 0 :(得分:10)
我也遇到了这个问题。我使用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
,因为它significantly improves User
creation time。 不应在生产中设置。
在project/settings.py
:
TEST_RUNNER = 'project.test_runner.FastTestRunner'
要求:
pip install dj-inmemorystorage
更新:从django-inmemorystorage
更改为dj-inmemorystorage
.
更新2 :删除django-discover-runner
,因为它现在是django中的默认测试运行器,并修复了PASSWORD_HASHER
相关博文的链接。
答案 1 :(得分: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)
一些问题 - 确保您在设置中设置了明智的这是在1.6中修复的。另外,请确保您的upload_to在普通文件系统中正常工作,否则您将获得权限错误。MEDIA_ROOT
。从django 1.4开始,你不能使用测试上下文管理器来覆盖MEDIA_ROOT
,所以你需要一个单独的设置配置(https://code.djangoproject.com/ticket/17787)
答案 2 :(得分:0)
我建议使用标准的Django Storage进行测试,在这里您可以定义自定义路径进行存储,并在完成后清理测试套件中的路径。存储和路径都可以在设置中设置并覆盖以进行测试。
答案 3 :(得分:0)
我也使用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"""
在模拟文件系统存储时,您可以查看我的答案here on SO。