Django 1.7 में इकाई परीक्षण चलाने पर माइग्रेशन अक्षम करें


110

Django 1.7 ने डेटाबेस माइग्रेशन पेश किया ।

Django 1.7 में इकाई परीक्षण चलाते समय, यह एक माइग्रेट को बाध्य करता है , जिसमें एक लंबा समय लगता है। इसलिए मैं django के माइग्रेशन को छोड़ना चाहता हूं, और अंतिम स्थिति में डेटाबेस बनाना चाहता हूं।

मुझे पता है कि पलायन को नजरअंदाज करना एक बुरा अभ्यास हो सकता है, क्योंकि कोड के उस हिस्से का परीक्षण नहीं किया जाएगा। लेकिन ऐसा नहीं है: मैं सीआई परीक्षण सर्वर (जेनकींस) में पूर्ण माइग्रेशन चला रहा हूं। मैं केवल अपने स्थानीय परीक्षणों में माइग्रेशन को छोड़ना चाहता हूं, जहां गति मायने रखती है।


कुछ संदर्भ:

Django 1.6 तक , दक्षिण का उपयोग करते समय, मैंने SOUTH_TESTS_MIGRATE सेटिंग का उपयोग किया :

डिफ़ॉल्ट रूप से, दक्षिण की syncdb कमांड गैर-संवादात्मक मोड में चलने पर भी माइग्रेशन लागू करेगी, जिसमें शामिल हैं जब आप परीक्षण चला रहे हैं - यह हर बार आपके परीक्षण चलाने पर हर माइग्रेशन को चलाएगा।

यदि आप चाहते हैं कि टेस्ट रनर माइग्रेट के बजाय सिंकबॉम्ब का उपयोग करें - उदाहरण के लिए, यदि आपके माइग्रेशन को लागू करने में बहुत लंबा समय लग रहा है - बस SOUTH_TESTS_MIGRATE = सेटिंग में गलत सेट करें।

हालाँकि, अब syncdb मौजूद नहीं है, अब यह माइग्रेट है

और Django 1.8 से मैं --keepdb पैरामीटर का उपयोग करूंगा :

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

तो यह सवाल Django 1.7 तक सीमित है।


मेरा तर्क है कि यूटी के दौरान, आप वास्तव में एक तरह से माइग्रेशन नहीं चला रहे हैं जो उन्हें परीक्षण करता है क्योंकि वे आपके साथ शुरू होने वाले डीबी के साथ गैर-मौजूद हैं। परीक्षण माइग्रेशन वास्तव में केवल तब हो रहा है जब आप किसी मौजूदा डीबी को माइग्रेट कर रहे हैं। यह 1.7 माइग्रेशन व्यवसाय जिंजो के साथ मेरे द्वारा किए गए काठी के तहत पहला वास्तविक गड़गड़ाहट है, लेकिन यह वास्तव में बड़ी अड़चन है। दक्षिण में कम से कम माइग्रेशन के लिए परीक्षण परिदृश्य सही मिला।
नावकाडर

django-test-without-migrationsपैकेज मेरे लिए वास्तव में काम किया गया है, आप के लिए स्वीकार किए जाते हैं जवाब बदलने के लिए चाहते हो सकता है stackoverflow.com/a/28993456/200224
एंडी

यदि संभव हो तो मैं नई निर्भरता को जोड़ने से बचना पसंद करता हूं।
डेविड आर्कोस 7

जवाबों:


79

पर देखो इस समाधान , बर्नी क़यास द्वारा Django डेवलपर्स मेलिंग सूची पर पोस्ट किया:

यदि makemigrations अभी तक चलाया नहीं गया है, तो "माइग्रेट" कमांड एक ऐप को अनमैरिगेट के रूप में मानता है, और मॉडल से सीधे तालिकाओं का निर्माण करता है, जैसे कि syncdb 1.6 में किया था। मैंने "settings_test.py" नामक इकाई परीक्षणों के लिए एक नया सेटिंग मॉड्यूल परिभाषित किया है, जो मुख्य सेटिंग्स मॉड्यूल से * आयात करता है और इसे जोड़ता है:

