সাধারণ পরীক্ষা ডিরেক্টরি কাঠামো সহ ইউনিটেট চালানো


698

এমনকি সাধারণ পাইথন মডিউলটির জন্য খুব সাধারণ ডিরেক্টরি কাঠামোটি তাদের নিজস্ব testডিরেক্টরিতে ইউনিট পরীক্ষাগুলি পৃথক করে বলে মনে হয় :

new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.

উদাহরণস্বরূপ এই পাইথন প্রকল্পটি দেখুন ।

আমার প্রশ্নটি হ'ল আসলে পরীক্ষা চালানোর স্বাভাবিক উপায়টি কী? আমি সন্দেহ করি এটি আমার ব্যতীত সকলের কাছে সুস্পষ্ট, তবে আপনি কেবল python test_antigravity.pyপরীক্ষা ডিরেক্টরি থেকে চালাতে পারবেন না import antigravityকারণ এটি মডিউলটির পথে না আসায় এটি ব্যর্থ হবে।

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

অন্য বিকল্পটি হ'ল পরীক্ষামূলক ফাইলটি অন্য ডিরেক্টরিতে অনুলিপি করা, তবে এটি কিছুটা বোবা মনে হয় এবং সেগুলি শুরু করার জন্য একটি পৃথক ডিরেক্টরিতে থাকার বিন্দুটি মিস করে।

সুতরাং, আপনি যদি আমার নতুন প্রকল্পটিতে উত্সটি ডাউনলোড করে থাকেন তবে আপনি ইউনিট পরীক্ষাগুলি কীভাবে চালাবেন? আমি এমন একটি উত্তর পছন্দ করব যা আমাকে আমার ব্যবহারকারীদের কাছে বলতে দেবে: "ইউনিট পরীক্ষা চালানোর জন্য এক্স করুন" "


5
@ এমপি যখন আপনাকে অনুসন্ধানের পথটি নির্ধারণ করতে হবে তখন সঠিক সমাধানটি হ'ল ... অনুসন্ধানের পথটি সেট করুন। আপনি কোন ধরণের সমাধানের প্রত্যাশা করছিলেন?
কার্ল মেয়ার

7
@ কার্লমিয়ারের আরও একটি ভাল সমাধান হ'ল নীচেunittest আমার উত্তরে বর্ণিত কমান্ড লাইন ইন্টারফেসটি ব্যবহার করা যাতে আপনাকে ডিরেক্টরিটিতে পথটি যুক্ত করতে না হয়।
পিয়ের

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

উত্তর:


655

আমার মতে সর্বোত্তম সমাধান হ'ল unittest কমান্ড লাইন ইন্টারফেসটি ব্যবহার করা যা ডিরেক্টরিটি এতে যুক্ত করবে sys.pathযাতে আপনার প্রয়োজন নেই ( TestLoaderশ্রেণিতে করা)।

উদাহরণস্বরূপ এই জাতীয় ডিরেক্টরি কাঠামোর জন্য:

new_project
├── antigravity.py
└── test_antigravity.py

আপনি কেবল চালাতে পারেন:

$ cd new_project
$ python -m unittest test_antigravity

আপনার মতো ডিরেক্টরি কাঠামোর জন্য:

new_project
├── antigravity
   ├── __init__.py         # make it a package
   └── antigravity.py
└── test
    ├── __init__.py         # also make test a package
    └── test_antigravity.py

এবং testপ্যাকেজের অভ্যন্তরের পরীক্ষার মডিউলগুলিতে আপনি antigravityপ্যাকেজ এবং এর মডিউলগুলি যথারীতি আমদানি করতে পারেন :

# import the package
import antigravity

# import the antigravity module
from antigravity import antigravity

# or an object inside the antigravity module
from antigravity.antigravity import my_object

একটি একক পরীক্ষা মডিউল চলছে:

একক পরীক্ষার মডিউল চালাতে, এক্ষেত্রে test_antigravity.py:

$ cd new_project
$ python -m unittest test.test_antigravity

পরীক্ষার মডিউলটিকে আপনি যেভাবে আমদানি করেন তেমন রেফারেন্স করুন।

একটি একক পরীক্ষার মামলা বা পরীক্ষার পদ্ধতি চালানো:

এছাড়াও আপনি একটি একক TestCaseবা একক পরীক্ষা পদ্ধতি চালাতে পারেন :

$ python -m unittest test.test_antigravity.GravityTestCase
$ python -m unittest test.test_antigravity.GravityTestCase.test_method

