জাজানো ১.7 এ ইউনিট পরীক্ষা চলাকালীন মাইগ্রেশন অক্ষম করুন


110

জাজানো ১. 1. ডেটাবেস মাইগ্রেশন চালু করেছে ।

জাজানো ১. 1. এ ইউনিট পরীক্ষা চালানোর সময়, এটি একটি মাইগ্রেশনকে বাধ্য করে, এতে দীর্ঘ সময় লাগে takes তাই আমি জাজানো স্থানান্তরগুলি এড়িয়ে চূড়ান্ত অবস্থায় ডেটাবেস তৈরি করতে চাই।

আমি জানি যে মাইগ্রেশন উপেক্ষা করা একটি খারাপ অভ্যাস হতে পারে, কারণ কোডের সেই অংশটি পরীক্ষা করা হবে না। তবে সেটি নয়: আমি সিআই পরীক্ষার সার্ভারে (জেনকিন্স) পুরো মাইগ্রেশন চালাচ্ছি। আমি কেবলমাত্র আমার স্থানীয় পরীক্ষাগুলিতে মাইগ্রেশনগুলি এড়িয়ে যেতে চাই যেখানে গতির বিষয়টি গুরুত্বপূর্ণ।


কিছু প্রসঙ্গ:

জ্যাঙ্গো 1.6 অবধি , দক্ষিণ ব্যবহার করার সময়, আমি SOUTH_TESTS_MIGRATE সেটিংটি ব্যবহার করেছি :

ডিফল্টরূপে, দক্ষিণের সিঙ্কডিবি কমান্ডটি মাইগ্রেশনগুলি প্রয়োগ করে যদি এটি অ-ইন্টারেক্টিভ মোডে চালিত হয়, যার মধ্যে রয়েছে আপনি যখন পরীক্ষা চালাচ্ছেন - এটি প্রতিবার আপনার পরীক্ষা চালানোর সময় প্রতি মাইগ্রেশন চলবে।

আপনি যদি চান যদি পরীক্ষার রানার মাইগ্রেটের পরিবর্তে সিঙ্কডিবি ব্যবহার করতে পারেন - উদাহরণস্বরূপ, যদি আপনার মাইগ্রেশনগুলি প্রয়োগ করতে খুব বেশি সময় নিচ্ছে - কেবল SOUTH_TESTS_MIGRATE = সেটিংস.পিটিতে মিথ্যা সেট করুন।

তবে সিঙ্কডিবি আর বিদ্যমান নেই, এখন এটি স্থানান্তরিত

এবং জাজানো ১.৮ থেকে আমি --কিপিডিবি প্যারামিটারটি ব্যবহার করব :

--Keepdb বিকল্পটি টেস্ট রানের মধ্যে টেস্ট ডাটাবেস সংরক্ষণ করতে ব্যবহার করা যেতে পারে। এটি ক্রিয়া এবং ধ্বংস উভয় ক্রিয়া ছাড়াই সুবিধা অর্জন করে যা পরীক্ষাগুলি চালনার সময় হ্রাস করে বিশেষত বৃহত পরীক্ষার স্যুটগুলিতে। যদি পরীক্ষার ডাটাবেসটি বিদ্যমান না থাকে তবে এটি প্রথম রানে তৈরি করা হবে এবং তারপরে প্রতিটি পরবর্তী রানের জন্য সংরক্ষণ করা হবে। পরীক্ষা স্যুট চালানোর আগে যে কোনও প্রয়োগহীন মাইগ্রেশন পরীক্ষার ডাটাবেসে প্রয়োগ করা হবে।

সুতরাং এই প্রশ্নটি জাজানো 1.7 এর মধ্যে সীমাবদ্ধ।


আমি যুক্তি দিয়েছিলাম যে ইউটি-র চলাকালীন, আপনি সত্যিকার অর্থে মাইগ্রেশনগুলি এমনভাবে চালাচ্ছেন না যেহেতু আপনি যে ডিবি দিয়ে শুরু করেছিলেন তা অস্তিত্বহীন is মাইগ্রেশন পরীক্ষা করা কেবলমাত্র তখনই ঘটে যখন আপনি কোনও বিদ্যমান ডিবি স্থানান্তর করছেন। এই 1.7 মাইগ্রেশন ব্যবসায়টি জ্যাঙ্গোর সাথে আমার যে স্যাডল ছিল তার অধীনে প্রথম আসল বিড়াল, তবে এটি সত্যিই বড় বিরক্তিকর। অন্তত মাইগ্রেশনগুলির জন্য সঠিকভাবে টেস্টিংয়ের দৃশ্য পেল South
নৌকা কোডার

