दिलचस्प पोस्ट
टेम्पलेट आर्ग्यूमेंट कटौती यहाँ क्यों काम नहीं कर रहा है? वेबव्यू में एंड्रॉइड कॉलिंग जावास्क्रिप्ट फंक्शन मैं Visual Studio 2015 दुर्घटना का निदान कैसे कर सकता हूं? यह जावास्क्रिप्ट / JQuery सिंटैक्स काम कैसे करता है: (फ़ंक्शन (विंडो, अपरिभाषित) {}) (विंडो)? मैं हस्केल में लिस्प को कैसे लागू कर सकता हूँ? पायथन एचटीएमएल सेंनेटर / स्क्रबर / फिल्टर JQuery का उपयोग करने के लिए एएसपी.नेट को आईडी बदलने से कैसे रोकें JQuery में सीएसवी में निर्यात करें ActiveModel :: ForbiddenAttributesError नया उपयोगकर्ता बनाते समय जावा कन्स्ट्रक्टर इनहेरिटन्स पेलिकन 3.3 पेलिकन-क्विकस्टार्ट त्रुटि "मान त्रुटि: अज्ञात स्थान: यूटीएफ -8" मार्जिन-गिरने को अक्षम कैसे करें? एंड्रॉइड इन्टेंट में यूआरएल को उत्तर दें फाइल या असेंबली को लोड नहीं किया जा सका 'न्यूटॉन्सफ्ट। जेसन, संस्करण = 4.5.0.0, संस्कृति = तटस्थ, पब्लिककेय टोकन = 30 एडी 4 एफ 6 बी 2 ए 6 ए' मैं सबसे हाल ही में किए गए आदेश के अनुसार जीआईटी की शाखाओं की एक सूची कैसे प्राप्त करूं?

ठेठ परीक्षण निर्देशिका संरचना के साथ एकजुट चल रहा है

एक साधारण पायथन मॉड्यूल के लिए बहुत ही सामान्य निर्देशिका संरचना इकाई परीक्षण को अपनी test निर्देशिका में अलग करने के लिए लगता है:

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

उदाहरण के लिए, यह पायथन परियोजना कैसे देखें

मेरा प्रश्न बस वास्तव में परीक्षण चलाने का सामान्य तरीका है? मुझे संदेह है यह मेरे अलावा हर किसी के लिए स्पष्ट है, लेकिन आप परीक्षण डायरेक्टरी से सिर्फ python test_antigravity.py नहीं चला सकते क्योंकि इसकी import antigravity विफल हो जाएगी क्योंकि मॉड्यूल पथ पर नहीं है।

मैं जानता हूं कि मैं पीथोनपाथ और अन्य खोज पथ से संबंधित ट्रिक्स को संशोधित कर सकता हूं, लेकिन मुझे विश्वास नहीं हो सकता कि यह सबसे सरल तरीका है – अगर आप डेवलपर हैं लेकिन यह आपके लिए उपयोग करने की अपेक्षा करने के लिए यथार्थवादी नहीं है, तो वे ठीक से परीक्षण करना चाहते हैं गुजर।

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

इसलिए, अगर आपने अपनी नई परियोजना को सिर्फ स्रोत डाउनलोड किया है तो आप यूनिट परीक्षण कैसे चलाएंगे? मैं एक जवाब पसंद करता हूं जो मुझे अपने उपयोगकर्ताओं को बताएगा: "यूनिट परीक्षण चलाने के लिए एक्स करें"

वेब के समाधान से एकत्रित समाधान "ठेठ परीक्षण निर्देशिका संरचना के साथ एकजुट चल रहा है"

मेरी राय में सबसे अच्छा समाधान है कि 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 flag से बदला जा सकता है):

 $ cd new_project $ python -m unittest discover 

यह test पैकेज के अंदर सभी test*.py मॉड्यूल चलाएगा।