সমস্ত পরীক্ষা চালানো:

আপনি টেস্ট আবিষ্কারও ব্যবহার করতে পারেন যা আপনার জন্য সমস্ত পরীক্ষাগুলি আবিষ্কার করে এবং চালিত করবে, সেগুলি অবশ্যই মডিউল বা নামক প্যাকেজগুলি test*.pyহবে ( -p, --patternপতাকা দিয়ে পরিবর্তন করা যেতে পারে ):

$ cd new_project
$ python -m unittest discover
$ # Also works without discover for Python 3
$ # as suggested by @Burrito in the comments
$ python -m unittest

এটি প্যাকেজের test*.pyঅভ্যন্তরে সমস্ত মডিউল চালাবে test


53
python -m unittest discovertestডিরেক্টরিতে তাদের নাম দেওয়া থাকলে পরীক্ষাগুলি সন্ধান করবে এবং চালাবে test*.py। আপনি যদি সাব-ডাইরেক্টরিটির নাম দিয়েছেন tests, ব্যবহার করুন python -m unittest discover -s testsএবং আপনি পরীক্ষার ফাইলগুলির নাম দিয়েছেন antigravity_test.py, python -m unittest discover -s tests -p '*test.py' ফাইলের নামগুলি আন্ডারস্কোর ব্যবহার করতে পারে তবে ড্যাশগুলি ব্যবহার করতে পারে না।
মাইক 3 ডি0জি

10
ImportError: No module named 'test.test_antigravity'ইউনিটেস্ট লাইব্রেরির পরীক্ষার সাব-মডিউলটির সাথে দ্বন্দ্বের কারণে এটি ত্রুটি সহ পাইথন 3 এ আমার জন্য ব্যর্থ । হতে পারে কোনও বিশেষজ্ঞ উত্তর সাব-ডিরেক্টরিটির নামটি নিশ্চিত করতে এবং পরিবর্তন করতে পারে যেমন, 'পরীক্ষা' (বহুবচন)।
21

9
আমার test_antigravity.pyএখনও উভয়ের জন্য একটি আমদানি ত্রুটি ছোঁড়া import antigravityএবং from antigravity import antigravity, ভাল হিসাবে। আমার দুটি __init_.pyফাইল রয়েছে এবং আমি ডিরেক্টরি python3 -m unittest discoverথেকে কল করছি new project। আর কী ভুল হতে পারে?
imrek

19
ফাইল test/__init__.pyগুরুত্বপূর্ণ এখানে খালি এমনকি যদি
ফ্রাঁসোয়া

3
@ মাইক 3 ডি0 জি এটি নিশ্চিত নয় যে আপনি বোঝাতে চেয়েছিলেন যে ডিরেক্টরিটির নামটি testবিশেষ ... তবে কেবল রেকর্ডের জন্য, এটি নয়। : পি python -m unittest discoverপরীক্ষার ফাইলগুলির tests/পাশাপাশি ঠিক তেমন কাজ করে test/
রায়ান

49

আপনার ব্যবহারকারীদের জন্য সর্বাধিক সহজ সমাধান হ'ল একটি এক্সিকিউটেবল স্ক্রিপ্ট ( runtests.pyবা এমন কিছু) সরবরাহ করা যা প্রয়োজনীয় পরীক্ষার পরিবেশকে বুটস্ট্র্যাপ করে যার মধ্যে যদি প্রয়োজন হয়, আপনার রুট প্রকল্প ডিরেক্টরিটি sys.pathঅস্থায়ীভাবে যুক্ত করা। এটির জন্য পরিবেশের ভেরিয়েবলগুলি সেট করার প্রয়োজন নেই, এটির মতো বুটস্ট্র্যাপ স্ক্রিপ্টে কিছু ভাল কাজ করে:

import sys, os

sys.path.insert(0, os.path.dirname(__file__))

তারপরে আপনার ব্যবহারকারীদের জন্য আপনার নির্দেশাবলী " python runtests.py" এর মতো সহজ হতে পারে ।

অবশ্যই, যদি আপনার সত্যিকারের পথটি os.path.dirname(__file__)প্রয়োজন হয় তবে আপনার এটিকে মোটেও যুক্ত করার দরকার নেই sys.path; পাইথন সর্বদা চলমান স্ক্রিপ্টের ডিরেক্টরিটি সর্বদা শুরুতে রাখে sys.path, সুতরাং আপনার ডিরেক্টরি কাঠামোর উপর নির্ভর করে আপনার runtests.pyসঠিক জায়গায় সন্ধান করা প্রয়োজন যা হতে পারে।

