वाक्यविन्यास स्तर पर भाषा का परीक्षण समर्थित सुविधा क्यों नहीं है?


37

आप अपने स्रोत कोड के यूनिट परीक्षण के लाभों को बढ़ावा देने वाले ब्लॉगों, लेखों और वेबसाइटों की एक अंतहीन सूची पा सकते हैं । यह लगभग गारंटी है कि जावा, सी ++, सी # और अन्य टाइप की गई भाषाओं के लिए कंपाइलरों को प्रोग्राम करने वाले डेवलपर्स ने अपने काम को सत्यापित करने के लिए यूनिट टेस्टिंग का इस्तेमाल किया।

तो क्यों, अपनी लोकप्रियता के बावजूद, इन भाषाओं के वाक्य विन्यास से अनुपस्थित परीक्षण कर रहा है?

Microsoft ने LINQ को C # में पेश किया , इसलिए वे परीक्षण भी क्यों नहीं जोड़ पाए?

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

एक उदाहरण के रूप में: हम जानते हैं कि आप बयान forके वाक्यविन्यास के बिना एक लूप लिख सकते हैं for। आप इस्तेमाल कर सकते हैं whileया if/ gotoबयान। किसी ने फैसला किया कि एक forबयान अधिक कुशल था और इसे एक भाषा में पेश किया।

प्रोग्रामिंग भाषाओं के समान विकास का परीक्षण क्यों नहीं किया गया?


24
क्या वाक्यविन्यास को जोड़कर किसी भाषा विनिर्देश को और अधिक जटिल बनाना बेहतर है, क्योंकि सरल नियमों के साथ एक भाषा को डिजाइन करने का विरोध किया जा सकता है जिसे आसानी से एक सामान्य तरीके से बढ़ाया जा सकता है?
KChaloux

6
"सिंटैक्स स्तर पर" से आपका क्या तात्पर्य है? क्या आपके पास कोई विवरण / विचार है कि इसे कैसे लागू किया जाएगा?
एसजुआन76

21
क्या आप एक सिंटैक्स-समर्थित सुविधा के रूप में परीक्षण का एक छद्म कोड उदाहरण दे सकते हैं? मैं यह देखने के लिए उत्सुक हूं कि आपको क्या लगता है कि यह कैसा दिखेगा।
FrustratedWithFormsDesigner

12
@FrustratedWithFormsDesigner एक उदाहरण के लिए D भाषा देखें
डोभाल

4
बिल्ट-इन यूनिट टेस्टिंग फीचर्स के साथ एक और भाषा रस्ट है।
सेबस्टियन रेडल

जवाबों:


36

कई चीजों के साथ, लाइब्रेरी स्तर पर इकाई परीक्षण का सबसे अच्छा समर्थन किया जाता है, न कि भाषा के स्तर पर। विशेष रूप से, C # में कई यूनिट टेस्टिंग लाइब्रेरी उपलब्ध हैं, साथ ही ऐसी चीजें जो नेट .NET फ्रेमवर्क की तरह मूल हैं Microsoft.VisualStudio.TestTools.UnitTesting

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

उदाहरण

  • Nunit - सामान्य उद्देश्य, मुहावरेदार डिजाइन की गई इकाई परीक्षण रूपरेखा जो C # भाषा सुविधाओं का पूरा लाभ उठाती है।

  • Moq - एक रिकॉर्ड / प्लेबैक रूपक के बिना लैम्बडा एक्सप्रेशन और एक्सप्रेशन ट्री का पूरा फायदा उठाने वाला मॉकिंग फ्रेमवर्क।

अन्य कई विकल्प हैं। Microsoft Fakes जैसे लाइब्रेरीज़ "शिम ..." मोक्स बना सकते हैं जिन्हें आपको इंटरफेस या वर्चुअल तरीकों का उपयोग करके अपनी कक्षाएं लिखने की आवश्यकता नहीं है।

Linq एक भाषा सुविधा नहीं है (नाम के बावजूद)

Linq एक पुस्तकालय की सुविधा है। हमें मुफ्त में C # भाषा में बहुत सारी नई सुविधाएँ मिलीं, जैसे लैम्ब्डा एक्सप्रेशन और एक्सटेंशन मेथड, लेकिन Linq का वास्तविक कार्यान्वयन .NET फ्रेमवर्क में है।