अपने उपयोगकर्ताओं के लिए सबसे सरल समाधान एक निष्पादन योग्य स्क्रिप्ट ( runtests.py या कुछ ऐसा) प्रदान करना है जो आवश्यक परीक्षण वातावरण को बूटस्ट्रैप करता है, जिसमें आवश्यक है, यदि आपकी रूट परियोजना निर्देशिका को sys.path को अस्थायी रूप से जोड़ना यह उपयोगकर्ताओं को पर्यावरण चर सेट करने की आवश्यकता नहीं है, ऐसा कुछ बूटस्ट्रैप स्क्रिप्ट में ठीक काम करता है:

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

तब आपके उपयोगकर्ताओं के लिए आपके निर्देश "अजगर runtests.py" के रूप में सरल हो सकते हैं

बेशक, यदि आपको वास्तव में पथ की जरूरत है os.path.dirname(__file__) , तो आपको इसे sys.path पर जोड़ने की आवश्यकता नहीं है; पायथन हमेशा sys.path की शुरुआत में वर्तमान चल रहे स्क्रिप्ट की निर्देशिका को डालता है, इसलिए आपकी निर्देशिका संरचना के आधार पर, सही स्थान पर अपने runtests.py पता लगाने की आवश्यकता हो सकती है।

इसके अलावा, पायथन 2.7+ में (जो कि पायथन 2.6 और पहले के लिए unittest2 के तौर पर बैकपोर्ट किया गया है) में यूनिटस्ट मॉड्यूल में अब परीक्षण की खोज बिल्ट-इन है, इसलिए यदि आप स्वचालित परीक्षण की खोज चाहते हैं तो आपके नाक को अब आवश्यक नहीं है: आपके उपयोगकर्ता निर्देश सरल हो सकते हैं "अजगर -म एकजुट खोज"

आपके द्वारा लिखे गए लेख से:

एक test_modulename.py फ़ाइल बनाएं और उसमें अपने सबसे सरल परीक्षण करें। चूंकि परीक्षण मॉड्यूल आपके कोड से एक अलग निर्देशिका में हैं, आपको उन्हें चलाने के लिए अपने मॉड्यूल की मूल निर्देशिका को अपने PYTHONPATH में जोड़ना पड़ सकता है:

 $ cd /path/to/googlemaps $ export PYTHONPATH=$PYTHONPATH:/path/to/googlemaps/googlemaps $ python test/test_googlemaps.py 

अंत में, पायथन के लिए एक और अधिक लोकप्रिय इकाई परीक्षण ढांचा है (यह महत्वपूर्ण है!), नाक नाक को आसान बनाने में मदद करता है और अंतर्निहित यूनिटस्ट फ्रेमवर्क का विस्तार (उदाहरण के लिए, आप स्वचालित रूप से अपना परीक्षण कोड ढूंढ सकते हैं और आपके लिए PYTHONPATH सेटअप कर सकते हैं), लेकिन यह मानक पायथन वितरण के साथ शामिल नहीं है।

शायद आपको नाक को दिखाना चाहिए जैसा कि इससे पता चलता है?

मैं आमतौर पर प्रोजेक्ट डायरेक्टरी में एक "रन टेस्ट" स्क्रिप्ट बना देता हूं (जो कि स्रोत डायरेक्टरी और test दोनों के लिए सामान्य है) जो मेरे "ऑल टेस्ट" सूट को लोड करता है यह आमतौर पर बॉयलरप्लेट कोड है, इसलिए मैं इसे प्रोजेक्ट से प्रोजेक्ट में पुन: उपयोग कर सकता हूं।

run_tests.py:

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

test / 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 कर सकते include antigravity । नकारात्मक पक्ष यह है कि आपको किसी विशेष परीक्षण को निष्पादित करने के लिए अधिक सहायता कोड की ज़रूरत होगी … मैं सिर्फ हर बार उनको चलाता हूं

यदि आप "अजगर setup.py विकास" चलाते हैं तो पैकेज पथ में होगा। लेकिन आप ऐसा नहीं करना चाह सकते हैं क्योंकि आप अपने सिस्टम अजगर अधिष्ठापन को संक्रमित कर सकते हैं, यही वजह है कि वर्चुअलएन्व और बिल्डआउट जैसी उपकरण मौजूद हैं।