এছাড়াও, পাইথন ২ . +++ (যা পাইথন ২. for এর জন্য ইউনিটস্টেট 2 হিসাবে ব্যাকপোর্ট করা হয়েছে এবং এর আগে ইউনিটেষ্ট মডিউল ) এখন টেস্ট আবিষ্কার অন্তর্নির্মিত রয়েছে, তাই আপনি যদি স্বয়ংক্রিয় পরীক্ষার আবিষ্কার চান তবে নাকের আর প্রয়োজন নেই: আপনার ব্যবহারের নির্দেশাবলীর মতোই সহজ হতে পারে python -m unittest discover


আমি সাব-ফোল্ডারে "মেজর মেজর" এর মতো কিছু পরীক্ষা রেখেছি। তারা পাইথন-মি ইউনিটেস্ট আবিষ্কারের সাথে চালাতে পারে তবে আমি তাদের মধ্যে কেবল একটি চালানোর জন্য কীভাবে নির্বাচন করতে পারি। যদি আমি পাইথন-মি ইউনিটেষ্ট টেস্ট / টেস্টএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স চালাই তবে এটি পথের ইস্যুতে ব্যর্থ। যেহেতু আবিষ্কারের মোড সবকিছু সমাধান করে আমি আশা করব যে হ্যান্ডকোডিং ছাড়াই পাথ সমস্যা সমাধানের জন্য আরও একটি কৌশল আছে যা আপনি প্রথম পয়েন্টে পরামর্শ দেন
ফ্রেডেরিক বাজিন

2
@ ফ্রেডেরিকবাজিন আপনি কেবল একটি একক পরীক্ষা বা পরীক্ষার ফাইল চাইলে আবিষ্কারটি ব্যবহার করবেন না, আপনি যে মডিউলটি চালাতে চান তার নাম দিন। যদি আপনি এটির নাম মডিউল বিন্দু-পথ হিসাবে রাখেন (ফাইল পাথের পরিবর্তে) এটি অনুসন্ধানের পথটি সঠিকভাবে খুঁজে বের করতে পারে। আরও তথ্যের জন্য পিটারের উত্তর দেখুন।
কার্ল মেয়ার

এই হ্যাকটি এমন দৃশ্যে কার্যকর ছিল যেখানে আমাকে এমন কিছু চালাতে হয়েছিল python -m pdb tests\test_antigravity.py। পিডিবি-র ভিতরে, আমি সম্পাদন করেছি sys.path.insert(0, "antigravity")যা আমদানি বিবৃতিটিকে মীমাংসা হিসাবে চালাচ্ছি এমন সমাধান করার অনুমতি দেয়।
ixe013

23

আমি সাধারণত প্রকল্প ডিরেক্টরিতে একটি "রান টেস্ট" স্ক্রিপ্ট তৈরি করি (উত্স ডিরেক্টরি এবং উভয়ই এটির জন্য সাধারণ একটি test) যা আমার "সমস্ত পরীক্ষা" স্যুটটি লোড করে। এটি সাধারণত বয়লারপ্লেট কোড হয়, তাই আমি এটিকে প্রকল্প থেকে প্রকল্পে পুনরায় ব্যবহার করতে পারি।

run_tests.py:

import unittest
import test.all_tests
testSuite = test.all_tests.create_test_suite()
text_runner = unittest.TextTestRunner().run(testSuite)

পরীক্ষা / all_tests.py ( আমি কীভাবে একটি ডিরেক্টরিতে পাইথন ইউনিট পরীক্ষা করব? )

import glob
import unittest

def create_test_suite():
    test_file_strings = glob.glob('test/test_*.py')
    module_strings = ['test.'+str[5:len(str)-3] for str in test_file_strings]
    suites = [unittest.defaultTestLoader.loadTestsFromName(name) \
              for name in module_strings]
    testSuite = unittest.TestSuite(suites)
    return testSuite

এই সেটআপটির সাহায্যে আপনি কেবলমাত্র include antigravityআপনার পরীক্ষার মডিউলগুলি করতে পারেন । খারাপ দিকটি হ'ল নির্দিষ্ট পরীক্ষা চালানোর জন্য আপনার আরও সহায়তা কোডের প্রয়োজন হবে ... আমি প্রতিবারই এগুলি চালাই।