django-test-without-migrationsপ্যাকেজ আমার জন্য সত্যিই সুবিধাজনক হয়েছে, আপনি এ গৃহীত উত্তর পরিবর্তন করতে চাইতে পারেন stackoverflow.com/a/28993456/200224
অ্যান্ডি

আমি যদি সম্ভব হয় তবে নতুন নির্ভরতা যুক্ত করা এড়ানো পছন্দ করি।
ডেভিড

উত্তর:


79

জাজানো বিকাশকারীদের মেইলিং লিস্টে বার্নি সিম্পশন পোস্ট করা এই কাজের দিকটি দেখুন:

যদি মেকমিগ্রেশনগুলি এখনও চালানো না যায়, "মাইগ্রেট" কমান্ডটি কোনও অ্যাপকে অনিরাপদ হিসাবে বিবেচনা করে এবং সিঙ্কডিবি-র মত 1.6-তে যেমন মডেলগুলি থেকে সরাসরি টেবিলগুলি তৈরি করে। আমি "সেটিংস_টেষ্ট.পি" নামে পরিচিত ইউনিট পরীক্ষার জন্য একটি নতুন সেটিংস মডিউলটি সংজ্ঞায়িত করেছি, যা মূল সেটিংস মডিউল থেকে * আমদানি করে এবং এই লাইনটি যুক্ত করে:

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

তারপরে আমি এই জাতীয় পরীক্ষা চালাই:

DJANGO_SETTINGS_MODULE = "মাইএপ.সেটেটিং_টেষ্ট" পাইথন ম্যানেজ.পি পরীক্ষা

এই বোকা লোকেরা এই ভাবনায় মাইগ্রেট করে যে অ্যাপটি ইমিগ্রিত করা হয়নি, এবং তাই প্রতিবার পরীক্ষার ডাটাবেস তৈরি হওয়ার সময় এটি মডেল.পাইয়ের বর্তমান কাঠামোকে প্রতিফলিত করে।

জাজানো ১.৯-এ, এই অবস্থার কিছুটা উন্নতি হয়েছে এবং আপনি মানটি সেট করতে পারেন None:

MIGRATION_MODULES = {"মাই্যাপ": কিছুই নেই}


9
নোট করুন যে myapp.migrations_not_used_in_testsমডিউলটি থাকা উচিত নয়।
bmihelac

4
মডিউলটি বিদ্যমান নেই এমন বিষয়ে @ বিমিহেলাক মন্তব্য ছাড়াও, মডিউল স্ট্রিংটিতে অবশ্যই 'মাইগ্রেশন' অন্তর্ভুক্ত থাকতে হবে, কেন তা দেখুন: github.com/django/django/blob/stable/1.7.x/django/db/migration /…
নিলটড্ড


1
TY। এর কারণে আমি আমার ইউনিট পরীক্ষাগুলি 13 সেকেন্ড থেকে 4 সেকেন্ডে হ্রাস করতে সক্ষম হয়েছি। এছাড়াও, পরীক্ষার জন্য স্ক্লাইট ব্যবহার করে আরও গতি লাভ পাওয়া যায়। আমার জন্য, পরীক্ষাগুলির জন্য পোস্টগ্রিজ ব্যবহার করা 5.5 সেকেন্ড সময় নিলেও স্ক্লাইটটি 4 সেকেন্ড সময় নিচ্ছে।
গ্যাটস্টার

21
@ নিলটড্ডের গিস্টের মন্তব্যগুলি থেকে এখানে এমন একটি সমাধানের লিঙ্ক দেওয়া হয়েছে যা কিছু সমস্যাগুলি এড়িয়ে চলে এবং এটি অত্যন্ত সহজ: gist.github.com/NotSqrt/5f3c76cd15e40ef62d09
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'
জে লি