अपने कार्यशील निर्देशिका को स्थापित पायथन वातावरण का हिस्सा बनाने के लिए setup.py develop का उपयोग करें, फिर परीक्षण चलाएं

मुझे एक ही समस्या थी, एक अलग यूनिट परीक्षण फ़ोल्डर के साथ। उल्लिखित सुझावों से मैं sys.path लिए पूर्ण स्रोत पथ sys.path

निम्न समाधान का लाभ यह है, कि कोई फ़ाइल test/test_yourmodule.py को पहले परीक्षण-निर्देशिका में बदलकर चला सकता है:

 import sys, os testdir = os.path.dirname(__file__) srcdir = '../src/projekt/dir' sys.path.insert(0, os.path.abspath(os.path.join(testdir, srcdir))) import yourmodule import unittest 

यदि आप वीएस कोड का उपयोग करते हैं और आपके परीक्षण उसी स्तर पर स्थित होते हैं जैसे आपकी परियोजना चल रही है और डिबग करें आपका कोड बॉक्स से बाहर काम नहीं करता है। आप अपने लॉन्च को बदल सकते हैं। जेसन फ़ाइल बदल सकते हैं:

 { "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 = C: \ अपने \ अजगर \ परियोजना \ ROOT_DIRECTORY

आपके प्रोजेक्ट का पथ और आप वी.एस. कोड से डीबग यूनिट टेस्ट का उपयोग करने में सक्षम होंगे

पायथन यूनिटस्ट मॉड्यूल के लिए समाधान / उदाहरण

निम्नलिखित परियोजना संरचना को देखते हुए:

 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 कॉल ProjectName/project_name/__main__.py


python test साथ अपने परीक्षण चलाने के python test , ProjectName/test/__main__.py प्रभावी ढंग से चलाना, आपको निम्नलिखित करना होगा:

1) एक __init__.py फ़ाइल जोड़कर एक पैकेज में अपनी test/models निर्देशिका को चालू करें। यह उप निर्देशिका के भीतर परीक्षण मामलों को अभिभावक test निर्देशिका से सुलभ बनाता है।

 # ProjectName/test/models/__init__.py from .test_thing_1 import Thing1TestCase 

2) project_name निर्देशिका को शामिल करने के लिए test/__main__.py में अपने सिस्टम पथ को संशोधित करें 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) 

निम्नलिखित मेरी परियोजना संरचना है:

 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() 

वास्तव में परीक्षण चलाने का सामान्य तरीका क्या है

मैं पायथन 3.6.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() 

आवरण का उपयोग करना संभव है जो चयनित या सभी परीक्षणों को चलाता है।

उदाहरण के लिए:

 ./run_tests antigravity/*.py 

या सभी परीक्षणों को चलाने के लिए फिर से globbing का उपयोग करें ( tests/**/*.py shopt -s globstar ) ( shopt -s globstar द्वारा सक्षम)।

आवरण मूल रूप से argparse का उपयोग 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) 

अधिक जानकारी के लिए इस उदाहरण की जांच करें ।

यह भी देखें: डायरेक्टरी में सभी पायथन यूनिट टेस्ट को कैसे चलाएं?

मैंने देखा है कि यदि आप अपने "src" निर्देशिका से unittest कमांड लाइन इंटरफ़ेस चलाते हैं, तो आयात संशोधन के बिना ठीक से काम करता है।

 python -m unittest discover -s ../test 

यदि आप इसे अपनी प्रोजेक्ट डायरेक्टरी में बैच फ़ाइल में रखना चाहते हैं, तो आप यह कर सकते हैं:

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

आपको वास्तव में पीआईपी उपकरण का उपयोग करना चाहिए।

अपने पैकेज को विकास मोड में स्थापित करने के लिए pip install -e का उपयोग करें। यह एक बहुत अच्छा अभ्यास है

नीचे दिए गए रेफरी यूआरएल में, 2 क्लासिक परियोजना (परीक्षण के साथ) लेआउट दिए गए हैं, आप उनमें से किसी का अनुसरण कर सकते हैं।

रेफरी :