c# - तकन - पशु क्लोनिंग




गहरी क्लोनिंग के लिए इकाई परीक्षण (4)

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

आपको अपने ऑब्जेक्ट को क्लोन करने की जरूरत है और फिर हर एक प्रॉपर्टी और वेरिएबल के माध्यम से जाना चाहिए जो आपकी ऑब्जेक्ट है और यह तय है कि क्या इसे ठीक से कॉपी किया गया है या सही ढंग से क्लोन किया गया है।

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

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

क्लोन ऑब्जेक्ट एक अच्छी प्रतिलिपि है, इसका परीक्षण करने के लिए लोग क्या सोचते हैं? क्या आप क्लास के लिए अपने सभी यूनिट टेस्ट लिखते हैं (या फिर एक बार आप को क्लोन की आवश्यकता की खोज करते हैं) ताकि वे एक 'कुंवारी' ऑब्जेक्ट या उसके क्लोन के साथ लाया जा सके? क्लोनिंग का हिस्सा गहरा पर्याप्त नहीं था, तो आप कैसे परीक्षण करेंगे - क्योंकि यह केवल ऐसी समस्या है जो बाद में घृणित-से-ढूँढें बग्स दे सकती है?


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

अपने विशिष्ट सवालों का जवाब देने के लिए:

क्या आप क्लास के लिए अपने सभी यूनिट टेस्ट लिखते हैं (या फिर आप को क्लोन की आवश्यकता की खोज करने के बाद दोबारा लिखना) ताकि उन्हें 'कुंवारी' ऑब्जेक्ट या उसके क्लोन से जोड़ा जा सके?

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

क्लोनिंग का हिस्सा गहरा पर्याप्त नहीं था, तो आप कैसे परीक्षण करेंगे - क्योंकि यह केवल ऐसी समस्या है जो बाद में घृणित-से-ढूँढें बग्स दे सकती है?

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


वास्तव में एक स्पष्ट समाधान है जो लगभग उतना काम नहीं लेता है:

  1. ऑब्जेक्ट को एक बाइनरी प्रारूप में क्रमबद्ध करें।
  2. ऑब्जेक्ट क्लोन करें
  3. क्लोन को बाइनरी प्रारूप में क्रमबद्ध करें
  4. बाइट्स की तुलना करें

मान लें कि सीरियलाइजेशन काम करता है - और यह बेहतर है क्योंकि आप इसे क्लोन करने के लिए उपयोग कर रहे हैं - यह बनाए रखना आसान होना चाहिए वास्तव में, यह परिवर्तन से आपके वर्ग की संरचना को पूरी तरह से समझाया जाएगा।


मैं आमतौर पर गहराई में दो ऑब्जेक्ट की तुलना करने के लिए Equals() को क्रियान्वित करता हूं I हो सकता है कि आपको अपने उत्पादन कोड में इसकी ज़रूरत न हो, लेकिन यह बाद में भी उपयोगी हो सकती है और परीक्षण कोड बहुत क्लीनर है।





unit-testing