1
আমি প্রকল্প ডিরেক্টরিতে একটি run testsস্ক্রিপ্টও চেয়েছিলাম এবং এটি করার জন্য অনেক পরিষ্কার উপায় খুঁজে পেয়েছি । অত্যন্ত বাঞ্ছনীয়.
z33k

18

আপনি নিবন্ধটি লিঙ্ক করেছেন:

একটি টেস্ট_মডিউলনেম.পি ফাইল তৈরি করুন এবং এতে আপনার ইউনিট টেস্ট রাখুন। যেহেতু পরীক্ষার মডিউলগুলি আপনার কোড থেকে পৃথক ডিরেক্টরিতে রয়েছে তাই আপনার চালনার জন্য আপনার মডিউলটির অভিভাবক ডিরেক্টরিটি আপনার পাইথনপথে যুক্ত করতে হবে:

$ cd /path/to/googlemaps

$ export PYTHONPATH=$PYTHONPATH:/path/to/googlemaps/googlemaps

$ python test/test_googlemaps.py

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

সম্ভবত আপনার নাকের দিকে নজর দেওয়া উচিত?


3
হ্যাঁ এটি কাজ করে (আমার জন্য), তবে আমি সত্যিই সহজ নির্দেশাবলীর জন্য জিজ্ঞাসা করছি যা আমি আমার মডিউলে পরীক্ষাগুলি চালানোর জন্য তাদের দিতে পারি। পাথ পরিবর্তন করা আসলে এটি হতে পারে তবে আমি আরও সোজা-সামনের দিকে কিছু মাছ ধরছি।
মেজর মেজর

4
সুতরাং আপনি একশো প্রকল্পে কাজ করার পরে আপনার অজগর পথটি কেমন দেখাচ্ছে? আমার কি নিজে থেকে প্রবেশ করে আমার পথ পরিষ্কার করার কথা রয়েছে? যদি তাই হয় এটি একটি উদ্ভট নকশা!
jeremyjjbrown

11

আমার পৃথক ইউনিট পরীক্ষার ফোল্ডার সহ একই সমস্যা ছিল with উল্লিখিত পরামর্শগুলি থেকে আমি যোগ পরম উৎস পথ থেকে sys.path

নিম্নলিখিত সমাধানের সুবিধাটি হ'ল, যে কেউ test/test_yourmodule.pyপ্রথমে পরীক্ষা-ডিরেক্টরিতে পরিবর্তন না করেই ফাইলটি চালাতে পারে :

import sys, os
testdir = os.path.dirname(__file__)
srcdir = '../antigravity'
sys.path.insert(0, os.path.abspath(os.path.join(testdir, srcdir)))

import antigravity
import unittest

9

আপনি যদি "পাইথন সেটআপ.পিটি বিকাশ" চালান তবে প্যাকেজটি পথে চলে যাবে। কিন্তু আপনি যে কারণ আপনার সিস্টেম পাইথন ইনস্টলেশন, যা সংক্রমিত পারে না চাইতে পারেন কেন মত সরঞ্জাম virtualenv এবং buildout বিদ্যমান।


7

পাইথন ইউনিটেস্ট মডিউলটির সমাধান / উদাহরণ

নিম্নলিখিত প্রকল্প কাঠামো দেওয়া:

ProjectName
 ├── project_name
 |    ├── models
 |    |    └── thing_1.py
 |    └── __main__.py
 └── test
      ├── models
      |    └── test_thing_1.py
      └── __main__.py

আপনি python project_nameযা ডেকে পাঠাচ্ছেন তার সাহায্যে রুট ডিরেক্টরি থেকে আপনার প্রকল্পটি চালাতে পারেন ProjectName/project_name/__main__.py


python testকার্যকরভাবে চলমানগুলির সাথে আপনার পরীক্ষাগুলি চালাতে ProjectName/test/__main__.py, আপনাকে নিম্নলিখিতগুলি করতে হবে:

1)test/models একটি __init__.pyফাইল যুক্ত করে আপনার ডিরেক্টরিটিকে একটি প্যাকেজে পরিণত করুন। এটি সাব ডিরেক্টরিতে পরীক্ষার কেসগুলিকে পিতামাতার testডিরেক্টরি থেকে অ্যাক্সেসযোগ্য করে তোলে ।

# ProjectName/test/models/__init__.py

from .test_thing_1 import Thing1TestCase        

2) ডিরেক্টরি test/__main__.pyঅন্তর্ভুক্ত করার জন্য আপনার সিস্টেমের পাথটি পরিবর্তন করুন project_name

