यूनिट परीक्षण पक्ष प्रभाव-भारी कोड


10

मैं एक रोबोट को चलाने के लिए C ++ कोड लिखना शुरू कर रहा हूं, और मुझे नहीं पता कि यूनिट टेस्टिंग को कैसे शामिल किया जाए, अगर वास्तव में मैं कर सकता हूं। मुझे एक पुस्तकालय प्रदान किया गया है जो रोबोट के लिए "कमांड" बनाने की अनुमति देता है, जो स्वचालित रूप से अनुसूचित और निष्पादित होते हैं। तंत्र इन आदेशों को बनाने के लिए एक कमांड आधार वर्ग वे प्रदान उपवर्ग, और लागू आभासी करने के लिए है void Initialize(), void Execute()और void End()तरीकों। ये फ़ंक्शन विशुद्ध रूप से उनके साइड इफेक्ट्स के लिए चलाए जाते हैं, जो कि रोबोट को काम करते हैं (मोटरें चलाते हैं, पिस्टन का विस्तार करते हैं, आदि)। इस वजह से, मैं वास्तव में कहीं भी कोड को इकाई परीक्षणों को संलग्न करने के लिए नहीं देख रहा हूं, पूरे पुस्तकालय का मजाक उड़ा रहा हूं ताकि मैं रोबोट के पहले और बाद में आभासी की जांच कर सकूं। वहाँ इकाई परीक्षण करने के लिए एक तरीका है कि अत्यधिक बोझ नहीं है?

संपादित करें

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


मुझे लगता है कि आप अपने रोबोट को सही करने वाली किसी भी कार्रवाई को पूर्ववत कर सकते हैं? क्या आप अपने परीक्षण की क्रियाओं को पूर्ववत नहीं कर सकते?
नील

1
यह बहुत बुरा है कि पुस्तकालय में वंशानुक्रम के बजाय रचना का उपयोग नहीं किया गया था, क्योंकि आप कमांड क्लास का मजाक उड़ा सकते थे यदि ऐसा होता।
रॉबर्ट हार्वे

@ मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। क्या आप अपने प्रश्न को दोबारा लिख ​​सकते हैं?
विल कूंकल

जवाबों:


7

इस मामले में मैं क्या करूँगा अपने स्वयं के RobotControl इंटरफ़ेस को वास्तविक परिवाद में लोगों के अनुरूप तरीकों के साथ पेश करना।

ऐसा करने के बाद, मैं एक RobotControlImpl वर्ग बनाऊंगा जो वास्तविक रोबोट के खिलाफ इस इंटरफ़ेस को लागू करता है।

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

इस तरह से आप RobotControl को मॉक कर सकते हैं, किसी भी कमांड को मॉक पास कर सकते हैं और सत्यापित कर सकते हैं कि इसने इंटरफ़ेस पर सही तरीके को बुलाया।

ठेस में आप रोबोटकंट्रोल के असली इम्प्लान्ट को पास करेंगे जो आपने कार्यान्वित किया था।

मुझे यकीन नहीं है कि यह वही है जो आपके दिमाग में था और बोझिल माना जाता था?

संपादित करें: ओह, और यदि आप उम्मीद करते हैं कि आदेश पूरा होने की प्रतीक्षा करने के लिए नींद आए (दुःस्वप्न, लेकिन कभी-कभी यह आपके पास है), तो मुझे आदेशों की आवश्यकता होगी ताकि रोबोटकंट्रोल पर एक नींद की विधि को कॉल किया जा सके। इस तरह आप परीक्षण के दौरान नींद को निष्क्रिय कर सकते हैं और बस यह सत्यापित कर सकते हैं कि कमांड सोने की कोशिश करता है।


2
+1। इंटरफ़ेस पसंद नहीं है? अपना खुद का बना।
नील

ऐसा लगता है कि आप सुझाव दे रहे हैं कि मैं पूरी लाइब्रेरी का मज़ाक उड़ाता हूँ। लगभग सभी फ़ंक्शन जिन्हें कमांड कॉल किया जाएगा, वे लाइब्रेरी में आंतरिक हैं।
विल Kunkel

0

मुझे लगता है कि कोड को न्यूनतम इनवेसिव तरीके से परीक्षण करना संभव है। उस से मेरा तात्पर्य यह है कि आप रोबोट लाइब्रेरी लेखकों द्वारा ठीक उसी तरह से कमांड लिख सकते हैं जैसा कि इरादा है। यह फायदेमंद हो सकता है यदि आप दूसरों के साथ कोड का आदान-प्रदान करना चाहते हैं जो आपकी मध्यवर्ती परत का उपयोग नहीं कर रहे हैं।

यह आपके कोड के एक अलग "यूनिट टेस्ट बिल्ड" की आवश्यकता है।

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

फिर आपके पास आदेश हैं कि आप अपने स्वयं के परीक्षण ढांचे में फेंक सकते हैं जो उन तरीकों को लागू करता है जो रोबोट पुस्तकालय करेगा।

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

बेस क्लास के नाम को बदलना #define के साथ किया जा सकता है या शायद पसंद किया जा सकता है।

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