কীভাবে একাধিক ফাইলের উপর জাজানো ইউনিট পরীক্ষাগুলি ছড়িয়ে দেওয়া যায়?


126
  • আমার কাছে পাইথন-জাঙ্গো অ্যাপ্লিকেশন রয়েছে
  • আমি ইউনিট পরীক্ষার কাঠামো ব্যবহার করছি
  • পরীক্ষাগুলি মডিউল ডিরেক্টরিতে "টেস্ট.পি" ফাইলটিতে সাজানো হয়
  • আমি পরীক্ষা দিয়ে চালাচ্ছি ./manage.py test app

এখন ..

  • tests.pyফাইল বরং বড় / জটিল হচ্ছে / নোংরা
  • আমি tests.pyপরীক্ষার ছোট সংগ্রহগুলিতে বিভক্ত হতে চাই ...

কিভাবে?

উত্তর:


47

আচরণটি জাঙ্গো ১. 1. এ পরিবর্তিত হয়েছে, সুতরাং প্যাকেজ তৈরি করার দরকার নেই is আপনার ফাইলগুলির নাম দিন test*.py

জাজানো 1.7 নথি থেকে

আপনি যখন পরীক্ষা চালান, পরীক্ষার ইউটিলিটির ডিফল্ট আচরণ হ'ল যে কোনও ফাইলের নাম পরীক্ষার সাথে শুরু হয় সেগুলির মধ্যে সমস্ত পরীক্ষার কেস (এটি ইউনিটেষ্টের সাবক্ল্যাস। টেস্টকেস) সন্ধান করে, সেই পরীক্ষার কেসগুলির মধ্যে থেকে স্বয়ংক্রিয়ভাবে একটি পরীক্ষার স্যুট তৈরি করে, এবং স্যুট চালাতে।

থেকে জ্যাঙ্গো 1.6 ডকুমেন্টেশন ,

পরীক্ষার আবিষ্কার ইউনিটেস্ট মডিউলটির অন্তর্নির্মিত পরীক্ষার আবিষ্কারের উপর ভিত্তি করে। ডিফল্টরূপে, এটি বর্তমান ওয়ার্কিং ডিরেক্টরিতে "টেস্ট * .py" নামে যে কোনও ফাইলের পরীক্ষাগুলি আবিষ্কার করবে।

পূর্ববর্তী আচরণ, জ্যাঙ্গো 1.5 ডকুমেন্টেশন থেকে :

আপনি যখন নিজের পরীক্ষা চালান, তখন পরীক্ষার ইউটিলিটির ডিফল্ট আচরণ হ'ল মডেল.পি এবং টেস্ট.পিতে সমস্ত পরীক্ষার কেস (যা ইউনিটস্টেস্ট.টেষ্টক্যাসের সাবক্লাস) সন্ধান করে, সেই পরীক্ষার কেসগুলির মধ্যে স্বয়ংক্রিয়ভাবে একটি পরীক্ষার স্যুট তৈরি করে, এবং স্যুট চালাতে।

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



2
বর্তমানে ব্যবহার জ্যাঙ্গো 1.10, আমি আমার সব লাগাতে চেয়েছিল test*.pyএকটি ফোল্ডার নামক ফাইল testsফোল্ডারের পরিষ্কার রাখতে - এই সম্ভব, কিন্তু আপনি চলবে ./manage.py test app.testsএবং সব আপেক্ষিক আমদানির একটি স্তর (আপ যেতে হবে from .modelsহয়ে from ..models)।
স্কট স্টিভেন্স

123

নোট করুন যে এই পদ্ধতিটি আর জ্যাঙ্গো 1.6 থেকে বৈধ নয়, এই পোস্টটি দেখুন

আপনি ভিতরে testsদিয়ে ফোল্ডার তৈরি করতে পারেন ___init___.py(যাতে এটি প্যাকেজ হয়ে যায়)। তারপরে আপনি সেখানে আপনার বিভক্ত পরীক্ষা .py ফাইলগুলি যুক্ত করুন এবং সেগুলি সবগুলিতে আমদানি করুন ___init___.py

উদাহরণস্বরূপ: test.pyফাইলটির মতো দেখায় এবং কাজ করে এমন একটি মডিউল দিয়ে ফাইলটি প্রতিস্থাপন করুন:

প্রশ্নযুক্ত testsঅ্যাপের অধীনে একটি ডিরেক্টরি তৈরি করুন

অ্যাপ্লিকেশন
অ্যাপ্লিকেশন \ models.py
অ্যাপ্লিকেশন \ views.py
অ্যাপ্লিকেশন \ পরীক্ষার
অ্যাপ্লিকেশন \ পরীক্ষা \ __ init__.py
অ্যাপ্লিকেশন \ পরীক্ষার \ bananas.py
অ্যাপ্লিকেশন \ পরীক্ষার \ apples.py