# ProjectName/test/__main__.py

import sys
import unittest

sys.path.append('../project_name')

loader = unittest.TestLoader()
testSuite = loader.discover('test')
testRunner = unittest.TextTestRunner(verbosity=2)
testRunner.run(testSuite)

এখন আপনি সফলভাবে project_nameআপনার পরীক্ষাগুলি থেকে জিনিসগুলি আমদানি করতে পারেন ।

# ProjectName/test/models/test_thing_1.py    

import unittest
from project_name.models import Thing1  # this doesn't work without 'sys.path.append' per step 2 above

class Thing1TestCase(unittest.TestCase):

    def test_thing_1_init(self):
        thing_id = 'ABC'
        thing1 = Thing1(thing_id)
        self.assertEqual(thing_id, thing.id)

5

ব্যবহারের setup.py developআপনার কাজ ডিরেক্টরিতে ইনস্টল পাইথন পরিবেশ অংশ হতে করতে, তারপর পরীক্ষা চালানো।


এটি invalid command 'develop'আমার কাছে আসে এবং আমি যদি জিজ্ঞাসা করি তবে এই বিকল্পটির উল্লেখ নেই setup.py --help-commands। এটি setup.pyকাজ করার জন্য নিজেই কিছু থাকার দরকার আছে ?
মেজর মেজর

এটি ঠিক আছে - সমস্যাটি হ'ল আমি import setuptoolsআমার setup.pyফাইল থেকে একটি অনুপস্থিত । তবে আমি অনুমান করি যে এটি অন্য ব্যক্তির মডিউলগুলির জন্য সর্বদা কাজ করবে না তা দেখাতে পারে।
মেজর মেজর

1
আপনার যদি পাইপ থাকে তবে আপনি এটি "সম্পাদনযোগ্য" মোডে আপনার প্যাকেজটি ইনস্টল করতে ব্যবহার করতে পারেন : pip install -e .এটি একইভাবে উত্সটি অনুলিপি না করে পাইথন পরিবেশে প্যাকেজটি যুক্ত করে, যেখানে এটি রয়েছে সেখানে সম্পাদনা চালিয়ে যাওয়ার অনুমতি দেয়।
এরিক স্মিথ

pip install -e .হুবহু একই জিনিসটি python setup.py develop, এটি আপনার setup.pyসেটআপটুলগুলি ব্যবহার করতে কেবল বানিকেপ্যাচ করে যদি এটি বাস্তবে না হয় তবে এটি কোনওভাবেই কাজ করে।
কার্ল মেয়ার

5

আপনি যদি ভিএস কোড ব্যবহার করেন এবং আপনার পরীক্ষাগুলি আপনার প্রকল্পের মতো একই স্তরে অবস্থিত তবে আপনার কোডটি চলমান এবং ডিবাগ করা বাক্সের বাইরে চলে না। আপনি যা করতে পারেন তা হ'ল আপনার লঞ্চ.জসন ফাইলটি পরিবর্তন করুন:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python",
            "type": "python",
            "request": "launch",
            "stopOnEntry": false,
            "pythonPath": "${config:python.pythonPath}",
            "program": "${file}",
            "cwd": "${workspaceRoot}",
            "env": {},
            "envFile": "${workspaceRoot}/.env",
            "debugOptions": [
                "WaitOnAbnormalExit",
                "WaitOnNormalExit",
                "RedirectOutput"
            ]
        }    
    ]
}

এখানে মূল লাইনটি envFile

"envFile": "${workspaceRoot}/.env",

আপনার প্রকল্পের মূলে .env ফাইল যুক্ত করুন

আপনার .env ফাইলের অভ্যন্তরে আপনার প্রকল্পের মূলকে যুক্ত করুন। এটি সাময়িকভাবে যুক্ত হবে

কোনো PYTHONPATH = সি: \ আপনার \ পাইথন \ প্রকল্প \ ROOT_DIRECTORY

আপনার প্রকল্পের পথে এবং আপনি ভিএস কোড থেকে ডিবাগ ইউনিট পরীক্ষাগুলি ব্যবহার করতে সক্ষম হবেন


5

আমি লক্ষ্য করেছি যে আপনি যদি আপনার "src" ডিরেক্টরি থেকে ইউনিটেট কমান্ড লাইন ইন্টারফেসটি চালান, তবে আমদানিগুলি কোনও পরিবর্তন ছাড়াই সঠিকভাবে কাজ করে।

