पायथन यूनिट परीक्षण कहाँ जाते हैं?


490

यदि आप एक पुस्तकालय, या एक ऐप लिख रहे हैं, तो यूनिट परीक्षण फाइलें कहां जाती हैं?

परीक्षण फ़ाइलों को मुख्य ऐप कोड से अलग करना अच्छा है, लेकिन ऐप रूट निर्देशिका के अंदर उन्हें "परीक्षण" उपनिर्देशिका में डालना अजीब है, क्योंकि यह उन मॉड्यूल को आयात करना कठिन बनाता है जिनका आप परीक्षण कर रहे हैं।

क्या यहां सबसे अच्छा अभ्यास है?


4
इस प्रश्न के कई स्वीकार्य उत्तर हैं और यह प्रश्नोत्तर साइट के लिए प्रश्न नहीं बनाता है। लोगों को यह समझने की जरूरत है कि एसओ पर सभी महान सहायक प्रश्न नहीं पूछे जा सकते हैं। उसके लिए सूत्र चुनते हैं और हमें उनके नियमों का पालन करना चाहिए।
राउटर जे

121
लोगों को यह भी समझने की जरूरत है कि जब एसओ पृष्ठ Google खोज के लिए एक शीर्ष हिट के रूप में समाप्त होते हैं, तो शायद यह केवल एसओ आधिकारिक सिद्धांत से चिपक के बजाय प्रवाह के साथ जाना बेहतर होता है।
क्रिस्टोफर बार्बर

6
@ChristopherBarber लोगों को यह भी समझने की आवश्यकता है कि निर्णय और आक्रामक समापन क्या एक साइट के रूप में SO भयावह प्रतिष्ठा अर्जित कर रहा है, जब तक कि मैं वास्तव में सवाल नहीं पूछूंगा, वास्तव में कोई बेहतर विकल्प नहीं है।
स्टेफानो बोरिनी

जवाबों:


200

एक फाइल के लिए module.py, test_module.pyPythonic नामकरण सम्मेलनों के बाद, यूनिट परीक्षण को आम तौर पर कहा जाना चाहिए ।

वहाँ कई डाल करने के लिए आमतौर पर स्वीकार किए जाते हैं स्थानों test_module.py:

  1. उसी निर्देशिका में module.py
  2. में ../tests/test_module.py(कोड निर्देशिका के समान स्तर पर)।
  3. में tests/test_module.py(कोड निर्देशिका के तहत एक स्तर)।

मैं परीक्षणों को खोजने और उन्हें आयात करने की अपनी सादगी के लिए # 1 पसंद करता हूं। जो भी निर्माण प्रणाली आप उपयोग कर रहे हैं वह आसानी से शुरू होने वाली फ़ाइलों को चलाने के लिए कॉन्फ़िगर की जा सकती है test_। दरअसल, परीक्षण खोज के लिए उपयोग किया जाने वाला डिफ़ॉल्ट unittestपैटर्न हैtest*.py


12
Load_tests प्रोटोकॉल डिफ़ॉल्ट रूप से परीक्षण * .py नामित फ़ाइलों के लिए खोज करता है। साथ ही, यह शीर्ष Google परिणाम और यह unittest प्रलेखन दोनों test_module.py प्रारूप का उपयोग करते हैं।
dfarrell07

6
जब आप 'test_' से शुरू होने वाली फाइलों का एक गुच्छा नहीं रखते हैं, तो foo_test.py का उपयोग टैब-पूर्णता का उपयोग करते समय एक कीस्ट्रोक या दो को बचा सकता है।
जुनिपर-

11
जब आप कोडिंग कर रहे हों, तो @juniper, आपके विचारों के अनुसरण में mod_test ऑटो पूर्णता में दिखाई देगा। यह भ्रामक या कष्टप्रद हो सकता है।
मेडिएरोस