1
এর জন্য আপনাকে অনেক ধন্যবাদ, এটি কেবলমাত্র আমি খুঁজে পেয়েছি যা আসলে কাজ করে।
18-18

সমান্তরাল মোডে পরীক্ষা চালানোর সময় এটি আর জ্যাঙ্গো 1.9 এ কাজ করে না। সাধারণ অ-সমান্তরাল পরীক্ষা ব্যবহার করে এটি সূক্ষ্মভাবে কাজ করে চলেছে, তবে সমান্তরাল মোডে স্যুইচিংয়ের ফলে ত্রুটিগুলি পাওয়া যায় যে টেবিলগুলি খুঁজে পাওয়া যাচ্ছে না।
LS55321

@ লিমসেল সমান্তরাল মোডে আপনি সম্ভবত আরএলএমভি থেকে সমাধানটি ব্যবহার করতে চান
ভিনসেন্ট

সমান্তরাল মোডে
জ্যাঙ্গো


3

আপডেট : কিছু মনে করবেন না, 1.10 চূড়ান্ত প্রকাশের আগে এই পরিবর্তনটি পুনরায় করা হয়েছিল। আশা করি এটি ভবিষ্যতের সংস্করণে ফিরে আসবে।


নোট করুন যে জাঙ্গো ১.১০ হিসাবে এটি একটি পরীক্ষা ডাটাবেস সেটিং দ্বারা নিয়ন্ত্রিত হতে পারে।

মাইগ্রেট

ডিফল্ট: True

যদি সেট করা থাকে False, জাজানো পরীক্ষার ডাটাবেস তৈরি করতে মাইগ্রেশন ব্যবহার করবে না।


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
}

স্ট্যাকওভারফ্লোতে স্বাগতম। দয়া করে কটাক্ষপাত আছে সফর এবং সহায়তা কেন্দ্র । এটি কেবলমাত্র এক-লাইন উত্তর সরবরাহ না করে আপনার উত্তরটি কেন সঠিক (আপনার ধারণা) সঠিক তা ব্যাখ্যা করার জন্য উত্সাহিত করা হয়।
বার্কি

1

জাজানো ১.৯ এর জন্য এবং গিলিয়াম ভিনসেন্টের উত্তর আর কাজ করে না, সুতরাং এখানে একটি নতুন সমাধান দেওয়া হয়েছে:

এর সংজ্ঞা অনুযায়ী আমি আমার সেটিংস ফাইলটিতে এই স্নিপেটটি ব্যবহার করছি INSTALLED_APPS

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

এটি সমস্ত ইনস্টল করা অ্যাপ্লিকেশনগুলিতে পুনরাবৃত্তি করে এবং প্রত্যেকে মাইগ্রেশন মডিউল না হিসাবে চিহ্নিত করে। দেখুন আরও তথ্যের জন্য জ্যাঙ্গো ডক্স

এই স্নিপেট ব্যবহার করে আপনি আপনার পরীক্ষাগুলি চালাতে পারেন, পরিবেশের পরিবর্তনশীল নির্ধারণ করতে পারেন TESTS_WITHOUT_MIGRATIONS, যেমন:

TESTS_WITHOUT_MIGRATIONS=1 ./manage.py test

1

আমি ঠিক বুঝতে পারি কীভাবে জাজানো ১.১০ এর পরে মাইগ্রেশন অক্ষম করবেন, এটি কারওর জন্য সহায়তা হতে পারে। এখানে গিট লিঙ্ক

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

    def __getitem__(self, item):
        return None

DATABASES = DisableMigrations()

MIGRATION_MODULES = DisableMigrations()

জাঙ্গো ১.১০ এর স্থানান্তরের দুটি অংশ রয়েছে, দয়া করে লোড_ডিস্ক এবং রেকর্ডারটি দেখুন at

অংশ 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 PPS আপনার সাথে কাজ করেন, তাহলে pycharm, না সেট --settings এ অপশন Run/Debug configurationsশুধু পথ যোগsettings_test_snippet.py কাস্টম সেটিং এ। ঠিক আছে ঠিক আছে !!

উপভোগ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.