সাবমডিউলগুলি এতে আমদানি করুন app\tests\__init__.py:

from bananas import *
from apples import *

এখন আপনি ./manage.py ব্যবহার করতে পারেন যেন তারা সবাই একক ফাইলে থাকে:

./manage.py test app.some_test_in_bananas

1
ডোহ। আপনি যে অ্যাপ্লিকেশনটি পরীক্ষা করছি তার অধীনে একটি 'পরীক্ষার' মডিউল তৈরির অর্থ ছিল; পরীক্ষার নামক কোনও নতুন অ্যাপ্লিকেশন নয়। আমি এটাকে এখন পেলাম. অসাধারণ. ধন্যবাদ!
জন মি

@ জন: আমি আমার উত্তরটি আর চিনতে পারছি না! :-) তবে আপনি সম্পূর্ণরূপে সঠিক যে এটি খুব অস্পষ্ট ছিল, এমনকি সঠিক হলেও - আপনার উদাহরণগুলি এটি পরিষ্কার করে দেয়, আমার মূল শব্দটির বিপরীতে।
টমাসজ জিলিয়াস্কি

2
@ টমাসজ .. আপনার শব্দগুলি এখনও আছে - সম্পূর্ণ অক্ষত। আপনি আমাকে সঠিক ট্র্যাকের উপরে রাখার পর থেকে আমি এটি সামান্য বাইরে নিয়ে এসেছি।
জন মে

@ জন: আপনারা এর অর্থটি বললে আমি মোটেও রেগে যাইনি :) আমার নিজের উত্তরটি কিছুটা ভিন্ন আকারে দেখে মজা পাওয়া গেল
টমাসজ জিয়েলসিস্কি

4
@ জে স্টাইলস, যদি "নিয়মিত জ্যাঙ্গো টেস্ট রানার" দ্বারা বোঝানো হয় python manage.py test myappতবে আসলে এই উত্তরটি ঠিক কাজ করে work (কেবল এটি চেষ্টা করে দেখুন)
কির্ক ওল

27

টমাসজ যেভাবে উত্তর দিয়েছেন তা সঠিক। তবে আমদানিগুলি __init__.pyআপনার ফাইলের কাঠামোর সাথে মিলেছে কিনা তা নিশ্চিত করা ক্লান্তিকর হয়ে উঠতে পারে ।

করতে স্বয়ংক্রিয়ভাবে ফোল্ডারে সমস্ত পরীক্ষার সনাক্ত আপনি এই যোগ করতে পারেন __init__.py:

import unittest

def suite():   
    return unittest.TestLoader().discover("appname.tests", pattern="*.py")

এটি আপনাকে দৌড়তে দেবে ./manage.py test appnameতবে নির্দিষ্ট পরীক্ষাগুলি পরিচালনা করবে না। এটি করতে আপনি এই কোডটি ব্যবহার করতে পারেন (এছাড়াও এতে __init__.py):

import pkgutil
import unittest

for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(module_name).load_module(module_name)
    for name in dir(module):
        obj = getattr(module, name)
        if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
            exec ('%s = obj' % obj.__name__)

এখন আপনি নিজের পরীক্ষা manage.py test appবা নির্দিষ্ট পরীক্ষাগুলির মাধ্যমে চালাতে পারবেনmanage.py test app.TestApples


আপনি দ্বিতীয় টুকরা কোথায় রাখবেন?
rh0dium

উভয় টুকরা __init__.py
--ুকে

মনে রাখবেন যে আপনার পরীক্ষার প্যাকেজটির কোনও নাম যদি শীর্ষ স্তরের মডিউল নামের সাথে মিলিত হয় যা পরীক্ষার সময় আমদানি করা হয়, pkgutil স্নিপেট পরীক্ষাগুলি হিসাবে যুক্ত হওয়ার সাথে সাথে আমদানি ব্যর্থ হতে পারে sys.modules[packagename]delউপরের পরে সমস্যা সৃষ্টি করে এমন যে কোনও একটি দ্রুত কাজ করা উচিত । (অথবা আপনি আপনার ফোল্ডারগুলির নাম পরিবর্তন করতে পারেন;))
পল ফেনি

এটি দুর্দান্ত তবে আমি একটি ত্রুটিতে ছুঁড়েছি যেখানে অ্যাপ্লিকেশন স্তরের পরীক্ষা চলাকালীন ( python manage.py test appName) কোডের দ্বিতীয় বিটটি __path__উপলব্ধ ছিল না এমন একটি ত্রুটি ছুঁড়ে মারবে । আমি এটিকে এটিকে এড়িয়ে if '__path__' in locals():চেক করে দ্বিতীয় স্নিপেটটি একটি চেকের মধ্যে আবৃত করেছিলাম , যা কৌশলটি করেছিল। উত্তর করার জন্য ধন্যবাদ!
alukach