11
कोड की तैनाती करते समय, हम अपने उत्पादन स्थानों पर परीक्षणों को तैनात नहीं करना चाहते हैं। इसलिए, उन्हें एक निर्देशिका './ests/test_blah.py' में रखना आसान है जब हम तैनाती करते हैं। ALSO में, कुछ परीक्षण नमूना डेटा फ़ाइलों को लेते हैं, और एक परीक्षण निर्देशिका में उन लोगों का होना महत्वपूर्ण है जैसे हम परीक्षण डेटा को तैनात करते हैं।
केविन जे। चावल

1
@ KevinJ.Rice क्या आपको यह परीक्षण नहीं करना चाहिए कि कोड आपके उत्पादन स्थानों पर काम करता है?
एंडोलिथ

67

केवल 1 परीक्षण फ़ाइल

यदि केवल 1 परीक्षण फ़ाइलें हैं, तो इसे शीर्ष-स्तरीय निर्देशिका में रखने की अनुशंसा की जाती है:

module/
    lib/
        __init__.py
        module.py
    test.py

सीएलआई में परीक्षण चलाएं

python test.py

कई परीक्षण फ़ाइलें

यदि कई परीक्षण फ़ाइलें हैं, तो इसे एक testsफ़ोल्डर में रखें:

module/
    lib/
        __init__.py
        module.py
    tests/
        test_module.py
        test_module_function.py
# test_module.py

import unittest
from lib import module

class TestModule(unittest.TestCase):
    def test_module(self):
        pass

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

सीएलआई में परीक्षण चलाएं

# In top-level /module/ folder
python -m tests.test_module
python -m tests.test_module_function

उपयोग unittest discovery

unittest discovery पैकेज फ़ोल्डर में सभी परीक्षण मिल जाएगा।

एक बनाएं __init__.pyमें tests/फ़ोल्डर

module/
    lib/
        __init__.py
        module.py
    tests/
        __init__.py
        test_module.py
        test_module_function.py

सीएलआई में परीक्षण चलाएं

# In top-level /module/ folder

# -s, --start-directory (default current directory)
# -p, --pattern (default test*.py)

python -m unittest discover

संदर्भ

इकाई परीक्षण रूपरेखा


51

एक सामान्य अभ्यास परीक्षण निर्देशिका को उसी मूल निर्देशिका में रखना है जो आपके मॉड्यूल / पैकेज के रूप में है। इसलिए यदि आपके मॉड्यूल को foo.py कहा जाता है तो आपकी निर्देशिका का लेआउट ऐसा दिखेगा:

parent_dir/
  foo.py
  tests/

बेशक ऐसा करने का कोई एक तरीका नहीं है। तुम भी एक परीक्षण उपनिर्देशिका और पूर्ण आयात का उपयोग कर मॉड्यूल आयात कर सकता है

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


16
मैं यह करना चाहता हूं, लेकिन मैं यह काम नहीं कर सकता। परीक्षण चलाने के लिए, मैं parent_dir में हूँ, और टाइप करें: "python test \ foo_test.py", और foo_test.py: "from ..foo इस आयात करें, कि, यह" के साथ विफल "मान:" ValueError: Attempted गैर-पैकेज में सापेक्ष आयात "माता-पिता और परीक्षण दोनों में एक init .py है, इसलिए मुझे यकीन नहीं है कि वे पैकेज क्यों नहीं हैं। मुझे संदेह है कि कमांड लाइन से आपके द्वारा चलाए गए शीर्ष-स्तरीय स्क्रिप्ट को पैकेज का हिस्सा नहीं माना जा सकता है, भले ही यह एक init .py के साथ एक डायर में हो । तो मैं परीक्षण कैसे चलाऊं? मैं आज विंडोज पर काम कर रहा हूं, मेरे सूती मोजे को आशीर्वाद दें।
जोनाथन हार्टले

4
सबसे अच्छा तरीका है - मैंने पाया है- इकाई परीक्षण चलाने के लिए अपने पुस्तकालय / कार्यक्रम को स्थापित करना है और फिर नाक के साथ इकाई परीक्षण चलाना है। मैं virtualenv और virtualenvwrapper को यह बहुत आसान बनाने की सलाह दूंगा।
क्रिस्टियन

