मैं निजी कोड पर इकाई परीक्षण की वकालत कैसे कर सकता हूं?


15

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

जबकि मुझे लगता है कि यूनिट टेस्ट सभी कोड पर लागू किया जा सकता है और मुझे अपने सहकर्मियों को कैसे राजी करना चाहिए?


3
यदि आपके पास निजी विधियाँ हैं जिन्हें आप परीक्षण करने की आवश्यकता महसूस करते हैं, तो अक्सर यह संकेत होता है कि आपका कोड SRP का उल्लंघन कर रहा है और वहाँ एक और वर्ग है जो रोने के लिए निकाला जाता है और अपने आप में परीक्षण किया जाता है।
Paddyslacker

@ IPaddyslacker: मुझे लगता है कि सभी कोड का परीक्षण करने की आवश्यकता है। मैं यह नहीं देखता कि एक कोड इकाई जो एकल जिम्मेदारी सिद्धांत का पालन करती है, को इकाई परीक्षण के अधीन क्यों नहीं किया जाना चाहिए ...
विज़ार्ड79

4
@lorenzo, आपने मेरी बात को याद किया; शायद मैंने इसे बहुत अच्छा नहीं बनाया। यदि आप इन निजी विधियों को किसी अन्य वर्ग में निकालते हैं, तो उन्हें अब आपके मूल वर्ग से सुलभ होने की आवश्यकता होगी। क्योंकि विधियां अब सार्वजनिक हैं, उन्हें जांचने की आवश्यकता होगी। मैं यह नहीं समझा रहा था कि उनका परीक्षण नहीं किया जाना चाहिए, मैं यह आरोप लगा रहा था कि यदि आप सीधे तरीकों का परीक्षण करने की आवश्यकता महसूस करते हैं, तो संभव है कि वे निजी न हों।
पैड्सस्लैकर

@ IPaddyslacker: मुझे सीधे तौर पर निजी तरीकों का परीक्षण करने की आवश्यकता महसूस होती है। आपको क्यों लगता है कि उन्हें निजी नहीं होना चाहिए?
जादूगर

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

जवाबों:


9

आपके सहकर्मी एकीकरण इकाइयों के साथ वास्तविक इकाई परीक्षणों को भ्रमित कर सकते हैं। यदि आपका उत्पाद एपीआई है (या है), तो एकीकरण परीक्षणों को NUnit परीक्षण मामलों के रूप में प्रोग्राम किया जा सकता है। कुछ लोग गलती से मानते हैं कि वे इकाई परीक्षण हैं।

आप निम्नलिखित के साथ अपने सहकर्मियों को समझाने की कोशिश कर सकते हैं (मुझे यकीन है कि आप पहले से ही इस सामान को जानते हैं, सभी मैं कह रहा हूं कि यह आपके सहकर्मियों की ओर इशारा करते हुए मदद कर सकता है):

  • टेस्ट कवरेज । उन एकीकरण परीक्षणों के वास्तविक परीक्षण कवरेज प्रतिशत को मापें। यह उन लोगों के लिए एक वास्तविकता जांच है जिन्होंने कभी टेस्ट कवरेज नहीं चलाया है। क्योंकि जब इनपुट कई परतों से दूर होता है, तो सभी तार्किक रास्तों का उपयोग करना मुश्किल होता है, टेस्ट कवरेज 20% से 50% के बीच कहीं से सबसे ऊपर होता है। अधिक कवरेज प्राप्त करने के लिए, आपके सहकर्मियों को वास्तविक, पृथक इकाई-परीक्षण लिखने की आवश्यकता होती है।
  • विन्यास । परीक्षण के तहत एक ही सॉफ्टवेयर को तैनात करें और शायद आप अपने सहकर्मियों को यह दिखा सकें कि एक अलग वातावरण में उनके परीक्षणों को चलाना कितना मुश्किल है। विभिन्न फाइलों के रास्ते, DB कनेक्शन के तार, दूरस्थ सेवाओं के URL इत्यादि - यह सब जुड़ जाता है।
  • निष्पादन का समय । जब तक परीक्षण सही इकाई परीक्षण नहीं होते हैं और स्मृति में चल सकते हैं, तब तक उन्हें चलाने में बहुत समय लगेगा।

12

आंतरिक / निजी कोड पर यूनिट परीक्षणों का उपयोग करने के कारण ठीक बाहरी रूप से समर्थित एपीआई के समान हैं:

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

8

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

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

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

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

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

  1. क्या मेरा रिजल्ट क्रमबद्ध है?

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

  1. क्या मेरा रिजल्ट क्रमबद्ध है?
  2. एक परिदृश्य को देखते हुए (मान लीजिए कि प्रारंभिक सूची को लगभग शुरू करने के लिए क्रमबद्ध किया गया है) क्या क्लास के लिए एक कॉल है जो एल्गोरिथ्म एक्स का उपयोग करके तार को सॉर्ट करता है?
  3. एक परिदृश्य को देखते हुए (प्रारंभिक सूची एक यादृच्छिक क्रम में है) क्लास के लिए एक कॉल है जो एल्गोरिथ्म वाई का उपयोग करके तार को सॉर्ट करता है?

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

