2012-08-27 27 views
12

मेरे पास एक छविफाइल वाला मॉडल है जिसे django-storages 'S3Boto द्वारा समर्थित किया गया है। मेरे पास "अपलोड छवि" दृश्य का अभ्यास है, लेकिन तथ्य यह है कि यह एस 3 पर छवि अपलोड कर रहा है, मेरा परीक्षण सूट धीमा कर रहा है।मजाकिंग Django स्टोरेज मॉडल ImageField बैकएंड S3

मेरे परीक्षणों को तेज़ करने के हित में, इस मुद्दे से निपटने के लिए सबसे अच्छा अभ्यास क्या है? क्या मुझे एस 3 बोटो का मज़ाक उड़ाया जाना चाहिए? शायद एक मेमोरी समर्थित भंडारण बैकएंड है जो परीक्षण के लिए अच्छी तरह से काम करता है (स्वचालित सफाई अच्छा होगा!)?

उत्तर

7

मुझे अभी भी यह समस्या थी। मुझे dj-inmemorystorage का उपयोग कर बहुत तेज़ परीक्षण मिले।

इसे सेट अप करने की त्वरित तरीका अपनी सेटिंग्स को उसी फ़ोल्डर में एक test_settings.py बनाने के द्वारा है:

from settings import * 
DEFAULT_FILE_STORAGE = 'inmemorystorage.InMemoryStorage' 

... और बुला ./manage.py test --settings=project.test_settings परीक्षण चलाने के लिए। क्योंकि यह significantly improves User creation time यह भी सेट PASSWORD_HASHER:

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', 
     ) 

नोट

मेरे पसंदीदा तरीका एक कस्टम परीक्षण धावक स्थापित करने के लिए है। इसे उत्पादन में सेट नहीं किया जाना चाहिए।

project/settings.py में:

TEST_RUNNER = 'project.test_runner.FastTestRunner' 

आवश्यकताओं:

pip install dj-inmemorystorage 

अद्यतन: dj-inmemorystorage.

को django-inmemorystorage से बदल अद्यतन 2: हटाया गया django-discover-runner, क्योंकि यह अब django में डिफ़ॉल्ट परीक्षण धावक है, और PASSWORD_HASHER संबंधित ब्लॉग पोस्ट के लिंक को ठीक किया गया है।

0

मैं परीक्षण के लिए मानक डीजेगो स्टोरेज का उपयोग करने का प्रस्ताव दूंगा, जहां आप अपने परीक्षण सूट में उस पथ को स्टोरेज और क्लीनअप के लिए कस्टम पथ परिभाषित कर सकते हैं। भंडारण और पथ दोनों सेटिंग्स में सेट किया जा सकता है और परीक्षण के लिए अधिलेखित किया जा सकता है।

+1

मुझे उपरोक्त उल्लेख किया जाना चाहिए था, मैं एक कस्टम स्टोरेज क्लास का उपयोग कर रहा हूं और इसे सिर्फ इस मॉडल के लिए फ़ील्ड में सेट कर रहा हूं: मॉडल। फ़िलफ़ील्ड (स्टोरेज = कस्टमएस 3 स्टोरेज (...)) - इसलिए जीते गए सेटिंग्स को स्वैप करना वास्तव में काम नहीं करते हैं। – erikcw

+0

@erikcw: आप अभी भी टेस्टकेस सेटअप (या परीक्षण मॉड्यूल स्तर आदि) में अपने मॉडल के फ़ाइलफ़िल्फ़ स्टोरेज को ओवरराइट कर सकते हैं। –

1

बस इसमें भी भाग गया इसलिए मैंने सोचा कि मैं अपना समाधान रखूंगा। सुनिश्चित करें कि आप सेटिंग्स में एक समझदार MEDIA_ROOT सेटअप करना - मेरे समाधान 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) 

कुछ gotchas उपयोग करता है। django 1.4 के रूप में, आप MEDIA_ROOT को ओवरराइड करने के लिए परीक्षण संदर्भ प्रबंधक का उपयोग नहीं कर सकते हैं, इसलिए आपको इसके लिए एक अलग सेटिंग कॉन्फ़िगर की आवश्यकता है ( https://code.djangoproject.com/ticket/17787) यह 1.6 में तय किया गया था। साथ ही, सुनिश्चित करें कि आपका upload_to सामान्य फाइल सिस्टम में काम करता है, या आपको अनुमति त्रुटियां मिलेंगी।

+0

यह मेरे लिए काम नहीं करता है, फाइलफिल्ड में स्टोरेज अभी भी मूल परिभाषा पर सेट है, फाइलसिस्टम स्टोरेज नहीं – Peyman

संबंधित मुद्दे