गतिशील भाषा में मॉक बनाते समय त्रुटियों का पता कैसे लगाया जाएगा?


10

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

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

एक तुच्छ नमूने के साथ अद्यतन (कुछ बना भाषा पर) ...

संस्करण 1:

Calc = {
    doMultiply(x, y) {return x * y}
}
//.... more code ....

// On some faraway remote code on a different file
Rect = {
    computeArea(l, w) {return Calc.doMultipy(x*y)}
}

// test for Rect
testComputeArea() { 
    Calc = new Mock()
    Calc.expect(doMultiply, 2, 30) // where 2 is the arity
    assertEqual(30, computeArea)
}

अब, संस्करण 2 पर:

// I change the return types. I also update the tests for Calc
Calc = {
    doMultiply(x, y) {return {result: (x * y), success:true}}
}

... Rect फिर रनटाइम पर एक अपवाद फेंक देगा, फिर भी परीक्षण अभी भी सफल होगा।


1
अब तक जो उत्तर याद आ रहे हैं, वह यह है कि यह सवाल बदले हुए परीक्षणों से संबंधित नहीं है class X, बल्कि जिन परीक्षणों class Yपर निर्भर करता है Xऔर इस प्रकार उत्पादन के मुकाबले जो चलता है, उससे भिन्न अनुबंध के विरुद्ध परीक्षण किया जाता है।
बार्ट वैन इनगेन शेनौ

मैंने सिर्फ एसओ पर यह सवाल पूछा , डिपेंडेंसी इंजेक्शन के संबंध में। कारण 1 देखें : एक आश्रित वर्ग को रन टाइम में बदला जा सकता है (परीक्षण सोचें) । हम दोनों की मानसिकता समान है लेकिन महान स्पष्टीकरण का अभाव है।
स्कॉट कोट

मैं आपके प्रश्न को फिर से पढ़ रहा हूं लेकिन व्याख्या पर थोड़ा भ्रमित हो रहा हूं। क्या आप एक उदाहरण प्रदान कर सकते हैं?
स्कॉट कोट

जवाबों:


2

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

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

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


2

यदि आपका कोड बदल जाता है और आपके परीक्षण अभी भी पास हो जाते हैं, तो या तो आपके परीक्षणों में कुछ गड़बड़ है (यानी आप एक दावे को याद कर रहे हैं), या कोड वास्तव में नहीं बदला है।

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

लापता अभिकथन से बचने के लिए, आप कोड कवरेज विश्लेषण जैसे उपकरणों का उपयोग कर सकते हैं (यह आपको यह नहीं बताएगा कि आपके कोड के किन भागों का परीक्षण किया गया है, लेकिन यह आपको बताएगा कि निश्चित रूप से किन भागों का परीक्षण नहीं किया गया है), साइक्लोमैटिक जटिलता और एनपीथ जटिलता और उत्परिवर्तन परीक्षकों (जो इस तरह के निर्णायक के रूप में अपने कोड में इंजेक्षन म्यूटेशन (जो आप एक कम कथनों की संख्या पर बाध्य पूर्ण C1 और C2 कोड कवरेज प्राप्त करने की आवश्यकता दे) trueको falseसकारात्मक में, ऋणात्मक संख्याओं, में वस्तुओं nullआदि और क्या है कि जाँच परीक्षण विफल रहता है)।


+1 या तो परीक्षण या कोड के साथ कुछ गलत वास्तव में नहीं बदला। मुझे C ++ / Java के वर्षों बाद उपयोग में लाने में थोड़ा समय लगा। कोड की गतिशील भाषाओं में भागों के बीच का अनुबंध WHAT नहीं होना चाहिए, लेकिन उस चीज़ को जो लौटाया जाता है, उसमें शामिल है और यह क्या कर सकता है।
MrFox

@suslik: वास्तव में, यह स्टैटिक बनाम डायनेमिक भाषाओं के बारे में नहीं है, बल्कि एब्सट्रैक्ट डेटा टाइप्स बनाम ऑब्जेक्ट-ओरिएंटेड डेटा एब्स्ट्रेक्शन का उपयोग करके डेटा एब्स्ट्रेक्शन के बारे में है। एक वस्तु के लिए किसी अन्य वस्तु को अनुकरण करने की क्षमता तब तक होती है जब तक वह अविभाज्य व्यवहार करती है (भले ही वे पूरी तरह से अलग प्रकार के हों और पूरी तरह से अलग वर्गों के उदाहरण हों) ओओ के पूरे विचार के लिए मौलिक है। या दूसरा तरीका रखो: यदि दो वस्तुएं समान व्यवहार करती हैं, तो वे एक ही प्रकार के होते हैं, चाहे उनकी कक्षाएं कुछ भी कहे। अभी तक एक और तरीका रखो: कक्षाएं टाइप नहीं हैं। दुर्भाग्य से, जावा और सी # यह गलत है।
जॉर्ग डब्ल्यू मित्तग

यह मानते हुए कि नकली यूनिट 100% कवर की गई है और इसमें कोई भी कमी नहीं है: कैसे एक और अधिक सूक्ष्म परिवर्तन के बारे में जैसे "फू के लिए अशक्त लौट जाना चाहिए" के लिए "फू के लिए खाली स्ट्रिंग लौटना चाहिए"। यदि कोई व्यक्ति उस इकाई और उसके परीक्षण को बदलता है तो कुछ उपभोग करने वाली इकाइयाँ टूट सकती हैं और नकली होने के कारण यह पारदर्शी है। (और न: लेखन के समय या नकली मॉड्यूल का उपयोग करते हुए, "अनुबंध" के अनुसार, खाली स्ट्रिंग्स को वापसी मान के रूप में संभालना आवश्यक नहीं है क्योंकि यह केवल गैर-रिक्त स्ट्रिंग्स या शून्य को वापस करने के लिए माना जाता है;)। (बातचीत में दोनों मॉड्यूल्स का केवल उचित एकीकरण परीक्षण इसे पकड़ सकता है।)
-कैच-अंततः
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.