2012-12-04 20 views
17

मेरे पास एक ऐप है जो हरोकू में तैनात है, और मैं लक्ष्य पर्यावरण पर परीक्षण सूट पोस्ट-तैनाती चलाने में सक्षम होना चाहता हूं। मैं हेरोकू Postgres ऐड-ऑन का उपयोग कर रहा हूं, जिसका अर्थ है कि मेरे पास केवल एक डेटाबेस तक पहुंच है। मेरे पास नए डेटाबेस बनाने का कोई अधिकार नहीं है, जिसका बदले में मानक Django परीक्षण कमांड विफल रहता है, क्योंकि यह test_ * डेटाबेस नहीं बना सकता है।हेरोकू पर Django परीक्षण कैसे चलाएं

$ heroku run python manage.py test 
Running `python manage.py test` attached to terminal... up, run.9362 
Creating test database for alias 'default'... 
Got an error creating the test database: permission denied to create database 

क्या इसके आसपास कोई रास्ता है?

उत्तर

11

बाहर निकलता है मैं गलत में था। मैं परीक्षण नहीं कर रहा था जो मैंने सोचा था कि परीक्षण किया जा रहा था ... चूंकि हेरोकू के रूटिंग मेष विभिन्न सर्वरों के लिए अनुरोध भेज रहा था, लाइवसेवरटेस्टकेस एक मशीन पर एक वेब सर्वर शुरू कर रहा था और सेलेनियम अन्य मशीनों से पूरी तरह से कनेक्ट हो रहा था।

को Heroku Procfile को अद्यतन करने के द्वारा:

web: python src/manage.py test --liveserver=0.0.0.0:$PORT

परीक्षण डेटाबेस को इंगित करने के DATABASES सेटिंग अधिभावी, और टेस्ट स्वीट धावक नीचे से जुड़ा हुआ अनुरूपण (एक ही विचार अभी भी रखती है: setup_databases तो ओवरराइड कि यह केवल टेबल को छोड़ देता है/फिर से बनाता है, पूरे डेटाबेस नहीं), मैं दूरस्थ परीक्षण चलाने में सक्षम था। लेकिन यह और भी हैकी/दर्दनाक/सुरुचिपूर्ण है। अभी भी कुछ बेहतर खोज रहे हैं! भ्रम के बारे में खेद है।


(नीचे अद्यतन जवाब)

ये कदम उठाएँ कि मेरे लिए काम किया हैं:

  • Heroku टूलबेल्ट

heroku addons:add heroku-postgresql:dev

का उपयोग कर एक अतिरिक्त, नि: शुल्क Postgres डेटाबेस बनाएं
  • HerokuTestSuiteRunner कक्षा का उपयोग करें जो आपको here मिलेगा।

यह कस्टम परीक्षण धावक आवश्यकता है कि आप एक TEST_DATABASES सेटिंग जो ठेठ DATABASES इस प्रारूप के अनुसार परिभाषित करते हैं। उदाहरण के लिए:

TEST_DATABASES = { 
    'default': dj_database_url.config(env='TEST_DATABASE_URL') 
} 

फिर, TEST_RUNNER सेटिंग जहाँ भी HerokuTestSuiteRunner पाया जा सकता है के लिए एक अजगर पथ होना है।

अब आप दिए गए डेटाबेस का उपयोग करके हेरोकू पर Django परीक्षण चलाने में सक्षम होना चाहिए। यह बहुत तेज़ हैक ... मुझे बताएं कि इसे कैसे सुधार किया जा सकता है/कम हैकिश बनाया जा सकता है। का आनंद लें!



(नीचे मूल जवाब)

कुछ प्रासंगिक समाधान here चर्चा की गई है। जैसा कि आप Django docs में पढ़ सकते हैं, "[डब्ल्यू] एसक्यूएलसाइट डेटाबेस इंजन का उपयोग करके, परीक्षण डिफ़ॉल्ट रूप से इन-मेमोरी डेटाबेस का उपयोग करेंगे"।