@ टार्टले - काम करने के लिए अनुपस्थिति आयात के लिए आपको अपने 'परीक्षण' निर्देशिका में एक init .py फ़ाइल की आवश्यकता है । मेरे पास नाक से काम करने का यह तरीका है, इसलिए मुझे यकीन नहीं है कि आपको परेशानी क्यों हो रही है।
cmcginty

4
धन्यवाद केसी - लेकिन मेरे पास सभी प्रासंगिक निर्देशिकाओं में init .py फ़ाइल है। मुझे नहीं पता कि मैं क्या गलत करता हूं, लेकिन मुझे अपने सभी पायथन प्रोजेक्ट्स पर यह समस्या है और मैं नहीं समझ सकता कि कोई और क्यों करता है। हे प्रिये!
जोनाथन हार्टले

8
मेरी समस्या का एक हल, Python2.6 या नए के साथ, हमें अपनी परियोजना के रूट से परीक्षणों को चलाने के लिए उपयोग करना है: python -m project.package.tests.module_tests (अजगर परियोजना / पैकेज / परीक्षण / मॉड्यूल_tests.py के बजाय) । यह परीक्षण मॉड्यूल की निर्देशिका को पथ पर रखता है, इसलिए परीक्षण तब मॉड्यूल-अंडर-परीक्षण प्राप्त करने के लिए अपनी मूल निर्देशिका के लिए एक सापेक्ष आयात कर सकते हैं।
जोनाथन हार्टले

32

पायथोस्कोप ( https://pypi.org/project/pythoscope/ ) लिखते समय हमारे पास एक ही सवाल था , जो पायथन कार्यक्रमों के लिए यूनिट परीक्षण उत्पन्न करता है। हमने एक सूची को चुनने से पहले लोगों को अजगर सूची में परीक्षण पर रोक दिया, कई अलग-अलग राय थीं। अंत में हमने स्रोत कोड के समान निर्देशिका में "परीक्षण" निर्देशिका डालने का विकल्प चुना। उस निर्देशिका में हम मूल निर्देशिका में प्रत्येक मॉड्यूल के लिए एक परीक्षण फ़ाइल उत्पन्न करते हैं।


2
बहुत बढ़िया! बस कुछ विरासत कोड पर पाइथोस्कोप (महान लोगो) चलाया, और यह आश्चर्यजनक था। त्वरित सर्वोत्तम अभ्यास और आप अन्य डेवलपर्स को अब असफल परीक्षण स्टब्स में भरने के लिए प्राप्त कर सकते हैं। अब इसे बांस में हुक करने के लिए? :)
विल

27

मैं जेरेमी कैंटरेल के ऊपर नोट्स के रूप में फाइल में ही अपना यूनिट टेस्ट देना चाहता हूं, हालांकि मैं मुख्य बॉडी में टेस्ट फंक्शन नहीं डालना चाहता, बल्कि सब कुछ एक में डाल दिया।

if __name__ == '__main__':
   do tests...

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

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

if __name__ == '__main__':
   import tests.thisModule
   tests.thisModule.runtests

यह आपके स्रोत कोड को पढ़ने वाले किसी भी व्यक्ति को यह जानने देता है कि परीक्षण कोड को कहां देखना है।


"नोट्स के ऊपर जेरेमी कैंटरेल के रूप में" कहाँ है?
एंडोलिथ

मुझे काम करने का यह तरीका पसंद है। संपादकों में से सबसे सरल आपकी फ़ाइल को हॉट-की के साथ चलाने के लिए कॉन्फ़िगर किया जा सकता है, इसलिए जब आप कोड देख रहे हों, तो आप परीक्षण को एक पल में चला सकते हैं। दुर्भाग्य से पायथन के अलावा अन्य भाषाओं में यह भयानक लग सकता है, इसलिए यदि आप C ++ या जावा की दुकान में हैं तो आपके सहकर्मी इस पर भड़क सकते हैं। यह कोड कवरेज टूल के साथ भी अच्छा काम नहीं करता है।
कीली

