क्या यूनिट परीक्षण के तहत निजी / संरक्षित तरीके होने चाहिए?


82

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

अब मेरा प्रश्न निजी और संरक्षित विधियों के बारे में है जो मुझे इंटरफ़ेस द्वारा बताए गए तरीकों / गुणों के समर्थन में अपनी कक्षा में लिखना पड़ सकता है:

  • क्या कक्षा में निजी तरीकों की अपनी इकाई परीक्षण होनी चाहिए?

  • क्या कक्षा में संरक्षित विधियों का अपना यूनिट परीक्षण होना चाहिए?

मेरे विचार:

  • खासकर क्योंकि मैं इंटरफेस को कोड कर रहा हूं, मुझे संरक्षित / निजी तरीकों की चिंता नहीं करनी चाहिए क्योंकि वे ब्लैक बॉक्स हैं।

  • क्योंकि मैं इंटरफेस का उपयोग कर रहा हूं, इसलिए मैं यह पुष्टि करने के लिए यूनिट परीक्षण लिख रहा हूं कि परिभाषित अनुबंध को इंटरफ़ेस को लागू करने वाले विभिन्न वर्गों द्वारा ठीक से लागू किया गया है, इसलिए फिर से मुझे निजी / संरक्षित विधियों के बारे में चिंता नहीं करनी चाहिए और उन्हें यूनिट परीक्षणों के माध्यम से अभ्यास करना चाहिए जो कॉल करते हैं इंटरफ़ेस द्वारा परिभाषित तरीके / गुण।

  • यदि मेरा कोड-कवरेज यह नहीं दिखाता है कि संरक्षित / निजी तरीके हिट हो रहे हैं, तो मेरे पास सही यूनिट-परीक्षण नहीं हैं या मेरे पास कोड thats का उपयोग नहीं किया जा रहा है और इसे हटा दिया जाना चाहिए।


1
यदि आप अपने परीक्षणों से अपने संरक्षित तरीकों का प्रयोग नहीं करते हैं, तो उन्हें ओवरराइड करके, या उन्हें कॉल करके, निजी के बजाय उन्हें संरक्षित क्यों किया जाता है? उन्हें संरक्षित करके आप विस्तार बिंदु / कार्यक्षमता को उजागर करने के लिए एक सचेत निर्णय ले रहे हैं। मेरे लिए, यदि आप टीडीडी का अनुसरण कर रहे हैं, तो यह निर्णय आपके द्वारा लिखे जा रहे परीक्षणों द्वारा संचालित होना चाहिए।
forsvarir

2
आपको अपने विचारों के बारे में एक अलग उत्तर में भाग देना चाहिए। मुझे पता है जब आप करते हैं और मैं उत्थान करेंगे।
कीथ पिंसन


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

जवाबों:


108

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

तो इन निजी तरीकों का परीक्षण कर रहे परोक्ष परीक्षण है कि अपने सार्वजनिक इंटरफ़ेस के व्यवहार पर जोर से।

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


23
मुझे यह तथ्य पसंद है कि आपने कहा कि इकाई परीक्षण, व्यवहार का परीक्षण करती है न कि तरीकों का! यह चीजों को पूरी तरह स्पष्ट करता है।
राज राव।

1
मैं @ प्रजा से सहमत हूं। हर ट्यूटोरियल पर पहला कथन होना चाहिए। मैं सोच रहा था कि अपने तरीकों का परीक्षण कैसे करूं, अब मुझे पता है कि मुझे इसकी आवश्यकता नहीं है। +1
ठंढाईदार जुलाब

3
क्या आप कहेंगे कि यह अभी भी उन मामलों में लागू होता है, जहां आधार वर्ग संरक्षित व्यवहार को लागू करते हैं, जनता से विरासत और उपयोग की उम्मीद की जाती है? फिर संरक्षित विधियां अभी भी सार्वजनिक इंटरफ़ेस का हिस्सा हैं, क्या वे नहीं हैं?
निक उडेल

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

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

45

मैं ज्यादातर पोस्टरों से असहमत हूं।

सबसे महत्वपूर्ण नियम है: सार्वजनिक / संरक्षित / निजी के बारे में CODE TRUMPS THEORETICAL नियम।

आपके कोड का पूरी तरह से परीक्षण किया जाना चाहिए। यदि आप सार्वजनिक तरीकों के लिए परीक्षण लिखकर वहां पहुंच सकते हैं, तो संरक्षित / निजी तरीकों का पर्याप्त अभ्यास करें, यह बहुत अच्छा है।