वहाँ कुछ वाक्य रचना चीनी है कि सी # के लिए जोड़ा गया था linq बयान क्लीनर बनाने के लिए, लेकिन उस चीनी linq का उपयोग करने के लिए आवश्यक नहीं है।


1
मैं इस बात से सहमत हूं कि LINQ कोई भाषा विशेषता नहीं है, लेकिन LINQ को बनाने के लिए कुछ अंतर्निहित भाषा सुविधाएँ होने की आवश्यकता है - विशेष रूप से जेनरिक और डायनामिक प्रकार।
व्यट बार्नेट

@YattBarnett: हां, और एक ही यूनिट परीक्षण के लिए सच है - प्रतिबिंब और विशेषताओं की तरह।
डॉक्टर ब्राउन

8
LINQ को लैम्ब्डा और एक्सप्रेशन ट्री की आवश्यकता होती है। जेनरिक पहले से ही C # में थे (और .Net सामान्य तौर पर, वे CLR में मौजूद हैं), और गतिशीलता का LINQ से कोई लेना-देना नहीं है; आप गतिशील के बिना LINQ कर सकते हैं।
आर्थर वैन लीउवेन जू

पर्ल का DBIx :: क्लास LINQ की तरह की कार्यक्षमता का एक उदाहरण है, जिसे लागू करने के लिए आवश्यक सभी विशेषताओं के 10 से अधिक वर्षों के बाद भाषा में किया गया है।
स्लीपबेटमैन

2
@ Carson63000 मुझे लगता है कि आप varकीवर्ड के साथ संयोजन में अनाम प्रकार का मतलब :)
M.Mimpen

21

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

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

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

हालाँकि, मुझे लगता है कि एक महान इकाई परीक्षण पुस्तकालय कुछ तरीकों को खोजने और उन्हें चलाने की तुलना में बहुत अधिक करता है। उदाहरण के लिए हास्केल का क्विकचेक लें , जो आपको "सभी एक्स और वाई के लिए" जैसी चीजों का परीक्षण करने देता है f (x, y) == f (y, x)। क्विकचेक को एक इकाई परीक्षण जनरेटर के रूप में बेहतर रूप से वर्णित किया गया है और आपको "इस इनपुट के लिए, मैं इस आउटपुट की उम्मीद कर रहा हूं" की तुलना में उच्च स्तर पर चीजों का परीक्षण करने की अनुमति देता है। QuickCheck और Linq सभी अलग-अलग नहीं हैं - वे दोनों डोमेन-विशिष्ट-भाषाएं हैं। इसलिए यूनिट टेस्टिंग सपोर्ट के लिए एक भाषा पर बोलिंग करने के बजाय, डीएसएलएस को व्यावहारिक बनाने के लिए आवश्यक सुविधाओं को क्यों न जोड़ें? आप न केवल इकाई परीक्षण, बल्कि एक बेहतर भाषा के परिणामस्वरूप समाप्त करेंगे।


3
.Net दुनिया में बने रहने के लिए, FsCheck है, जो C # से उपयोग के लिए कुछ सहायकों के साथ, QuickCheck का F # का एक बंदरगाह है।
1938 में आर्थर वैन लीउवेन जू

.NET दुनिया में रहने के लिए? इस सवाल का .NET से कोई लेना देना नहीं है।
माइल्स राउत

@MilesRout C # .NET का एक हिस्सा है। प्रश्न और उत्तर C # के बारे में अक्सर बात करते हैं, और प्रश्न LINQ के बारे में भी बात करता है।
ज़ाचरी डॉव

प्रश्न .NET या C # को टैग नहीं किया गया है।
मील्स राउत

@ माइल्सटाउट यह सच हो सकता है, लेकिन आप यथोचित रूप से यह नहीं कह सकते कि इसका इससे कोई लेना- देना नहीं है क्योंकि इसमें टैग नहीं है। :)
ज़ाचरी डॉव

13

क्योंकि परीक्षण, और विशेष रूप से परीक्षण-संचालित विकास, एक गहन काउंटर-सहज ज्ञान युक्त घटना है।

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

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

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


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

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

@ रॉबर्ट: केवल एक चीज जिसे मैं देख रहा हूं वह ओवरस्टेट्स है "धार्मिक परीक्षण धीरे-धीरे अधिक मुख्यधारा बन रहा है" अगर धीरे-धीरे भौगोलिक समय के फ्रेम के संदर्भ में परिभाषित किया जाता है तो वह शायद बहुत दूर नहीं है ..... :)
मैट्नज

