मैंने हाल ही में एक लेख पढ़ा जिसमें कहा गया था कि नकली वस्तुओं को अक्सर गलत समझा जाता है और उनका दुरुपयोग किया जाता है। क्या कोई स्पष्ट नकल विरोधी पैटर्न है जिसे मैं देख सकता हूं?
मैंने हाल ही में एक लेख पढ़ा जिसमें कहा गया था कि नकली वस्तुओं को अक्सर गलत समझा जाता है और उनका दुरुपयोग किया जाता है। क्या कोई स्पष्ट नकल विरोधी पैटर्न है जिसे मैं देख सकता हूं?
जवाबों:
मैं साधारण कंक्रीट क्लास को दूर से देखकर हैरान हो जाता हूं। उदाहरण के लिए निम्नलिखित सरल वर्ग लें जिसमें किसी और चीज पर निर्भरता नहीं है:
public class Person
{
private readonly string _firstName;
private readonly string _surname;
public Person(string firstName, string surname)
{
if (String.IsNullOrEmpty(firstName))
{
throw new ArgumentException("Must have first name");
}
if (String.IsNullOrEmpty(surname))
{
throw new ArgumentException("Must have a surname");
}
_firstName = firstName;
_surname = surname;
}
public string Name
{
get
{
return _firstName + " " + _surname;
}
}
}
इस वर्ग को शामिल करने वाले किसी भी परीक्षण में मैं वास्तविक नहीं बल्कि त्वरित था और कुछ इंटरफ़ेस के बजाय इसका इस्तेमाल किया था जैसे 'आईपर्सन' को बाहर निकाला गया था, एक प्रयोग किया गया था और उम्मीदों पर आधारित था। वास्तविक का उपयोग करके आपका परीक्षण अधिक यथार्थवादी होता है (आपके पास पैरामीटर जांच होती है और 'नाम' संपत्ति का वास्तविक कार्यान्वयन होता है)। इस तरह के एक साधारण वर्ग के लिए आप अपने परीक्षणों को धीमा नहीं कर रहे हैं, कम नियतात्मक या तर्क को कम करने के लिए (आपको यह जानने की संभावना नहीं है कि किसी अन्य वर्ग का परीक्षण करते समय नाम को बुलाया गया था) - जो कि मॉकिंग के सामान्य कारण हैं / छोटा करते।
इसके विस्तार के रूप में, मैंने लोगों को परीक्षण लिखने के लिए भी देखा है जहाँ नकली को एक उम्मीद के साथ स्थापित किया जाता है, फिर नकली को सीधे परीक्षण में कहा जाता है। अनिश्चित रूप से परीक्षा हमेशा पास होगी ... हम्म्म्म ...
यह स्पष्ट लग सकता है, लेकिन: उत्पादन कोड में नकली वस्तुओं का उपयोग न करें! मैंने एक से अधिक उदाहरण देखे हैं जहां उत्पादन कोड कुछ नकली वस्तुओं ( MockHttpServletRequest
उदाहरण के लिए स्प्रिंगफ्रैमवर्क से) की विशेषताओं पर निर्भर करता है ।
मेरी राय में यह मॉक पर अत्यधिक विधि मंगलाचरण चेक है। मुझे लगता है कि यह EasyMock जैसे कुछ मॉकिंग फ्रेमवर्क द्वारा लागू किया गया अभ्यास है, जहां डिफ़ॉल्ट मॉक व्यवहार को विफल करना है जब भी एक अतिरिक्त विधि मंगलाचरण होता है जो कि पहले बिल्कुल निर्दिष्ट नहीं था। इस तरह की सख्त नकली विधि जाँच से भंगुर डिज़ाइन हो सकते हैं जहाँ कोड में सबसे अधिक परिवर्तन होने पर परीक्षणों का एक पूरा सूट विफल हो सकता है, भले ही कोर कार्यक्षमता अभी भी समान हो।
इसका एक समाधान मोज़ेक के बजाय स्टब्स का उपयोग करना शुरू कर रहा है। इस विषय के बारे में मुझे विशेष रूप से ज्ञानवर्धक लेख मिला जो मॉकिटो के जावदोक में पाया गया था: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html (देखें "2. कुछ ठूंठ के बारे में कैसे?" ), से जोड़ने के लिए: http://monkeyisland.pl/2008/07/12/should-i-worry-about-the-unexpected/ ।
मैंने अब तक मॉकिटो के साथ काम करने का आनंद लिया है क्योंकि यह इस सख्त नकली व्यवहार को लागू नहीं करता है बल्कि इसके बजाय स्टब्स का उपयोग करता है। यह पूरे मॉक ऑब्जेक्ट के बजाय विशिष्ट लोगों पर विधि जाँच को लागू करता है; इसलिए आप केवल उन तरीकों की जाँच करते हैं जो वास्तव में आपके परीक्षा परिदृश्य में मायने रखते हैं।
यहाँ कुछ किताबें हैं और मैं इस विषय को छूने और मज़ाक करने और सामान्य करने की सिफारिश कर सकता हूँ:
xUnit पैटर्न
यूनिट परीक्षण की कला: .Net में उदाहरणों के साथ
नेक्स्ट जनरेशन जावा टेस्टिंग: TestNG और एडवांस्ड कॉन्सेप्ट्स (यह किताब ज्यादातर testNG के बारे में है, लेकिन नकल के बारे में एक अच्छा अध्याय है)
Answer.RETURNS_SMART_NULLS
सेटिंग है जो इसे निदान करने में मदद करता है।
मैंने अपने अनुभव में कुछ विरोधी पैटर्न देखे हैं।
अन्यथा मॉकिटो के साथ मेरा अनुभव विशेष रूप से मॉकिटो एक हवा रहा है। उन्होंने लिखने और बनाए रखने के लिए परीक्षणों को बहुत आसान बना दिया है। GWTTestCase की तुलना में GWT व्यू / प्रेजेंटर इंटरैक्शन टेस्टिंग मोक्स के साथ बहुत आसान है।
मुझे लगता है कि परीक्षण जो एक आवेदन की कई परतों में नकली का उपयोग करते हैं विशेष रूप से समझने और बदलने के लिए मुश्किल है। हालाँकि, मुझे लगता है कि हाल के वर्षों में इसमें सुधार करके मॉक फ्रेमवर्क एपीआई (मैं सुविधाजनक जहां JMock का उपयोग करता हूं) द्वारा कम किया गया है।
5 या 6 साल पहले EasyMock की तरह एपीआई शक्तिशाली लेकिन बहुत बोझिल थे। अक्सर परीक्षण कोड जो इसका उपयोग करता था वह परिमाण के आदेशों से अधिक जटिल था जो कि यह परीक्षण था। फिर मैंने उन टीमों को प्रभावित करने की कोशिश की जो मैं बहुत संयम से इस्तेमाल कर रहा था और साधारण दस्तकारी वाले मोक्स के साथ कर रहा था जो केवल विशेष रूप से परीक्षण के लिए इंटरफेस के वैकल्पिक कार्यान्वयन थे।
हाल ही में इस पर मेरी मज़बूत राय नरम हो गई है क्योंकि मॉकिंग एपीआई ने ऐसे परीक्षण किए हैं जो उन्हें अधिक पठनीय उपयोग करते हैं। अनिवार्य रूप से मैं चाहता हूं कि मेरा कोड (परीक्षण सहित) अन्य डेवलपर्स द्वारा परिवर्तन किए बिना उन्हें ऐसा लगे कि वे अस्पष्ट एपीआई कॉल के माध्यम से बह रहे हैं।