MIGRATION_MODULES = {"myapp": "myapp.migrations_not_used_in_ests"}

फिर मैं इस तरह परीक्षण चलाता हूं:

DJANGO_SETTINGS_MODULE = "myapp.settings_test" python प्रबंध एफ़टीपी

यह मूर्ख यह सोचकर माइग्रेट करता है कि ऐप अनमीटर्ड है, और इसलिए हर बार एक टेस्ट डेटाबेस बनाया जाता है जो मॉडल-थ्रेड की वर्तमान संरचना को दर्शाता है।

Django 1.9 में, इस स्थिति में कुछ हद तक सुधार हुआ है , और आप मान को Noneनिम्न पर सेट कर सकते हैं :

MIGRATION_MODULES = {"myapp": कोई नहीं}


9
ध्यान दें कि myapp.migrations_not_used_in_testsमॉड्यूल मौजूद नहीं होना चाहिए।
बमीहेलैक

4
मॉड्यूल के बारे में किए गए टिप्‍पणी @bmihelac के अलावा, जो विद्यमान नहीं है, मॉड्यूल स्ट्रिंग में 'माइग्रेशन' का प्रतिस्थापन होना चाहिए, इसके लिए यह देखें: github.com/django/django/blob/stable/1.7.x/django/db/migrations /…
nealtodd

7
MIGRATION_MODULES को गतिशील रूप से settings_test.py में बनाने के लिए एक फ़ंक्शन का सार: gist.github.com/nealtodd/2869341f38f5b1eeb86d
nealbodd

1
स्व। मैं इसकी वजह से अपने यूनिट परीक्षणों को 13 सेकंड से 4 सेकंड तक कम करने में सक्षम था। इसके अलावा, परीक्षण के लिए साइक्लाइट का उपयोग करके अधिक गति प्राप्त की जा सकती है। मेरे लिए, परीक्षणों के लिए पोस्टग्रेज का उपयोग करने में 5.5 सेकंड का समय लग रहा है लेकिन साइक्लाइट को 4 सेकंड का समय लग रहा है।
गैटस्टर

21
@ Nealtodd की जिस्ट की टिप्पणियों से यहां एक समाधान का लिंक दिया गया है जो कुछ नुकसानों से बचा जाता है और सुपर सरल है: gist.github.com/NotSqrt/5f3c76cd15e40efdd09
djsutho

72

यहाँ मेरी सेटिंग फ़ाइल का अंत है:

class DisableMigrations(object):

    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        return None


TESTS_IN_PROGRESS = False
if 'test' in sys.argv[1:] or 'jenkins' in sys.argv[1:]:
    logging.disable(logging.CRITICAL)
    PASSWORD_HASHERS = (
        'django.contrib.auth.hashers.MD5PasswordHasher',
    )
    DEBUG = False
    TEMPLATE_DEBUG = False
    TESTS_IN_PROGRESS = True
    MIGRATION_MODULES = DisableMigrations()

इस पर आधारित स्निपेट के

मैंने केवल तभी माइग्रेशन अक्षम किया जब परीक्षण चल रहे हों


1
अच्छा! मैं __setitem__(self, *_)विधि को भी जोड़ दूंगा क्योंकि हमें उन ऐप्स के साथ समस्या थी जो अपना स्वयं का माइग्रेशन सेट करते हैं जैसे settings.MIGRATION_MODULES['chroniker'] = 'db_migrations'
Zhe Li

1
इसके लिए बहुत बहुत धन्यवाद, यह केवल एक चीज है जो मैंने पाया कि वास्तव में काम करता है।
फुलफिल्स

समानांतर मोड में परीक्षण चलाने पर यह अब Django 1.9 में काम नहीं करता है। सामान्य गैर-समानांतर परीक्षण का उपयोग करते हुए, यह ठीक काम करना जारी रखता है, लेकिन समानांतर मोड में स्विच करने से त्रुटियां होती हैं जो तालिकाओं को नहीं मिल रही हैं।
LS55321

@LeeSemel समानांतर मोड में आप शायद rlmv से समाधान का उपयोग करना चाहते हैं
Guillaume Vincent