1
+1 এটিও নিশ্চিত করে যে init ফাইলটি সাধারণ কোডিং মানকে মেনে চলে, অর্থাত * * বা অব্যবহৃত আমদানি নেই
মার্টিন বি।

13

কেবল আপনার ডিরেক্টরি কাঠামোটি এটি তৈরি করুন:

myapp/
    __init__.py
    tests/
        __init__.py
        test_one.py
        test_two.py
        ...
    ...

এবং python manage.py test myappপ্রত্যাশা অনুযায়ী কাজ করবে।


5

http://docs.python.org/library/unittest.html#organizing-tests ফাইলগুলিকে মডিউলগুলিতে বিভক্ত করার বিষয়ে কথা বলে এবং এর ঠিক উপরের অংশটিতে একটি উদাহরণ রয়েছে।


2
আরটিএফএমের ওপরে আমি যে 'বিট অতিরিক্ত' খুঁজছি তা হ'ল টেস্টগুলির জন্য জ্যাঙ্গো সেটিংস পরিবেশ, ডাটাবেস এবং ফিক্সচার।
জন মে

2

আরআইকে কিছু কোড করার দরকার নেই। আপনার অ্যাপ্লিকেশনটিতে কেবল একটি উপ-ডিরেক্টরি তৈরি করুন। কেবল প্রয়োজনীয়তা এটির পরীক্ষাগুলি বলা উচিত নয় * উদাহরণস্বরূপ

app/
app/__init_.py
app/serializers.py
app/testing/
app/testing/__init__.py
app/testing/tests_serializers.py

1
কেন আপনি এটিকে এমন কিছু বলতে পারেন না যা "পরীক্ষা" দিয়ে শুরু হয়?
সার্প সি

আমি জাজানো 1.11.4 এর সাথে এই উত্তরটি ব্যবহার করছি। এটি ব্যবহার করার কারণগুলি: (১) "অ্যাপ / টেস্টিং / __ init__.py" ফাইলটি ফাঁকা থেকে যায় এবং (২) কমান্ডটি বেসিক "পাইথন ম্যানেজ.পি টেস্ট অ্যাপ" হিসাবে রয়ে যায়
rprasad

2

জ্যাঙ্গো ২.২ এর সাহায্যে testকোনও অ্যাপের অভ্যন্তরে একটি ফোল্ডার তৈরি করা সহজ এবং মোটামুটি ভাল সমাধান হতে পারে এবং আপনি আপনার সম্পর্কিত test_...pyফাইলগুলিকে __init__.pyএতে testফোল্ডারে যুক্ত করতে পারেন ।


1

আপনার যদি আরও জটিল সেটআপ থাকে, বা from ... import *টাইপ স্টেটমেন্ট ব্যবহার করতে না চান , আপনি suiteআপনার টেস্ট.পি (বা পরীক্ষা / __ init__.py) নামক একটি ফাংশনটি সংজ্ঞায়িত করতে পারেন , যা একটি উদাহরণ দেয় unittest.TestSuite


0

আমি মনে করি ./manage.py testকেবল পরীক্ষার কৌশলগুলি চালিত করে (জাজানো> = 1.7 এ)।

যদি আপনার সাংগঠনিক পরীক্ষাগুলি গ্রুপিং এবং চেরিপিকিং সম্পর্কে হয় এবং আপনি জাঙ্গো নাকnose ব্যবহারের অনুরাগী হন :

python manage.py test another.test:TestCase.test_method

আপনি যদি নাক জানেন তবে আপনার সমস্ত ফাইলের তুলনায় কীভাবে "ওয়াইল্ডকার্ড" করতে হয় তা আপনি জানেন।

পুনশ্চ

এটি কেবল একটি ভাল অনুশীলন। আশা করি এইটি কাজ করবে. উত্তরটি এখান থেকে ধার করা হয়েছিল: আপনার অ্যাপ্লিকেশনটির পরীক্ষা ডিরেক্টরি রয়েছে যখন জাজানোতে একটি নির্দিষ্ট পরীক্ষা মামলা চালানো


0

আমার দুটি ফাইল আছে একটি হ'ল tests.pyঅন্যটি test_api.py। আমি এগুলি নীচের মতো স্বতন্ত্রভাবে চালাতে পারি।

   manage.py test companies.tests
   manage.py test companies.test_api

ফাইল নামকরণ কনভেনশন সম্পর্কে @ oca এর প্রতিক্রিয়া দেখুন।

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