19

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

ऐसा करने का मुख्य कारण है: रिफैक्टरिंग

जब मैं चीजों को इधर-उधर करता हूं तो मैं चाहता हूं कि टेस्ट मॉड्यूल कोड के साथ आगे बढ़ें; यदि वे एक अलग पेड़ में हैं तो परीक्षण खोना आसान है। चलो ईमानदार हो, जितनी जल्दी या बाद में आप पूरी तरह से अलग फ़ोल्डर संरचना के साथ समाप्त हो जाते हैं, जैसे कि django , फ्लास्क और कई अन्य। जो ठीक है अगर आप परवाह नहीं करते हैं।

मुख्य प्रश्न जो आपको स्वयं से पूछना चाहिए वह यह है:

क्या मैं लिख रहा हूँ:

  • a) पुन: प्रयोज्य पुस्तकालय या
  • ख) कुछ अर्ध-पृथक मॉड्यूलों को एक साथ बंडल करने की तुलना में एक परियोजना का निर्माण?

यदि एक:

एक अलग फ़ोल्डर और इसकी संरचना को बनाए रखने के लिए अतिरिक्त प्रयास बेहतर अनुकूल हो सकता है। किसी को भी आपके परीक्षणों के उत्पादन में तैनात होने की शिकायत नहीं होगी ।

लेकिन यह भी परीक्षण के रूप में वितरित करने से आसान है जब उन्हें मूल फ़ोल्डरों के साथ मिलाया जाता है; इसे सेटअप में डालें :

find_packages("src", exclude=["*.tests", "*.tests.*", "tests.*", "tests"]) 

यदि बी:

आप चाहते हैं - जैसा कि हम में से हर कोई करता है - कि आप पुन: प्रयोज्य पुस्तकालय लिख रहे हैं, लेकिन अधिकांश समय उनका जीवन परियोजना के जीवन से जुड़ा होता है। अपनी परियोजना को आसानी से बनाए रखने की क्षमता प्राथमिकता होनी चाहिए।

फिर यदि आपने एक अच्छा काम किया और आपका मॉड्यूल किसी अन्य परियोजना के लिए एक अच्छा फिट है, तो यह संभवतः नकल हो जाएगा - एक नई लाइब्रेरी में कांटा या बना नहीं - इस नए प्रोजेक्ट में, और एक ही फ़ोल्डर संरचना में इसके बगल में ले जाने वाले परीक्षण एक गड़बड़ परीक्षण में मछली पकड़ने की तुलना में आसान है जो एक अलग परीक्षण फ़ोल्डर बन गया था। (आप तर्क दे सकते हैं कि यह पहली जगह में गड़बड़ नहीं होनी चाहिए लेकिन यहां यथार्थवादी होना चाहिए)।

तो विकल्प अभी भी तुम्हारा है, लेकिन मैं तर्क दूंगा कि मिश्रित परीक्षणों के साथ आप एक अलग फ़ोल्डर के साथ सभी समान चीजें प्राप्त करते हैं, लेकिन चीजों को सुव्यवस्थित रखने पर कम प्रयास के साथ।


1
वास्तव में उत्पादन के लिए परीक्षण तैनात करने में क्या समस्या है? मेरे अनुभव में, यह बहुत उपयोगी है: उपयोगकर्ताओं को वास्तव में उनके वातावरण पर परीक्षण चलाने की अनुमति देता है ... जब आपको बग रिपोर्ट मिलती है, तो आप उपयोगकर्ता को यह सुनिश्चित करने के लिए टेस्ट सूट चलाने के लिए कह सकते हैं कि सब कुछ ठीक है और परीक्षण के लिए गर्म पैच भेजें सीधे सूट करें ... इसके अलावा, ऐसा इसलिए नहीं है क्योंकि आपने अपने परीक्षण मॉड्यूल.टेस्ट में डाल दिए हैं कि यह उत्पादन में समाप्त हो जाएगा , जब तक कि आपने अपनी सेटअप फ़ाइल में कुछ गलत नहीं किया है ...
13

