इकाई परीक्षण सांख्यिकीय रूप से टाइप किए गए कार्यात्मक कोड


15

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

मैं अपनी समझ से यह पूछता हूं:

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

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

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

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

जब आप ऐसी प्रोग्रामिंग शैली का उपयोग करते हैं, जिसके लिए आप यूनिट परीक्षणों का उपयोग करते हैं और क्यों (अपने कोड के लिए आपको क्या उम्मीद है) क्या गुणवत्ता है? या दूसरा तरीका दौर: क्या आपके पास मापदंड हैं जिनके द्वारा आप स्टेटिक विश्लेषक द्वारा कवर किए गए अनुसार सांख्यिकीय रूप से टाइप किए गए कार्यात्मक कोड की एक इकाई को अर्हता प्राप्त कर सकते हैं और इसलिए बिना यूनिट टेस्ट कवरेज की आवश्यकता के?


4
वैसे, अगर आपने क्विकचेक की कोशिश नहीं की है , तो आपको निश्चित रूप से करना चाहिए।
जॉन पुरडी 1

scalacheck.org , Scala के बराबर है
V-Lamp

जवाबों:


8

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

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

हालाँकि आपके कोड में y के बजाय x (दोनों के निर्देशांक) का उपयोग करने जैसी एक साधारण गलती को कवर नहीं किया जा सकता है। हालाँकि परीक्षण कोड लिखते समय ऐसी गलती भी हो सकती है, इसलिए मुझे यकीन नहीं है कि यह प्रयास के लायक है।

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

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

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


5

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

यह बहुत संभावना नहीं है कि आप पूरी तरह से अपने विनिर्देशों को प्रकार की बाधाओं के रूप में व्यक्त करने में सक्षम होंगे ।

जब आप ऐसी प्रोग्रामिंग शैली का उपयोग करते हैं, तो आप इकाई परीक्षणों का उपयोग किस विस्तार से करते हैं और क्यों (आप अपने कोड के लिए क्या उम्मीद करते हैं) क्या गुणवत्ता है?

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

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


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

1

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

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

कार्यों में उपयोग किए जाने वाले कार्यों का मजाक करना भी संभव है; या तो फ़ंक्शन (निर्भरता इंजेक्शन के समतुल्य) में उन्हें पारित करके, या ब्रायन मैरिक की मिडजे जैसी रूपरेखा के साथ ।


0

हां, इकाई परीक्षणों में पहले से ही सांख्यिकीय रूप से टाइप किए गए कार्यात्मक कोड के साथ समझ है। एक सरल उदाहरण:

prop_encode a = (decode . encode $ a) == a

आप prop_encodeस्थैतिक प्रकार के साथ मजबूर कर सकते हैं ।

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