अजगर - सिद्धांत बनाम एकमत [बंद]


160

मैं पायथन में इकाई परीक्षण के साथ शुरुआत करने की कोशिश कर रहा हूं और मैं सोच रहा था कि क्या कोई व्यक्ति किसी और के सिद्धांत और नुकसान के बारे में बता सकता है।

आप किन परिस्थितियों के लिए प्रत्येक का उपयोग करेंगे?

जवाबों:


177

दोनों मूल्यवान हैं। मैं सिद्धांत और नाक दोनों का उपयोग करता हूं जो एकमत की जगह लेते हैं। मैं उन मामलों के लिए सिद्धांत का उपयोग करता हूं जहां परीक्षण उपयोग का एक उदाहरण दे रहा है जो वास्तव में प्रलेखन के रूप में उपयोगी है। आम तौर पर मैं इन परीक्षणों को व्यापक नहीं बनाता, पूरी तरह से सूचनात्मक के लिए लक्ष्य। मैं प्रभावी रूप से रिवर्स में doctest का उपयोग कर रहा हूं: मेरे कोड का परीक्षण मेरे सिद्धांत के आधार पर सही नहीं है, लेकिन यह जांचने के लिए कि कोड के आधार पर मेरा प्रलेखन सही है।

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

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


29
बहुत कम बायलरप्लेट है, और मुझे लिखने (और पढ़ने) के लिए परीक्षण बहुत सरल लगते हैं। परीक्षण लिखने के लिए कम स्टार्टअप लागत (यानी सिर्फ एक "test_foo ()" फ़ंक्शन और गो) लिखने से भी आपके परीक्षणों को समाप्त करने से पहले दिलचस्प कोड बिट्स करने के प्रलोभन से लड़ने में मदद मिलती है।
ब्रायन

6
मुझे लगता है कि यह एक शानदार जवाब है।
जेम्स ब्रैडी

आप किन अन्य परीक्षण ढाँचों का उपयोग करते हैं? या यह विशेष रूप से नाक है?
जो

6
इस उत्तर की आयु को देखते हुए, यह संभवतः ध्यान देने योग्य है कि यूनिटेस्ट के पुराने संस्करणों के अधिकांश "बॉयलरप्लेट" काफी हद तक चले गए हैं। मैं अभी भी नाक के रूप में अच्छी तरह से पसंद करता हूं, लेकिन यह बहुत ज्यादा टॉस-अप है।
एडम पार्किं

1
FYI नाक पिछले कई वर्षों से "रखरखाव मोड" में है और संभवतः सभी विकास (अनुपस्थित तृतीय-पक्ष हस्तक्षेप) को समाप्त कर देगा। यह अनुरक्षकों की सलाह है कि नई परियोजनाएं एक विकल्प का उपयोग करें।
छह

48

मैं लगभग विशेष रूप से unittest का उपयोग करता हूं।

एक बार थोड़ी देर में, मैं कुछ सामान को डॉक्टिंग में डाल दूंगा जो कि सबसे महत्वपूर्ण है।

परीक्षण के मामलों में से 95% एकतरफा हैं।

क्यों? मुझे डॉकस्ट्रिंग्स को कुछ हद तक कम और ज्यादा रखना पसंद है। कभी-कभी परीक्षण मामलों में एक डॉकस्ट्रिंग को स्पष्ट करने में मदद मिलती है। अधिकांश समय, एप्लिकेशन के परीक्षण के मामले डॉकस्ट्रिंग के लिए बहुत लंबे होते हैं।


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

33

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


6
+1 मुझसे - उत्कृष्ट बिंदु
dgg

28

मैं एक जैव सूचना विज्ञान के रूप में काम करता हूं, और मेरे द्वारा लिखे गए अधिकांश कोड "एक समय, एक कार्य" स्क्रिप्ट, कोड है जो केवल एक या दो बार चलाया जाएगा और यह एक विशिष्ट कार्य को निष्पादित करेगा।

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

इसके अलावा, सिद्धांत तब उपयोगी होते हैं जब आपको अपनी स्क्रिप्ट किसी ऐसे शोधकर्ता को देनी होती है जो प्रोग्रामिंग में निपुण न हो। कुछ लोगों को यह समझना बहुत मुश्किल है कि कैसे unittests संरचित हैं; दूसरी ओर, सिद्धांत उपयोग के सरल उदाहरण हैं, इसलिए लोग उन्हें केवल कॉपी और पेस्ट करके देख सकते हैं कि उनका उपयोग कैसे करना है।

इसलिए, मेरे उत्तर को फिर से शुरू करने के लिए: सिद्धांत तब उपयोगी होते हैं जब आपको छोटी स्क्रिप्ट लिखनी होती है, और जब आपको उन्हें पास करना होता है या उन शोधकर्ताओं को दिखाना होता है जो कंप्यूटर वैज्ञानिक नहीं हैं।


6
"जब आप छोटी स्क्रिप्ट लिखते हैं, और जब आपको उन्हें पास करना होता है या उन शोधकर्ताओं को दिखाना होता है, जो वैज्ञानिक नहीं होते हैं, तो सिद्धांत उपयोगी होते हैं।" बहुत बढ़िया बिंदु। मैं एक ही काम करता हूं और गैर-पायथन प्रोग्रामर हमेशा आश्चर्यचकित होते हैं कि प्रलेखन निष्पादित किया जा सकता है।
डैनियल कैनस