python -m unittest discover -s ../test

যদি আপনি এটি আপনার প্রকল্প ডিরেক্টরিতে একটি ব্যাচ ফাইলে রাখতে চান তবে আপনি এটি করতে পারেন:

setlocal & cd src & python -m unittest discover -s ../test

5

আমার দীর্ঘদিন ধরে একই সমস্যা ছিল। আমি সম্প্রতি যা চয়ন করেছি তা হল নিম্নলিখিত ডিরেক্টরি কাঠামো:

project_path
├── Makefile
├── src
   ├── script_1.py
   ├── script_2.py
   └── script_3.py
└── tests
    ├── __init__.py
    ├── test_script_1.py
    ├── test_script_2.py
    └── test_script_3.py

এবং __init__.pyপরীক্ষার ফোল্ডারের স্ক্রিপ্টে আমি নিম্নলিখিতটি লিখি:

import os
import sys
PROJECT_PATH = os.getcwd()
SOURCE_PATH = os.path.join(
    PROJECT_PATH,"src"
)
sys.path.append(SOURCE_PATH)

প্রকল্পটি ভাগ করে নেওয়ার জন্য অত্যন্ত গুরুত্বপূর্ণ হ'ল মেকফাইল, কারণ এটি স্ক্রিপ্টগুলি সঠিকভাবে চালনা করে। এই আদেশটি আমি মেকফাইলে রেখেছি:

run_tests:
    python -m unittest discover .

মেকফাইলটি কেবল যে কমান্ডটি চালিত হয় তার কারণে নয় এটি এটি যেখান থেকে চালিত হয় সেই কারণেও গুরুত্বপূর্ণ । আপনি যদি পরীক্ষায় সিডি করতেন এবং করেন python -m unittest discover ., এটি কাজ করবে না কারণ ইউনিট_সেটস- এ init স্ক্রিপ্টটি os.getcwd () কল করে, যা তখন ভুল পরম পথটি নির্দেশ করে (এটি সিস্টেপথ যুক্ত হবে এবং আপনি অনুপস্থিত থাকবেন) আপনার উত্স ফোল্ডার)। স্ক্রিপ্টগুলি যেহেতু আবিষ্কার করে সমস্ত পরীক্ষার সন্ধান করে তবে এটি সঠিকভাবে চালিত হবে না। সুতরাং Makefile আছে এই সমস্যাটি মনে না এড়াতে।

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

আপনারা যদি এটি পছন্দ করেন তবে আমাকে জানান।

আশা করি এইটি কাজ করবে,


4

নিম্নলিখিত আমার প্রকল্প কাঠামো:

ProjectFolder:
 - project:
     - __init__.py
     - item.py
 - tests:
     - test_item.py

আমি সেটআপ () পদ্ধতিতে আমদানি করা আরও ভাল করে দেখেছি:

import unittest
import sys    

class ItemTest(unittest.TestCase):

    def setUp(self):
        sys.path.insert(0, "../project")
        from project import item
        # further setup using this import

    def test_item_props(self):
        # do my assertions

if __name__ == "__main__":
    unittest.main()

4

আসলে পরীক্ষা চালানোর স্বাভাবিক উপায় কী

আমি পাইথন ৩..2.২ ব্যবহার করি

cd new_project

pytest test/test_antigravity.py

পাইস্ট ইনস্টল করতে :sudo pip install pytest

আমি কোনও পাথের পরিবর্তনশীল সেট করিনি এবং আমার আমদানি একই "পরীক্ষা" প্রকল্পের কাঠামোর সাথে ব্যর্থ হচ্ছে না।

আমি এই জিনিস মন্তব্য: if __name__ == '__main__'এই মত:

test_antigravity.py

import antigravity

class TestAntigravity(unittest.TestCase):

    def test_something(self):

        # ... test stuff here


# if __name__ == '__main__':
# 
#     if __package__ is None:
# 
#         import something
#         sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))
#         from .. import antigravity
# 
#     else:
# 
#         from .. import antigravity
# 
#     unittest.main()

4

নির্বাচিত বা সমস্ত পরীক্ষার দ্বারা চালিত র‌্যাপার ব্যবহার করা সম্ভব।

এই ক্ষেত্রে:

./run_tests antigravity/*.py

বা সমস্ত পরীক্ষা চালানোর জন্য পুনরাবৃত্তভাবে গ্লোববিং ( tests/**/*.py) সক্ষম করুন (দ্বারা সক্ষম shopt -s globstar) করুন।