हालांकि यह उस डेटाबेस इंजन का पूरी तरह से परीक्षण नहीं करता है जिसका आप हेरोकू पर उपयोग कर रहे हैं (मैं अभी भी उस समाधान के लिए लुकआउट पर हूं), SQLite को डेटाबेस इंजन सेट करने से कम से कम आपको अपना भागने की अनुमति मिल जाएगी परीक्षण।

कुछ पॉइंटर्स के लिए उपरोक्त लिंक वाले स्टैक ओवरव्लो question देखें। कम से कम दो तरीके हैं: डेटाबेस इंजन के रूप में SQLite को मजबूर करने से पहले if 'test' in sys.argv परीक्षण करना, या परीक्षण में उपयोग की जाने वाली एक समर्पित सेटिंग फ़ाइल होने पर, जिसे आप django manage.py test पर --settings विकल्प का उपयोग कर सकते हैं।

+2

धन्यवाद ग्रेग - SQLite का उपयोग करना वास्तव में एक विकल्प नहीं है - हमारे पास SQLite (कोई बाधा/स्थिरता जांच) से गुजरने वाले परीक्षणों के कारण कुछ भयानक समस्याएं हैं जो बाद में लाइव पर उड़ा दी गई हैं। वर्तमान समाधान एक वीएम (Vagrant का उपयोग करके) के रूप में Heroku के रूप में दोहराना है और उन्हें वहां चलाने के लिए है। बहुत अच्छी तरह से काम करता है, और अब तक कोई आपदा नहीं है। –

+1

धन्यवाद ह्यूगो, यह जानना अच्छा है। मैं या तो परीक्षण के लिए SQLite का उपयोग नहीं करूँगा (जैसा कि मैं उत्पादन में पोस्टग्रेस का उपयोग करता हूं)। अपने पर्यावरण में एक अतिरिक्त, मुफ्त 'heroku-postgresql: dev' डेटाबेस क्यों नहीं जोड़ें, जिस पर परीक्षण चलाया जा सकता है? जो मैं एकत्र कर सकता हूं, उससे उसी ऐड-ऑन के कई उदाहरण हो सकते हैं। –

+0

अब * एक अच्छा विचार है। मैं कोशिश करूँगा। –

1

संस्करण 1.8 से शुरू होने पर, Django में अब keepdb नामक एक विकल्प है, जो परीक्षण के दौरान उसी डेटाबेस को पुन: उपयोग करने की अनुमति देता है।

--keepdb विकल्प परीक्षण रनों के बीच परीक्षण डेटाबेस को संरक्षित करने के लिए उपयोग किया जा सकता है।

इसका निर्माण और नष्ट करने दोनों कार्यों को छोड़ने का लाभ है जो परीक्षण चलाने के लिए समय कम कर सकता है, खासतौर पर उन बड़े परीक्षण सूट में।

यदि परीक्षण डेटाबेस मौजूद नहीं है, तो यह पहले रन पर बनाया जाएगा और फिर प्रत्येक बाद के रन के लिए संरक्षित किया जाएगा।

किसी भी अनुपयुक्त माइग्रेशन परीक्षण सूट चलाने से पहले परीक्षण डेटाबेस पर भी लागू किया जाएगा।

यह भी परीक्षण डेटाबेस परीक्षण चलाने से पहले अस्तित्व के लिए के लिए अनुमति देता के बाद से, आप बस एक नया Postgres Heroku उदाहरण आपके dyno को जोड़ सकते हैं और परीक्षण कॉन्फ़िगर कि विशेष रूप से डेटाबेस का उपयोग कर सकते हैं।

बोनस: आप भी failfast विकल्प है, जो जैसे ही आपका पहला परीक्षण दुर्घटनाओं के रूप में बाहर निकलता है, ताकि आप पूरा करने के लिए सभी परीक्षणों के लिए प्रतीक्षा करने की जरूरत नहीं है का उपयोग कर सकते हैं। Heroku CI:

हालांकि, अगर आप Heroku के लिए चीजों की तैनाती कर रहे हैं और आप Heroku पाइपलाइन, एक और भी बेहतर विकल्प उपलब्ध है का उपयोग कर रहे हैं।

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