यदि आप नहीं कर सकते हैं, तो या तो रिफ्लेक्टर करें ताकि आप संरक्षित / निजी नियमों को मोड़ सकें।

एक मनोवैज्ञानिक के बारे में एक शानदार कहानी है जिसने बच्चों को एक परीक्षा दी। उन्होंने प्रत्येक बच्चे को प्रत्येक छोर से जुड़ी रस्सी के साथ दो लकड़ी के बोर्ड दिए, और उन्हें फर्श पर अपने पैरों को छूने के लिए एक कमरा w / o पार करने के लिए कहा, जितनी जल्दी हो सके। सभी बच्चे बोर्ड का इस्तेमाल करते थे जैसे छोटी स्की, प्रत्येक बोर्ड पर एक पैर, रस्सियों द्वारा पकड़ना और फर्श पर फिसलना। फिर उसने उन्हें एक ही काम दिया, लेकिन केवल एक बोर्ड का उपयोग किया। उन्होंने फर्श के पार / "चल" दिया, एकल बोर्ड के प्रत्येक छोर पर एक पैर - और वे तेजी से थे!

सिर्फ इसलिए कि जावा (या जो भी भाषा) में एक विशेषता है (निजी / संरक्षित / सार्वजनिक) जरूरी नहीं कि आप बेहतर कोड लिख रहे हैं क्योंकि आप इसका उपयोग करते हैं!

अब, इस संघर्ष को अनुकूलित / कम करने के तरीके हमेशा मौजूद रहेंगे। अधिकांश भाषाओं में, आप एक विधि को (सार्वजनिक के बजाय) संरक्षित कर सकते हैं, और परीक्षण कक्षा को उसी पैकेज (या जो भी) में रख सकते हैं, और विधि परीक्षण के लिए उपलब्ध होगी। एनोटेशन हैं जो अन्य पोस्टर द्वारा वर्णित के रूप में मदद कर सकते हैं। आप निजी तरीकों (yuck) पर पहुंचने के लिए प्रतिबिंब का उपयोग कर सकते हैं।

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

लेकिन दिन के अंत में, सोचें कि परीक्षण की कमी के कारण कितने कीड़े हो गए हैं। फिर "ओवरली दृश्यमान" विधियों के कारण कितने कीड़े हो गए हैं। उस उत्तर को अपना निर्णय लेना चाहिए।


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

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

हाँ, लेकिन "वर्किंग कोड" क्या है? एक निजी विधि का परीक्षण करना इस बारे में कुछ नहीं कहता है कि आपकी वस्तु का सही व्यवहार है या नहीं। यही मुख्य बिंदु है कि हम केवल सार्वजनिक तरीकों का परीक्षण क्यों करते हैं। केवल सार्वजनिक तरीके ही व्यवहार को प्रदर्शित करते हैं जो कोड के एक टुकड़े के उपयोगकर्ता की परवाह करता है।
सम्मी

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

बिट (शीर्ष पर) "परीक्षणों के बारे में कोड युग्मन हैं ... रिफैक्टिंग को रोकना" 100% गलत है। वास्तुशिल्प रूपक में, परीक्षण मचान हैं, ठोस नहीं। चीजें बदलती हैं, परीक्षण बदलते हैं, फेंक दिए जाते हैं, नए परीक्षण लिखे जाते हैं। मैं मानता हूं कि अच्छा डिजाइन परीक्षण पुनर्लेखन को कम करता है। लेकिन परिवर्तन होता है, यहां तक ​​कि सबसे अच्छे डिजाइनों तक।
चार्ल्स रोथ

34

आप ने लिखा:

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

कृपया मुझे बीडीडी भाषा में इसे फिर से लिखना दें :

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

* Interfaceकक्षा का वास्तविक या सरल रूप से सुलभ एपीआई हो सकता है, जैसे: रूबी के पास इंटरफेस नहीं है।

यही कारण है कि आप निजी तरीकों का परीक्षण नहीं करते हैं - क्योंकि एक परीक्षण कक्षा का उपयोग करने का एक उदाहरण है, और आप वास्तव में उनका उपयोग नहीं कर सकते हैं। कुछ आप कर सकते हैं यदि आप चाहते हैं कि निजी विधियों में सहयोगी वर्ग को जिम्मेदारियां सौंपी जाएं, तो उस सहायक को मॉक / स्टब करें।

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