परीक्षण (इस प्रकार के) केवल तभी बदलते हैं जब व्यवहार में बदलाव होता है, निजी कोड के खिलाफ परीक्षण लिखना शुरू करें और वह खिड़की से बाहर चला जाए।


1
शायद "निजी" के अर्थ पर गलतफहमी है। हमारे सिस्टम में 99% कोड "निजी" है, फिर हमारे पास सिस्टम के घटकों में से एक को स्वचालित / रिमोट कंट्रोल करने के लिए एक छोटा सा एपीआई है। मेरा मतलब है कि इकाई अन्य सभी मॉड्यूल के कोड का परीक्षण कर रही है।
जादूगर79

4

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

यदि प्रत्येक निजी भाग को एक परीक्षण द्वारा कवर किया जाता है, तो इन निजी भागों से युक्त एपीआई को लगभग 100% तक कवर किया जाना चाहिए, बस ऊपरी परत के लिए प्रेरित करना चाहिए। लेकिन यह एक पतली परत होने की संभावना है।

दूसरी ओर जब केवल एपीआई का परीक्षण करना होता है तो सभी संभावित कोड पथों को पूरी तरह से कवर करना वास्तव में कठिन हो सकता है।


+1 "दूसरी ओर ..." लेकिन अगर और कुछ नहीं, तो उन परीक्षणों को जोड़ें जहां एक विफलता सबसे अधिक चोट लगी होगी।
टोनी एनिस

2

लोगों को यूनिट परीक्षण स्वीकार करना कठिन है क्योंकि यह समय की बर्बादी की तरह लगता है ("हम एक और पैसा बनाने वाली परियोजना को कोडिंग कर सकते हैं!") या पुनरावर्ती ("और फिर हमें परीक्षण मामलों के लिए परीक्षण मामले लिखना होगा!") मैं दोनों को कहने का दोषी हूं।

पहली बार जब आप एक बग ढूंढते हैं, तो आपको सच्चाई का सामना करना पड़ता है कि आप सही नहीं हैं (हम कितनी जल्दी प्रोग्रामर भूल जाते हैं!) और आप जाते हैं, "हम्म।"


इकाई परीक्षण का एक अन्य पहलू यह है कि कोड को परीक्षण योग्य लिखा जाना चाहिए। यह समझते हुए कि कुछ कोड आसानी से परीक्षण योग्य है और कुछ कोड एक अच्छा प्रोग्रामर नहीं है "हम्म।"


क्या आपने अपने सहकर्मी से पूछा कि यूनिट परीक्षण केवल बाहरी-सामना करने वाले एपीआई के लिए ही उपयोगी क्यों था?


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

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


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


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


2

और निजी कोड (सार्वजनिक कोड (या ...) से बुलाया जाता है कि निजी कोड से बुलाया जाता है कि या निजी कोड) सार्वजनिक कोड से बुलाया जाता है कि निजी कोड है कि: दो निजी कोड के प्रकार के होते हैं करता है अंत में जनता के द्वारा नहीं कहा जाता हो कोड।

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

ध्यान दें कि जब आप TDD करते हैं, तो अनुपयोगी निजी कोड मौजूद होना असंभव है।


हमारे सिस्टम में 99% कोड तीसरी तरह का है : निजी, जिसे सार्वजनिक कोड नहीं कहा जाता है, और सिस्टम के लिए आवश्यक है (हमारे सिस्टम का केवल एक न्यूनतम हिस्सा बाहरी, सार्वजनिक एपीआई है)।
जादूगर79

1
"ध्यान दें कि जब आप TDD करते हैं, तो अनुपयोगी निजी कोड मौजूद होना असंभव है।" <- एक परीक्षण मामले को हटा दें, यह जाने बिना कि किसी विशेष शाखा को कवर करने के लिए परीक्षण का एकमात्र परीक्षण है। ठीक है, यह अधिक "वर्तमान में निष्कलंक" कोड है, लेकिन बाद में तुच्छ परिवर्तन को देखने के लिए उस कोड को बदलना काफी आसान है ... केवल आपका टेस्ट सूट अब इसे कवर नहीं करता है।
फ्रैंक शीयर

2

इकाई परीक्षण आपके कोड की सभी परीक्षण इकाइयों के बारे में है। यह आप पर निर्भर है कि एक इकाई क्या है। आपके सहकर्मी इकाइयों को एपीआई तत्वों के रूप में परिभाषित करते हैं।

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

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

हमारी प्रणाली में एपीआई केवल एक न्यूनतम हिस्सा है, जो तीसरे पक्ष के आवेदन के लिए स्वचालन / रिमोट कंट्रोल की अनुमति देता है। केवल 1% कोड कवरेज के लिए API खातों का परीक्षण ...
Wizard79
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.