इकाई परीक्षण एक शून्य विधि


15

किसी एप्लिकेशन में बग को ठीक करने के लिए, मैंने postLoginएक मौजूदा विधि नाम की कॉल को जोड़कर एक विधि को संशोधित किया getShoppingCart

कोड

protected void postLogin() {
  getShoppingCart();
}

हालांकि, मुझे यकीन नहीं है कि इसके लिए एक इकाई परीक्षण लिखने का सबसे अच्छा तरीका क्या postLoginहै।

दृष्टिकोण १

मॉकिटो से वेरिफिकेशन का उपयोग करें बस यह सत्यापित करने के लिए कि विधि को कहा गया था।

verify(mock).getShoppingCart();

दृष्टिकोण २

उपयोगकर्ता के शॉपिंग कार्ट के मूल्य को प्राप्त करके विधि कॉल के साइड इफेक्ट का परीक्षण करें।

AssertNotNull(user.getShoppingCart());

क्या एक दृष्टिकोण दूसरे की तुलना में बेहतर है?


1
जो भी परीक्षण को समझने में आसान बनाता है, और कोड को साफ रखता है। यदि आप परीक्षण डिज़ाइन के बारे में अनिश्चित हैं, तो COULD भी एक संकेत है कि कोड डिज़ाइन बंद है। सुनिश्चित करें कि आप ये प्रश्न पूछ रहे हैं: " उस पद्धति को जोड़ने से बग को ठीक क्यों किया जाता है? क्या यह बग को ठीक करने का सही तरीका है?"
कालेब

8
जब तक आपके getShoppingCart()तरीके के साइड-इफेक्ट्स नहीं होते हैं, तब तक आपको परीक्षण करने की आवश्यकता नहीं है कि इसे कहा जाता है। यदि इसके साइड इफेक्ट्स हैं, तो आपको वास्तव में इसका नाम बदल देना चाहिए क्योंकि getXXX()पारंपरिक रूप से तरीकों को बेकार होना चाहिए।
जूल्स

@ जूल्स getNextValue? यकीनन, कोई कह सकता है कि "इसे गटर न कहें, नाम बदल दें nextValue", लेकिन मैंने getNextपहले भी देखा है। शायद एक बेहतर उदाहरण एक इलेक्ट्रॉन का प्रतिनिधित्व करने वाली वस्तु होगी; क्या होता है जब मैं फोन करता हूं getPosition? या इससे भी बदतर,getPosition(); getVelocity();
हारून

जवाबों:


18

मैं आमतौर पर विधि 2 पसंद करूंगा।

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


4

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

यदि getShoppingCart किसी अन्य वर्ग में है और यह पहले से ही जांच की गई इकाई है तो मैं दृष्टिकोण 1 का उपयोग करूंगा - पहले से परीक्षण किए गए परीक्षण को फिर से परीक्षण करने की कोई आवश्यकता नहीं है। इस मामले में हमें यकीन है कि getShoppingCart ठीक से काम करता है और हम केवल यह आश्वासन देना चाहते हैं कि इसे पोस्टलॉगिन कहा जाता है, इसलिए यदि भविष्य में कोई व्यक्ति इस कॉल को हटाता है तो परीक्षण विफल हो जाएगा।

यदि getShoppingCart एक निजी विधि है जिसे स्वयं परीक्षण नहीं किया जा सकता है, तो मैं दृष्टिकोण 2 का उपयोग करूंगा, यह सुनिश्चित करने के लिए कि जब PostLogin को getShoppingCart की वांछित कार्यक्षमता कहा जाता है, तो अपेक्षित रूप से किया जाता है।


1

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


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

0

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


0

PostLogin में आपके पास एक बग है। तो आपको जो पहली चीज करनी चाहिए, वह एक यूनिट टेस्ट है जो कि सूचना के अपेक्षित सेट के बिना पोस्टलॉगिन को कॉल करने पर "विफल" होगा।

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

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

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

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