उम्मीद है की यह मदद करेगा!


1
शानदार पोस्ट। बहुत कुछ स्पष्ट करता है।
२४:१४

17

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

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


13

नहीं! केवल परीक्षण इंटरफेस।

टीडीडी के बड़े लाभों में से एक यह आश्वासन है कि इंटरफ़ेस कोई फर्क नहीं पड़ता कि आपने निजी तरीकों को लागू करने के लिए कैसे चुना है।


11

ऊपर दूसरों ने जो कहा, उसे पूरा करते हुए, मैं कहूंगा कि संरक्षित विधियां किसी प्रकार के एक इंटरफेस का हिस्सा हैं: यह बस ऐसा होता है कि रचना के बजाय वंशानुक्रम के संपर्क में आता है, जो कि हर कोई इंटरफेस पर विचार करते समय सोचने के लिए जाता है।

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


9

परीक्षण लिखने के दो कारण हैं:

  1. अपेक्षित व्यवहार प्रस्तुत करना
  2. व्यवहार के प्रतिगमन को रोकना

अपेक्षित व्यवहार पर जोर देते हुए:

जब आप अपेक्षित व्यवहार का दावा करते हैं, तो आप यह सुनिश्चित करना चाहते हैं कि कोड काम करता है जैसा आपको लगता है कि यह करना चाहिए। यह आपके दिनचर्या मैनुअल सत्यापन को प्रभावी ढंग से करता है जो किसी भी प्रकार के कोड को लागू करते समय कोई भी देव प्रदर्शन करेगा:

  • क्या मैंने सिर्फ काम लिखा है?
  • क्या यह लूप वास्तव में समाप्त होता है?
  • क्या मुझे लगता है कि यह क्रम में लूपिंग है?
  • क्या यह एक शून्य इनपुट के लिए काम करेगा?

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

यह एक अच्छा विचार है ऐसा करने के लिए जहाँ भी आप आवश्यक महसूस करते हैं। कोई भी कोड जो समझने में थोड़ा मुश्किल है, या गैर तुच्छ है। यहां तक ​​कि तुच्छ कोड से भी लाभ हो सकता है। यह सब आपके अपने आत्मविश्वास की बात है। इसे कितनी बार करना है और कितनी दूर जाना है यह आपकी अपनी संतुष्टि पर निर्भर करेगा। रुकें जब आप आत्मविश्वास से जवाब दे सकते हैं हाँ: क्या आपको यकीन है कि यह काम करता है?

इस तरह के परीक्षण के लिए, आप दृश्यता, इंटरफेस या उस में से किसी के बारे में परवाह नहीं करते हैं, आप केवल काम करने वाले कोड के बारे में परवाह करते हैं। तो हाँ, आप निजी और संरक्षित तरीकों का परीक्षण करेंगे यदि आपको लगा कि प्रश्न के लिए हां का जवाब देने के लिए उन्हें आपकी जांच करने की आवश्यकता है।

व्यवहार के प्रतिगमन को रोकना (2) लेना:

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

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

इसके लिए सामान्य तंत्र कहा जाता है: सीमा के लिए कोडिंग। कोड के कुछ हिस्सों के बीच की सीमाएं बनाकर, आप एक सीमा के अंदर हर चीज को उसके बाहर की चीजों से बचाते हैं। सीमाएं बातचीत का बिंदु बन जाती हैं, और अनुबंध जिसके द्वारा चीजें बातचीत करती हैं।

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

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

इसका क्या करें?

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

हां और ना।

सबसे पहले : उन सभी तरीकों का परीक्षण करें जो आपको लगता है कि आपको एक निश्चित प्रमाण की आवश्यकता है कि यह ज्यादातर मामलों में काम करता है जैसा कि आपके कोड के कामों को आश्वस्त करने में सक्षम होना चाहिए, दृश्यता कोई फर्क नहीं पड़ता। फिर, उन परीक्षणों को अक्षम करें। उन्होंने वहां नौकरी कर ली है।

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

नोट: कारण जो आपने परीक्षण के पहले सेट को अक्षम कर दिया है, वह है कि रीफैक्टरिंग कार्य को होने दिया जाए। एक सक्रिय परीक्षण एक कोड युग्मन है। यह उस कोड के भविष्य के संशोधन को रोकता है जिसका वह परीक्षण कर रहा है। आप केवल अपने इंटरफेस और इंटरैक्शन कॉन्ट्रैक्ट्स के लिए ऐसा चाहते हैं।


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

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

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

