2010-12-10 9 views
5

यह केवल एक सिद्धांत है जिसे मैं दूसरों की प्रतिक्रिया और शायद इसी तरह के अनुभवों के आधार पर समझना चाहता हूं।Django SQLite परीक्षण विषमता: निष्पादन के विभिन्न पथ?

परीक्षण चलाने के लिए mySQL का उपयोग कर रहे थे, लेकिन निश्चित रूप से एक इन-मेमोरी SQLite डेटाबेस बहुत तेज है। हालांकि, ऐसा लगता है कि कुछ समस्याएं चल रही हैं।

DATABASE_ENGINEdjango.db.backends.sqlite3 उपयोग करने के लिए सेट कर दिया जाता है और मैं manage.py test चलाते हैं, उत्पादन आशा की जाती है के रूप में नहीं:

(सबसे लाइनों निकाला गया, लेकिन असफलता का दिलचस्प अंक उनका कहना है)

 
$ python manage.py test 
Traceback (most recent call last): 
    File "manage.py", line 12, in 
    execute_manager(settings) 
    File "/Users/bartekc/.virtualenvs/xx/lib/python2.6/site-packages/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 51, in 
    class AcvTripIncentive(models.Model): 

    # First interesting failure 
    File "/Users/bartekc/domains/xx/xx/associates/yy/models.py", line 55, in AcvTripIncentive 
    trip = models.OneToOneField(Trip, limit_choices_to={'sites' : Site.objects.get(name='ZZ'), 'is_active' : True,}) 

    # Next interesting failure 
    File "/Users/bartekc/domains/xx/xx/associates/yyz/models.py", line 252, in 
    current_site = Site.objects.get_current() 

एक से अधिक कर रहे हैं इस तरह की असफलताओं, लेकिन बस एक जोड़े को इंगित करते हैं। समस्या स्पष्ट है। साइट मॉडल में कोई वास्तविक डेटा नहीं है, लेकिन फ़ाइलों में कोड होता है जो साइट मॉडल के तहत वर्तमान, या विशिष्ट उदाहरण लाने की कोशिश करता है।

अब, मैं एक आसान समाधान के बारे में सोच सकता हूं: OneToOneField को limit_choices_to के साथ फ़ंक्शन का उपयोग करने के लिए स्विच किया जाना चाहिए, और दूसरा एक जैसा है। जब आवश्यक हो तो फ़ंक्शन को Django द्वारा फ़ाइल की आरंभिक स्कैनिंग पर नहीं कहा जाता है।

हालांकि, मेरा वास्तविक प्रश्न यह है: यह SQLite के साथ क्यों होता है और MySQL नहीं?। क्या दो डेटाबेस इंजन परीक्षण के माध्यम से प्रक्रिया का एक अलग तरीका है? मैं ऐसा नहीं सोचूंगा, क्योंकि पाइथन मॉडलों की सभी संकलन कर रहा है।

वास्तव में क्या हो रहा है?

चीयर्स।

+0

क्या आपने सोचा था कि जब भी आप परीक्षण चलाते हैं, तब SQLite डेटाबेस नए और खाली बनाए जाते हैं, जबकि mysql डेटाबेस समान हो सकता है जो आप उत्पादन/विकास के लिए उपयोग करते हैं और इसमें पहले से ही कुछ और डेटा है? –

+0

MySQL डेटाबेस भी हर बार एक नया बनाया गया है। – Bartek

+0

आप अपने मॉडल में Site.objects.get_current() कहां कॉल करते हैं? क्या यह सहेजने() विधि में या सिग्नल में है? –

उत्तर

0

क्या आप अपनी साइट ऑब्जेक्ट्स को एक स्थिरता से लोड कर रहे हैं?

यदि ऐसा है, तो शायद आप MySQL और लेन-देन के साथ ज्ञात समस्या पर ठोकर खा रहे हैं। इस पृष्ठ पर "MySQL और Fixtures" के लिए एक टेक्स्ट खोज करें: http://docs.djangoproject.com/en/dev/ref/django-admin/?from=olddocs

+0

साइट ऑब्जेक्ट के लिए फिक्स्चर का उपयोग नहीं कर रहा है, और समस्या केवल SQLite के साथ बनी रहती है :( – Bartek

1

क्या कोई कारण नहीं है कि आप mocking डेटाबेस तक पहुंच नहीं हैं? जब आप मिश्रण में डेटाबेस जोड़ते हैं (कोई फर्क नहीं पड़ता कि डेटाबेस) तो आपकी यूटी सीमा बहुत व्यापक हो जाती है। यह यूनिट परीक्षण की बजाय एकीकरण परीक्षण की तरह दिखना शुरू कर देता है।

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