মোড়ক মূলত argparseযুক্তিগুলি পার্স করতে ব্যবহার করতে পারে:

parser = argparse.ArgumentParser()
parser.add_argument('files', nargs='*')

তারপরে সমস্ত পরীক্ষা লোড করুন:

for filename in args.files:
    exec(open(filename).read())

তারপরে এগুলিকে আপনার টেস্ট স্যুটে (ব্যবহার করে inspect) যুক্ত করুন:

alltests = unittest.TestSuite()
for name, obj in inspect.getmembers(sys.modules[__name__]):
    if inspect.isclass(obj) and name.startswith("FooTest"):
        alltests.addTest(unittest.makeSuite(obj))

এবং তাদের চালান:

result = unittest.TextTestRunner(verbosity=2).run(alltests)

পরীক্ষা করে দেখুন এই আরো বিস্তারিত জানার জন্য উদাহরণ।

আরও দেখুন: ডিরেক্টরিতে সমস্ত পাইথন ইউনিট পরীক্ষা চালানো কীভাবে?


4

পাইথন 3+

@ পিয়ারে যুক্ত করা হচ্ছে

unittestএই জাতীয় ডিরেক্টরি কাঠামো ব্যবহার করে :

new_project
├── antigravity
   ├── __init__.py         # make it a package
   └── antigravity.py
└── test
    ├── __init__.py         # also make test a package
    └── test_antigravity.py

পরীক্ষা মডিউল চালানোর জন্য test_antigravity.py:

$ cd new_project
$ python -m unittest test.test_antigravity

বা একটি একক TestCase

$ python -m unittest test.test_antigravity.GravityTestCase

বাধ্যতামূলক ভুলেও ভুলবেন না __init__.pyঅন্যথায় কাজ করবে না।


2

আপনি কিছু ভুডো ছাড়াই প্যারেন্ট ডিরেক্টরি থেকে আমদানি করতে পারবেন না। এখানে আরও একটি উপায় যা কমপক্ষে পাইথন ৩.6 নিয়ে কাজ করে।

প্রথমে, নিম্নলিখিত বিষয়বস্তু সহ একটি ফাইল পরীক্ষা / প্রসঙ্গ.পি করুন:

import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

তারপরে টেস্ট / টেস্ট_অ্যান্টিগ্রাভিটি.পি ফাইলের মধ্যে নিম্নলিখিত আমদানি করুন:

import unittest
try:
    import context
except ModuleNotFoundError:
    import test.context    
import antigravity

নোট করুন যে ক্লজ ব্যতীত এই চেষ্টা করার কারণটি

  • আমদানি টেস্টকন্টেক্সট ব্যর্থ হয় যখন "পাইথন টেস্ট_অ্যান্টিগ্রাভিটি.পি" এবং দিয়ে চালানো হয়
  • নতুন_প্রজেক্ট ডিরেক্টরি থেকে "পাইথন-মি ইউনিটেস্ট" দিয়ে চালিত হলে আমদানি প্রসঙ্গ ব্যর্থ হয়।

এই কৌশল দিয়ে তারা দুজনেই কাজ করে।

এখন আপনি টেস্ট ডিরেক্টরিতে সমস্ত পরীক্ষা ফাইলগুলি এর সাথে চালাতে পারেন :

$ pwd
/projects/new_project
$ python -m unittest

অথবা এর সাথে একটি পৃথক পরীক্ষা ফাইল চালান:

$ cd test
$ python test_antigravity

ঠিক আছে, টেস্ট_অ্যান্টিগ্রাভিটি.পি-র মধ্যে কনটেক্সট.পি.এর বিষয়বস্তু রাখার চেয়ে এটি খুব সুন্দর নয়, তবে কিছুটা হলেও। পরামর্শ স্বাগত জানাই।


2

যদি আপনার পরীক্ষার ডিরেক্টরিতে একাধিক ডিরেক্টরি থাকে তবে আপনাকে প্রতিটি ডিরেক্টরিতে একটি __init__.pyফাইল যুক্ত করতে হবে।

/home/johndoe/snakeoil
└── test
    ├── __init__.py        
    └── frontend
        └── __init__.py
        └── test_foo.py
    └── backend
        └── __init__.py
        └── test_bar.py

তারপরে একবারে প্রতিটি পরীক্ষা চালাতে, চালান:

python -m unittest discover -s /home/johndoe/snakeoil/test -t /home/johndoe/snakeoil