+1 अपनी वर्तमान नौकरी में, मैं नए पुस्तकालयों और उपलब्ध तकनीकों के साथ विकास के नजरिए में ज्वारीय बदलाव से प्रभावित हूं। मेरे करियर में पहली बार, ये लोग मुझे एक और अधिक परिष्कृत विकास प्रक्रिया का उपयोग करने के लिए व्याख्यान दे रहे हैं , मेरे बजाय यह महसूस कर रहे हैं कि मैं हवा में चिल्लाते हुए पहाड़ी की चोटी पर हूं। मैं मानता हूँ कि इन दृष्टिकोणों को मूल भाषा सिंटैक्स में अभिव्यक्ति मिलने से पहले बस समय की बात है।
रोब

1
क्षमा करें, एक और विचार फिर से: रॉबर्ट हार्वे की टिप्पणी। अभी टाइप सिस्टम एक अच्छी जांच है, लेकिन वास्तव में प्रकारों पर बाधाओं को परिभाषित करने में आश्चर्यजनक रूप से कमी आती है - वे इंटरफ़ेस को संबोधित करते हैं, लेकिन सही व्यवहार नहीं करते हैं। (अर्थात 1 + 1 == 3 संकलन करेगा, लेकिन + के कार्यान्वयन के आधार पर सत्य हो सकता है या नहीं भी हो सकता है) मुझे आश्चर्य है कि अगर अगली प्रवृत्ति में अधिक अभिव्यंजक प्रकार के सिस्टम देखने को मिलेंगे जो गठबंधन करते हैं जिसे हम अब यूनिट परीक्षण मानते हैं।
रोब

6

परीक्षण के लिए बहुत सारी भाषाओं का समर्थन है। सी के दावे परीक्षण हैं कि कार्यक्रम विफल हो सकता है। यही कारण है कि अधिकांश भाषाएं बंद हो जाती हैं, लेकिन एफिल और हाल ही में एडा 2012 में प्रीविनिएरवेंट्स हैं (चीजों को एक फ़ंक्शन के लिए तर्क पास करना होगा) और पोस्टिनवरिएंट्स (एक फ़ंक्शन का आउटपुट पास करना होगा), एडा प्रारंभिक तर्कों को संदर्भित करने की क्षमता की पेशकश के साथ। postinvariant। Ada 2012 भी प्रकार के आक्रमणकारियों की पेशकश करता है, इसलिए जब भी कोई विधि Ada वर्ग पर कॉल की जाती है, तो वापसी से पहले प्रकार के हमलावर की जाँच की जाती है।

यह पूर्ण-प्रकार के परीक्षण का प्रकार नहीं है जो एक अच्छा परीक्षण ढाँचा आपको दे सकता है, लेकिन यह एक महत्वपूर्ण प्रकार का परीक्षण है जो भाषाएं सबसे अच्छा समर्थन कर सकती हैं।


2
एफिल में थोड़ा काम करने और मुखर होने के एक व्यापक उपयोगकर्ता होने के नाते, मेरा अनुभव यह रहा है कि आप जो कुछ भी कर सकते हैं वह प्रकृति में संविदात्मक है जो बहुत सारे कीड़ों को बाहर निकालने में मदद करता है।
ब्लरफुल

2

जोरदार टाइप की गई कार्यात्मक भाषाओं के कुछ समर्थकों का तर्क होगा कि ये भाषा सुविधाएँ यूनिट परीक्षणों की आवश्यकता को कम या समाप्त कर देती हैं।

दो, इमो, इसके लिए इसका अच्छा उदाहरण यहां और यहां फन और प्रॉफिट के लिए एफ # से है

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


2

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

उदाहरण के लिए, C # में इकाई परीक्षण मुख्य रूप से विशेषताओं का उपयोग करके संचालित होता है। कस्टम विशेषताओं सुविधा एक अमीर विस्तार प्रणाली है कि तरह बातें दोहराएं और प्रतिस्पर्धा करने के लिए NUnit की तरह चौखटे की अनुमति देता है प्रदान करता है, सिद्धांत आधारित और Parameterized परीक्षण।

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

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

अन्य प्रासंगिक पढ़ने:

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