2
जैसा कि मैंने अपने उत्तर में लिखा है मैं आमतौर पर अलग-अलग परीक्षण नहीं करता हूं। परंतु। वितरण पैकेज में परीक्षण डालने से सामान का निष्पादन हो सकता है जो आप सामान्य रूप से उत्पादन में नहीं चाहते हैं (जैसे। कुछ मॉड्यूल स्तर कोड)। यह निश्चित रूप से इस बात पर निर्भर करता है कि परीक्षण कैसे लिखे जाते हैं, लेकिन यह सुरक्षित पक्ष पर होने के लिए कि आप उन्हें छोड़ दें, कोई भी गलती से कुछ हानिकारक नहीं चलेगा। मैं वितरण में परीक्षणों को शामिल करने के खिलाफ नहीं हूं, लेकिन मैं समझता हूं कि अंगूठे के नियम के रूप में यह अधिक सुरक्षित है। और उन्हें अलग फ़ोल्डर में डालने से उन्हें डिस्टर्ब में शामिल करना आसान नहीं होता।
Janusz Skonieczny

15

मैं एक tests/निर्देशिका का उपयोग करता हूं , और फिर रिश्तेदार आयात का उपयोग करके मुख्य एप्लिकेशन मॉड्यूल आयात करता हूं । तो MyApp / परीक्षण / foo.py में हो सकता है:

from .. import foo

MyApp.fooमॉड्यूल आयात करने के लिए ।


5
"ValueError: गैर-पैकेज में संबंधित आयात का प्रयास किया गया"
cprn

12

मेरा मानना ​​है कि एक स्थापित "सर्वोत्तम अभ्यास" नहीं है।

मैंने अपना परीक्षण ऐप कोड के बाहर किसी अन्य निर्देशिका में रखा। फिर मैं अपने परीक्षण धावक स्क्रिप्ट (जो कुछ अन्य सामान भी करता है) को सभी परीक्षणों को चलाने से पहले sys.path (आपको कहीं से भी मॉड्यूल आयात करने की अनुमति देता है) में जोड़ देता हूं। इस तरह मुझे कभी भी परीक्षण निर्देशिका को मुख्य कोड से हटाना नहीं पड़ता है, जब मैं इसे जारी करता हूं, तो मुझे समय और प्रयास की बचत होती है, अगर कभी इतनी छोटी राशि।


3
मैं तब sys.path में मुख्य ऐप डायरेक्टरी को जोड़ता हूं । समस्या यह है कि यदि आपके परीक्षणों में कुछ सहायक मॉड्यूल (जैसे टेस्ट वेब सर्वर) हैं और आपको अपने उचित परीक्षणों के भीतर से ऐसे सहायक मॉड्यूल आयात करने की आवश्यकता है।
पियोट्र डोब्रोगॉस्ट

यह मेरे लिए जैसा दिखता है:os.sys.path.append(os.dirname('..'))
मैट एम।

11

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

                              <Main Package>
                               /          \
                              /            \
                            lib           tests
                            /                \
             [module1.py, module2.py,  [ut_module1.py, ut_module2.py,
              module3.py  module4.py,   ut_module3.py, ut_module.py]
              __init__.py]

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


1
मैंने महसूस किया है कि इस दृष्टिकोण का एक संभावित लाभ यह है कि परीक्षणों को अपने स्वयं के स्वतंत्र अनुप्रयोग के रूप में विकसित किया जा सकता है (और शायद संस्करण नियंत्रित भी)। बेशक, हर लाभ के लिए एक नुकसान है - समरूपता बनाए रखना मूल रूप से "डबल एंट्री अकाउंटिंग" कर रहा है, और एक घर के काम को अधिक सक्रिय बनाता है।
जशा

नरम अनुवर्ती प्रश्न: विशेष रूप से फुर्तीली पर्यावरण इस दृष्टिकोण के अनुकूल क्यों है? (यानी चुस्त वर्कफ़्लो के बारे में सममित निर्देशिका संरचना को कितना फायदेमंद बनाता है?)
जशा