14

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

मैं unittestआपको सुझाव दूंगा कि यदि आप JUnit या कुछ समान उपयोग करने की पृष्ठभूमि से आ रहे हैं, जहां आप इकाई परीक्षण को आम तौर पर उसी तरह से लिखना चाहते हैं जैसे आप कहीं और कर रहे हैं।


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

7

मैं विशेष रूप से यूनीटेस्ट का उपयोग करता हूं; मुझे लगता है कि मुख्य मॉड्यूल को बहुत ज्यादा क्लैट करते हैं। यह शायद पूरी तरह से परीक्षण लिखने के साथ करना है।


7

दोनों का उपयोग करना एक वैध और सरल विकल्प है। doctestमॉड्यूल प्रदान करता है DoctTestSuiteऔरDocFileSuite तरीकों जो एक मॉड्यूल या फ़ाइल से क्रमशः एक unittest संगत testsuite पैदा करते हैं।

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

लेकिन अधिक जटिल मामलों के लिए, और परीक्षण मामलों के अधिक व्यापक सेट के लिए, मैं यूनीटेस्ट का उपयोग करता हूं जो अधिक नियंत्रण और लचीलापन प्रदान करता है।


7

मैं एकमत के लिए प्रतिस्थापन के रूप में सिद्धांत का उपयोग नहीं करता। हालांकि वे थोड़ा ओवरलैप करते हैं, दो मॉड्यूल में एक ही फ़ंक्शन नहीं है:

  • मैं unittestएक इकाई परीक्षण ढांचे के रूप में उपयोग करता हूं, जिसका अर्थ है कि यह मुझे बाकी कोड पर किसी भी संशोधन के प्रभाव को जल्दी से निर्धारित करने में मदद करता है।

  • मैं doctestएक गारंटी के रूप में उपयोग करता हूं कि टिप्पणियाँ (अर्थात डॉकस्ट्रिंग्स) अभी भी कोड के वर्तमान संस्करण के लिए प्रासंगिक हैं।

परीक्षण संचालित विकास का व्यापक रूप से प्रलेखित लाभ मुझे मिलता है unittestdoctestकोड के रखरखाव को गुमराह करने वाली पुरानी टिप्पणियों के कहीं अधिक सूक्ष्म खतरे को हल करता है।


4

मैं लगभग कभी मत का प्रयोग नहीं करता। मैं चाहता हूं कि मेरा कोड सेल्फ डॉक्यूमेंटिंग हो और डॉकस्ट्रिंग यूजर को डॉक्यूमेंटेशन मुहैया कराए। एक मॉड्यूल में परीक्षणों की सैकड़ों लाइनों को जोड़ने वाला IMO डॉकस्ट्रिंग्स को बहुत कम पठनीय बनाता है। मुझे जरूरत पड़ने पर संशोधित करने के लिए यूनिट परीक्षण भी आसान लगते हैं।


4

Doctestकुछ समय के लिए गलत परिणाम हो सकता है। खासतौर पर जब आउटपुट में एस्केप सीक्वेंस होते हैं। उदाहरण के लिए

def convert():
    """
    >>> convert()
    '\xe0\xa4\x95'
    """
    a = '\xe0\xa4\x95'
    return a
import doctest
doctest.testmod()

देता है

**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
    convert()
Expected:
    'क'
Got:
    '\xe0\xa4\x95'
**********************************************************************
1 items had failures:
   1 of   1 in __main__.convert
***Test Failed*** 1 failures. 

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


5
आप r""" ... """पहली समस्या को ठीक करने के लिए कच्चे docstrings ( ) का उपयोग कर सकते हैं ।
icktoofay

पायथन 3.4 में ठीक काम करता है। इसे पायथन 2.7 में भी काम करने के लिए, '\\xe0\\xa4\\x95'अपने डॉकस्ट्रिंग में उपयोग करें।
सेस टिम्मरमैन

मैंने यह भी पाया है कि यूनिकोड शाब्दिक भी सिद्धांतों के साथ काम नहीं करते हैं (यहां तक ​​कि फ़ाइल के शीर्ष पर सही 'कोडिंग यूटीएफ -8' टिप्पणी लाइन के साथ। आम तौर पर सिद्धांतों को एकतरफा परीक्षणों के रूप में अच्छी तरह से समर्थित नहीं किया जाता है, इसलिए कुछ बग हैं। यह तय नहीं है।
रिचवेल

2

मैं खोज आधारित प्रणालियों ("नाक" और "py.test" को पसंद करता हूं, पूर्व में वर्तमान में उपयोग कर रहा हूं)।

doctest अच्छा है जब परीक्षण एक दस्तावेज के रूप में भी अच्छा है, अन्यथा वे कोड को बहुत अधिक अव्यवस्थित करते हैं।


नाक अविश्वसनीय रूप से उपयोगी लगती है; मुझे अभी तक इसका उपयोग करने का मौका नहीं मिला है, लेकिन मुझे उच्च उम्मीदें मिली हैं :)
टोनी आर्कल्स

IMO का उपयोग करने के लिए नाक सबसे आसान टेस्ट फ्रेमवर्क है। यह लिखने और चलाने के परीक्षण के मामलों को बहुत सहज बनाता है।
कामिल किसल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.