2010-02-25 12 views
38

कई बार मैं अपने आप को (या आम तौर पर एक संदर्भ है कि मतलब नहीं है (या शामिल वस्तु की आंतरिक स्थिति अप पेंच हैं) में यह बुला, या विधि को सार्वजनिक करने से किसी को रोकने के लिए एक विधि निजी बनाने के बीच फंसे लगता है आंतरिक) इकाई परीक्षण असेंबली को बेनकाब करने के लिए। मैं बस सोच रहा था कि स्टैक ओवरफ्लो समुदाय ने इस दुविधा के बारे में क्या सोचा था?यूनिट परीक्षण के लिए विधि दृश्यता को बदलना ठीक है?

तो मैं सवाल लगता है कि सच है, यह testability पर या उचित कैप्सूलीकरण को बनाए रखने पर ध्यान केंद्रित करने के लिए बेहतर है?

हाल ही में मैं टेस्टेबिलिटी की ओर झुका रहा हूं, क्योंकि अधिकांश कोड केवल डेवलपर्स के एक छोटे समूह द्वारा लीवरेज किया जा रहा है, लेकिन मैंने सोचा कि मैं देखता हूं कि हर कोई क्या सोचता है?

उत्तर

15

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

हालांकि, यदि विधि सार्वजनिक एपीआई का हिस्सा नहीं होना चाहिए/नहीं, और इसे असेंबली के अन्य प्रकार के आंतरिक रूप से नहीं कहा जाता है, तो इसे सीधे जांच न करें। इसे संरक्षित या निजी होना चाहिए, और इसे केवल आपके सार्वजनिक एपीआई परीक्षण इकाई द्वारा परोक्ष रूप से परीक्षण किया जाना चाहिए। यदि आप अपने प्रकार के सदस्यों के लिए गैर-सार्वजनिक (या गैर-सार्वजनिक क्या होना चाहिए) के लिए यूनिट परीक्षण लिखते हैं, तो आप आंतरिक कार्यान्वयन विवरणों के लिए परीक्षण कोड बाध्य कर रहे हैं।

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

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

+0

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

+0

@Eric: फिर आप दस्तावेज और लागू करते हैं कि उन तरीकों को नहीं बुलाया जाना चाहिए। VS2010 की नई परत आरेख सुविधा वहाँ मदद मिल सकती है, के रूप में एक कैसे एक परत दूसरे के साथ बातचीत कर सकते हैं पर प्रतिबंध बना सकते हैं - के दौरान बनाता है उन प्रतिबंधों को लागू किया जा सकता है। –

+0

सेवा का आनंद लें। :) मैंने पीईएक्स के बारे में एक अपडेट जोड़ा जो आपको रुचि हो सकती है। – jrista

23

इसके तरीकों कि ग्राहकों या उपयोगकर्ताओं को देख सकते हैं पर विधि दृश्यता बदलने के लिए ठीक नहीं। ऐसा करना बदसूरत है, एक हैक, विधियों का खुलासा करता है कि कोई भी गूंगा उपयोगकर्ता आपके ऐप का उपयोग करने और विस्फोट करने का प्रयास कर सकता है ... इसकी एक ज़िम्मेदारी जिसकी आपको आवश्यकता नहीं है।

आप सी # हाँ उपयोग कर रहे हैं? internals visible to विशेषता वर्ग देखें। आप अपनी टेस्ट करने योग्य विधियों को आंतरिक के रूप में घोषित कर सकते हैं, और अपने यूनिट परीक्षण असेंबली को अपने आंतरिक तक पहुंच सकते हैं।

+0

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

2

यह एक आम सोचा है।

यह आम तौर पर सार्वजनिक तरीकों कि उन्हें फोन (ताकि आप स्पष्ट रूप से निजी तरीकों का परीक्षण नहीं करते हैं) के परीक्षण से निजी तरीकों का परीक्षण करने के लिए सबसे अच्छा है। हालांकि, मैं समझता हूं कि ऐसे समय होते हैं जब आप वास्तव में उन निजी तरीकों का परीक्षण करना चाहते हैं।

this question (Java) और this question (.NET) के जवाब मददगार होना चाहिए।

सवाल का जवाब करने के लिए: नहीं, तुम परीक्षण की खातिर विधि दृश्यता परिवर्तन नहीं होना चाहिए। आपको आम तौर पर निजी तरीकों का परीक्षण नहीं करना चाहिए, और जब आप करते हैं, तो ऐसा करने के बेहतर तरीके हैं।

1

सामान्य तौर पर मैं @jrista से सहमत हैं। लेकिन, हमेशा के रूप में, यह निर्भर करता है।

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

Working Effectively with Legacy Code में, माइकल फेदर परीक्षण के तहत कोड प्राप्त करने के लिए कई तकनीकों का सुझाव देते हैं। इनमें से कई तकनीकों में ब्रेकिंग इंकैप्यूलेशन या डिज़ाइन को जटिल बनाना शामिल है, और लेखक इसके बारे में सामने हैं। एक बार परीक्षण होने के बाद, कोड को सुरक्षित रूप से सुधार किया जा सकता है।

तो विरासत कोड के लिए, आप क्या करना है क्या करना है।

0

.NET में आपको InternalsVisibleTo विशेषता के बजाय, यूनिट परीक्षण के लिए एक्सेसर्स का उपयोग करना चाहिए। एक्सेसर्स आपको कक्षा में किसी भी विधि तक पहुंचने की इजाजत देता है भले ही यह निजी हो। वे आपको एक खाली नकली व्युत्पन्न वस्तु का उपयोग करके सार कक्षाओं का परीक्षण करने देते हैं ("PrivateObject" कक्षा देखें)।

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

कभी एक प्रकार अधिक इकाई परीक्षण की सुविधा के लिए सामने प्रस्तुत करें।

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

संबंधित मुद्दे