11

मैं आपको गीथहब पर कुछ मुख्य पायथन परियोजनाओं की जांच करने और कुछ विचार प्राप्त करने की सलाह देता हूं।

जब आपका कोड बड़ा हो जाता है और आप अधिक पुस्तकालयों को जोड़ते हैं, तो उसी निर्देशिका में एक परीक्षण फ़ोल्डर बनाना बेहतर होता है, जिसमें आपने सेटअप किया है और प्रत्येक परीक्षण प्रकार (unittest, एकीकरण, ...) के लिए अपनी परियोजना निर्देशिका संरचना को दर्पण किया है।

उदाहरण के लिए यदि आपके पास एक निर्देशिका संरचना है जैसे:

myPackage/
    myapp/
       moduleA/
          __init__.py
          module_A.py
       moduleB/
          __init__.py
          module_B.py
setup.py

परीक्षण फ़ोल्डर जोड़ने के बाद आपके पास एक निर्देशिका संरचना होगी:

myPackage/
    myapp/
       moduleA/
          __init__.py
          module_A.py
       moduleB/
          __init__.py
          module_B.py
test/
   unit/
      myapp/
         moduleA/
            module_A_test.py
         moduleB/
            module_B_test.py
   integration/
          myapp/
             moduleA/
                module_A_test.py
             moduleB/
                module_B_test.py
setup.py

कई ठीक से लिखे गए पायथन पैकेज उसी संरचना का उपयोग करते हैं। एक बहुत अच्छा उदाहरण है बोटो पैकेज। Https://github.com/boto/boto की जाँच करें


1
"परीक्षण" के बजाय "परीक्षण" का उपयोग करने की सिफारिश की जाती है, क्योंकि "परीक्षण" मॉड्यूल में एक पायथन बिल्ड है। docs.python.org/2/library/test.html
brodul

हमेशा नहीं .. उदाहरण के लिए matplotlibइसके अंतर्गत है matplotlib/lib/matplotlib/tests( github.com/matplotlib/matplotlib/tree/… ), के sklearnतहत इसे scikitelearn/sklearn/tests( github.com/scikit-learn/scikit-learn/tree-n-sklearn/tests )
alp_989

7

मैं इसे कैसे करूँ...

फ़ोल्डर संरचना:

project/
    src/
        code.py
    tests/
    setup.py

Setup.py, src / के रूप में मेरे प्रोजेक्ट मॉड्यूल वाले स्थान को इंगित करता है, फिर मैं चलाता हूं:

setup.py develop

जो कि मेरी वर्किंग कॉपी की ओर इशारा करते हुए मेरे प्रोजेक्ट को साइट-पैकेज में जोड़ता है। मेरे परीक्षण चलाने के लिए मैं उपयोग करता हूं:

setup.py tests

जो भी परीक्षण धावक का उपयोग करके मैंने कॉन्फ़िगर किया है।


आपको लगता है कि "मॉड्यूल" शब्द को ओवर-राइड किया गया है। अधिकांश पायथन प्रोग्रामर शायद सोचते होंगे कि मॉड्यूल आपके द्वारा कॉल की गई फ़ाइल है code.py। यह शीर्ष स्तर की निर्देशिका "प्रोजेक्ट" को कॉल करने के लिए अधिक समझ में आता है।
ब्लोकले

4

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

  1. सेटप्टूल का उपयोग करें। फिर आप इसमें पास test_suite='tests.runalltests.suite'हो सकते हैं setup(), और बस परीक्षण चला सकते हैं:python setup.py test
  2. परीक्षण चलाते समय PYTHONPATH सेट करें: PYTHONPATH=. python tests/runalltests.py

यहां बताया गया है कि कैसे सामान M2Crypto में कोड द्वारा समर्थित है:

यदि आप nosetests के साथ परीक्षण चलाना पसंद करते हैं तो आपको कुछ अलग करने की आवश्यकता हो सकती है।


3

हम प्रयोग करते हैं

app/src/code.py
app/testing/code_test.py 
app/docs/..