@kai आप उल्लेख करते हैं: "या यह मृत है और / या बिना कोड के"। अनटाइटेड कोड वही है जिसके बारे में मैं बात कर रहा हूं। एक निजी पद्धति बहुत सारे कीड़े छिपा सकती है, जिसके लिए सार्वजनिक मामलों से किनारे के मामलों का उपयोग नहीं किया जा रहा है। एक त्रुटि द्वारा बंद की कल्पना करें। कभी-कभी, सार्वजनिक तरीकों के आक्रमणकारी इसे बनाते हैं, इसलिए यह मामला कभी नहीं होगा। ऐसे मामले में, मैं निजी पद्धति को अभी भी छोटी गाड़ी समझूंगा और एक त्रुटिपूर्ण कार्यान्वयन होगा, फिर भी, इसका एकीकरण बग को ढूंढने और पकड़ने से रोकता है। इस मामले में, आप किनारे के मामलों को आज़माने के लिए कुछ परीक्षण कर सकते हैं ताकि आप सुनिश्चित कर सकें कि आपकी विधि बग मुक्त है।
डिडियर ए।

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

4

नहीं, आपको निजी तरीकों का परीक्षण नहीं करना चाहिए (आप किसी भी तरह से प्रतिबिंब जैसी भयानक चीज का उपयोग किए बिना कैसे कर सकते हैं)। संरक्षित तरीकों के साथ यह C # में थोड़ा कम स्पष्ट है आप चीजों को संरक्षित आंतरिक बना सकते हैं और मुझे लगता है कि व्युत्पन्न वर्गों का परीक्षण करना ठीक है जो टेम्पलेट पैटर्न विधियों के माध्यम से उनकी सभी कार्यक्षमता को लागू करते हैं।

लेकिन, सामान्य तौर पर, यदि आपको लगता है कि आपके सार्वजनिक तरीके बहुत अधिक हैं, तो यह समय है कि आप अपनी कक्षाओं को अधिक परमाणु वर्गों में फिर से बनाएँ और फिर उन क्लैस का परीक्षण करें।


2

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

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

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

आशा करता हूँ की ये काम करेगा!


2

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

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

बस ग्राहक के लिए एक विधि छिपाना (निजी बनाना) यह विशेषाधिकार नहीं देता है कि उसका ऑडिट न किया जाए। इसलिए, सार्वजनिक तरीकों से उनका परीक्षण किया जा सकता है जैसा कि पहले उल्लेख किया गया है।


1

मैं अन्य सभी से सहमत हूं: आपके प्रश्न का उत्तर 'नहीं' है।

वास्तव में आप अपने दृष्टिकोण और अपने विचारों के साथ पूरी तरह से सही हैं, खासकर कोड कवरेज के बारे में।

मैं यह भी जोड़ना चाहूंगा कि प्रश्न (और उत्तर 'नहीं') उन सार्वजनिक तरीकों पर भी लागू होता है जिन्हें आप कक्षाओं में लागू कर सकते हैं।

  • यदि आप तरीके (सार्वजनिक / संरक्षित या निजी) जोड़ते हैं क्योंकि वे एक असफल परीक्षा पास करते हैं, तो आप कमोबेश टीडीडी के लक्ष्य को प्राप्त कर चुके हैं।
  • यदि आप विधियों (सार्वजनिक / संरक्षित या निजी) को जोड़ते हैं क्योंकि आप केवल TDD का उल्लंघन करने का निर्णय लेते हैं, तो आपके कोड कवरेज को पकड़ना चाहिए और आपको अपनी प्रक्रिया में सुधार करने में सक्षम होना चाहिए।

इसके अलावा, सी ++ के लिए (और मुझे केवल सी ++ के लिए सोचना चाहिए) मैं केवल निजी तरीकों का उपयोग करके इंटरफेस को लागू करता हूं, यह इंगित करने के लिए कि क्लास को केवल इंटरफ़ेस के माध्यम से उपयोग किया जाना चाहिए। यह मुझे गलत तरीके से अपने परीक्षणों से मेरे कार्यान्वयन में जोड़े गए नए तरीकों को कॉल करने से रोकता है


0

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

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

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