সূত্র: python -m unittest -h

  -s START, --start-directory START
                        Directory to start discovery ('.' default)
  -t TOP, --top-level-directory TOP
                        Top level directory of project (defaults to start
                        directory)

1

এই বেস স্ক্রিপ্টটি ফাইল সিস্টেমের যে কোনও জায়গা থেকে পাইথন ইউনিটেস্ট পরীক্ষা ডিরেক্টরি চালাবে, আপনি যে কোনও কার্যনির্বাহী ডিরেক্টরিতে থাকুন না কেন।

কাজ ./srcবা ./exampleডিরেক্টরি ডিরেক্টরিতে থাকার সময় এটি দরকারী এবং আপনার দ্রুত ইউনিট পরীক্ষা প্রয়োজন:

#!/bin/bash

this_program="$0"
dirname="`dirname $this_program`"
readlink="`readlink -e $dirname`"

python -m unittest discover -s "$readlink"/test -v

test/__init__.pyউত্পাদনের সময় আপনার প্যাকেজ / মেমরি-ওভারহেড বোঝা করার জন্য কোনও ফাইলের দরকার নেই ।


1

এই ভাবে আপনাকে কমান্ড লাইন থেকে সিস্টেম ভেরিয়েবলের সাথে গোলযোগ না করে আপনি যেখানেই চান পরীক্ষা স্ক্রিপ্টগুলি চালাতে দেবে।

এটি স্ক্রিপ্টের সাথে সম্পর্কিত অবস্থানটি বর্তমান ওয়ার্কিং ডিরেক্টরিটির সাথে সম্পর্কিত নয় বলে পাইথন পাথটিতে মূল প্রকল্প ফোল্ডারটি যুক্ত করে।

import sys, os

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

এটি আপনার সমস্ত পরীক্ষার স্ক্রিপ্টগুলির শীর্ষে যুক্ত করুন। এটি সিস্টেমের পথে মূল প্রকল্প ফোল্ডার যুক্ত করবে, সুতরাং সেখান থেকে যে কোনও মডিউল আমদানি এখন কাজ করবে work আপনি কোথা থেকে পরীক্ষা চালাচ্ছেন তা বিবেচ্য নয়।

আপনার প্রধান প্রকল্প ফোল্ডারের অবস্থানের সাথে মেলে আপনি অবশ্যই প্রজেক্ট_পথ_হ্যাক ফাইলটি পরিবর্তন করতে পারবেন।


0

আপনি যদি কোনও কমান্ড লাইন-কেবল সমাধানের সন্ধান করছেন:

নিম্নলিখিত ডিরেক্টরি কাঠামোর উপর ভিত্তি করে (উত্সর্গীকৃত উত্স ডিরেক্টরি সহ সাধারণীকরণ):

new_project/
    src/
        antigravity.py
    test/
        test_antigravity.py

উইন্ডোজ : (ইন new_project)

$ set PYTHONPATH=%PYTHONPATH%;%cd%\src
$ python -m unittest discover -s test

আপনি যদি লুপের জন্য ব্যাচে এটি ব্যবহার করতে চান তবে এই প্রশ্নটি দেখুন ।

লিনাক্স : (ইন new_project)

$ export PYTHONPATH=$PYTHONPATH:$(pwd)/src  [I think - please edit this answer if you are a Linux user and you know this]
$ python -m unittest discover -s test

এই পদ্ধতির সাহায্যে, প্রয়োজনে পাইথনপথে আরও ডিরেক্টরি যুক্ত করাও সম্ভব।


0

আপনার সত্যই পাইপ সরঞ্জামটি ব্যবহার করা উচিত।

pip install -e .বিকাশ মোডে আপনার প্যাকেজ ইনস্টল করতে ব্যবহার করুন। পাইটেষ্ট দ্বারা প্রস্তাবিত এটি একটি খুব ভাল অনুশীলন (তাদের ভাল অনুশীলনের ডকুমেন্টেশন দেখুন , যেখানে আপনি দুটি প্রকল্পের বিন্যাস অনুসরণ করতে পারেন)।


কেন এই উত্তরটি নিম্নচোট করুন? আমি গৃহীত উত্তরটি পড়েছি এবং এটি খারাপ ছিল না, pytestতবে স্ট্যাক ট্রেস তথ্য এবং বিশদ বিবরণী ত্রুটির তথ্যের সাথে রঙিন হয়ে আসা কনসোল আউটপুটের কারণে পরীক্ষা চালানো আরও ভাল।
আলিয়াওপি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.