@guillaumevincent मुझे समान समस्या है जब समानांतर मोड में django-test-without-migrations का उपयोग करते हुए
LS55321


3

अपडेट : कोई बात नहीं, यह बदलाव 1.10 फाइनल होने से पहले वापस कर दिया गया था। उम्मीद है कि यह भविष्य के संस्करण में वापस आएगा।


ध्यान दें कि Django 1.10 के रूप में यह एक परीक्षण डेटाबेस सेटिंग द्वारा नियंत्रित किया जा सकता है।

विस्थापित

चूक: True

यदि सेट किया जाता है False, तो Django परीक्षण डेटाबेस बनाने के लिए माइग्रेशन का उपयोग नहीं करेगा।


2

https://gist.github.com/apollovy/22826f493ad2d06d9a9a22464730ce0b

MIGRATION_MODULES = {
    app[app.rfind('.') + 1:]: 'my_app.migrations_not_used_in_tests'
    for app in INSTALLED_APPS
}

Stackoverflow में आपका स्वागत है। कृपया दौरे और सहायता केंद्र पर एक नज़र डालें । यह आमतौर पर न केवल एक-पंक्ति-उत्तर प्रदान करने के लिए प्रोत्साहित किया जाता है, बल्कि यह समझाने के लिए भी है कि (आप क्यों सोचते हैं) आपका उत्तर सही है।
बुर्की

1

Django 1.9 के लिए और गिलाइम विंसेंट के जवाब के लिए अब और काम नहीं करता है, इसलिए यहां एक नया समाधान है:

मैं अपनी सेटिंग फ़ाइल में इस स्निपेट का उपयोग कर रहा हूं, की परिभाषा के बाद INSTALLED_APPS

if os.environ.get('TESTS_WITHOUT_MIGRATIONS', False):
    MIGRATION_MODULES = {
        app.split('.')[-1]: None for app in INSTALLED_APPS
    }

यह सभी इंस्टॉल किए गए ऐप्स पर प्रसारित होता है और प्रत्येक में कोई माइग्रेशन मॉड्यूल नहीं होता है। देखें अधिक जानकारी के लिए Django डॉक्स

इस स्निपेट का उपयोग करके आप अपने परीक्षण चला सकते हैं TESTS_WITHOUT_MIGRATIONS, जैसे पर्यावरण चर ,

TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test

1

मैं अभी पता लगाता हूं कि django 1.10 के बाद माइग्रेशन को कैसे अक्षम किया जाए, हो सकता है कि यह किसी के लिए मदद कर सकता है। यहाँ git पर लिंक है

class DisableMigrations(dict):
    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        return None

DATABASES = DisableMigrations()

MIGRATION_MODULES = DisableMigrations()

Django 1.10 के लिए माइग्रेशन में दो भाग हैं, कृपया load_disk और देखें रिकॉर्डर देखें

का हिस्सा load_diskहै कि कम से जोड़ा जा अनुप्रयोग के माइग्रेशन मॉडल के लिए INSTALL_APP और का हिस्सा recorder1.9 से पहले संस्करण के लिए डेटाबेस कनेक्शन के लिए हम सेट की जरूरत MIGRATION_MODULES={'do.not.migrate':'notmigrations'}है जब आप परीक्षण कर रहे हैं अब हम ऐसा कोई भी सेट की जरूरत है MIGRATION_MODULES={'do.not.migrate':None} तो अगर हम किसी भी अनुप्रयोग के लिए मेकअप माइग्रेशन नहीं करना चाहते , बस एक तानाशाही का विस्तार करें और कार्य के Noneलिए लौटें getitem, और वही करें DATABASES, जो आपको करने की आवश्यकता है

पुनश्च: आदेश के लिए, आपको पीपीएस के--setting=module.path.settings_test_snippet बाद निर्दिष्ट करने की आवश्यकता है यदि आप साथ काम कर रहे हैं , तो विकल्प निर्धारित करें , बस का रास्ता जोड़ेंtest pycharm--settingsRun/Debug configurationssettings_test_snippet.py कस्टम सेटिंग में । कि बस ठीक है !!

का आनंद लें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.