प्रत्येक परीक्षण फ़ाइल में हम सम्मिलित ../src/करते हैं sys.path। यह सबसे अच्छा समाधान नहीं है, लेकिन काम करता है। मुझे लगता है कि यह बहुत अच्छा होगा अगर कोई w / जावा में मावेन की तरह कुछ आया जो आपको मानक सम्मेलनों देता है जो सिर्फ काम करते हैं, चाहे आप किसी भी परियोजना पर काम करें।


1

यदि परीक्षण सरल हैं, तो बस उन्हें डॉकस्ट्रिंग में डाल दें - पायथन के लिए अधिकांश परीक्षण ढांचे का उपयोग करने में सक्षम होंगे:

>>> import module
>>> module.method('test')
'testresult'

अन्य अधिक शामिल परीक्षणों के लिए, मैं उन्हें या तो अंदर ../tests/test_module.pyडालूँगा tests/test_module.py


1

C # में, मैंने आम तौर पर परीक्षणों को एक अलग विधानसभा में अलग किया है।

पायथन में - अब तक - मैं या तो सिद्धांतों को लिखने के लिए गया हूं, जहां परीक्षण एक फ़ंक्शन के डॉकस्ट्रिंग में है, या उन्हें if __name__ == "__main__"मॉड्यूल के निचले भाग में ब्लॉक में रखा गया है।


0

"फू" नामक पैकेज लिखते समय, मैं यूनिट परीक्षणों को एक अलग पैकेज "foo_test" में डालूंगा। मॉड्यूल और उप-पैकेज में SUT पैकेज मॉड्यूल के समान नाम होगा। एक मॉड्यूल foo.xy के लिए परीक्षण foo_test.xy में पाए जाते हैं प्रत्येक परीक्षण पैकेज की __init__.py फाइलें तब एक AllTests सुइट होती हैं जिसमें पैकेज के सभी परीक्षण सूट शामिल होते हैं। setuptools मुख्य परीक्षण पैकेज को निर्दिष्ट करने का एक सुविधाजनक तरीका प्रदान करता है, ताकि "python setup.py" के बाद आप "python setup.py test" या "python setup.py test -s foo_test .x.SomeTestSuite" का उपयोग कर सकें। बस एक विशिष्ट सूट।


0

मैंने अपना परीक्षण उसी निर्देशिका में परीक्षण के तहत कोड (CUT) के रूप में रखा; foo.pyपरीक्षणों के लिए foo_ut.pyया समान होगा। (मैं इन्हें खोजने के लिए परीक्षण खोज प्रक्रिया को ट्विक करता हूं।)

यह डायरेक्टरी लिस्टिंग में कोड के ठीक बगल में परीक्षण करता है, जिससे यह स्पष्ट होता है कि परीक्षण वहीं हैं, और परीक्षणों को खोलना उतना आसान बनाता है जितना संभवत: तब हो सकता है जब वे एक अलग फाइल में हों। (कमांड लाइन के संपादकों के लिए, vim foo*और एक ग्राफिकल फाइलसिस्टम ब्राउज़र का उपयोग करते समय, बस CUT फ़ाइल पर क्लिक करें और फिर तुरंत आसन्न परीक्षण फ़ाइल।)

जैसा कि अन्य लोगों ने बताया है , इससे रिफ्लेक्टर बनाने में आसानी होती है और कहीं और उपयोग के लिए कोड निकालना भी जरूरी है।

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


-2

मैंने हाल ही में पायथन में कार्यक्रम शुरू किया है, इसलिए मुझे अभी तक सर्वश्रेष्ठ अभ्यास का पता लगाने का मौका नहीं मिला है। लेकिन, मैंने एक मॉड्यूल लिखा है जो सभी परीक्षणों को जाता है और उन्हें चलाता है।

तो मेरे पास है:

एप्लिकेशन /
 appfile.py
परीक्षा/
 appfileTest.py

मुझे यह देखना होगा कि जब मैं बड़ी परियोजनाओं की ओर बढ़ता हूं तो यह कैसा होता है।


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