आमतौर पर नकली वस्तुओं का दुरुपयोग कैसे किया जाता है?


15

मैंने हाल ही में एक लेख पढ़ा जिसमें कहा गया था कि नकली वस्तुओं को अक्सर गलत समझा जाता है और उनका दुरुपयोग किया जाता है। क्या कोई स्पष्ट नकल विरोधी पैटर्न है जिसे मैं देख सकता हूं?


लेख आप इस एक पढ़ा है? martinfowler.com/articles/mocksArentStubs.html
कीपल

नहीं ... सटीक स्रोत याद नहीं कर सकता, लेकिन यहाँ पोस्ट करूँगा अगर मैं करूँगा
आर्मंड

मुझे mongodb API को मॉक करने के लिए स्टैकओवरफ्लो पर काम करने के लिए लिया गया था। मुझे एक ब्लॉग पोस्ट की ओर इशारा किया गया था जिसमें दावा किया गया था कि किसी भी वर्ग का मजाक उड़ाना गलत है जो आपने खुद नहीं लिखा। मैं वास्तव में इससे सहमत नहीं हूँ लेकिन राय वहाँ से बाहर है।
केविन

जवाबों:


13

मैं साधारण कंक्रीट क्लास को दूर से देखकर हैरान हो जाता हूं। उदाहरण के लिए निम्नलिखित सरल वर्ग लें जिसमें किसी और चीज पर निर्भरता नहीं है:

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;
        }
    }
}

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

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


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

5
यह मुद्दा नहीं बदलता है - इस तरह की साधारण बात को आमतौर पर मजाक नहीं किया जाना चाहिए, भले ही आप किसी ऐसी चीज का उपयोग कर रहे हों, जो तकनीकी बाधाओं को शांत करती है (जैसे कि टाइपमॉक या एक गतिशील भाषा की तरह एक नकली रूपरेखा)।
फिनकंक

मेरे अंगूठे का नियम हमेशा से व्यवहार के लिए है, डेटा के लिए नहीं।
ardave

10

यह स्पष्ट लग सकता है, लेकिन: उत्पादन कोड में नकली वस्तुओं का उपयोग न करें! मैंने एक से अधिक उदाहरण देखे हैं जहां उत्पादन कोड कुछ नकली वस्तुओं ( MockHttpServletRequestउदाहरण के लिए स्प्रिंगफ्रैमवर्क से) की विशेषताओं पर निर्भर करता है ।


14
मुझे आशा है कि आपने अपने पवित्र कर्तव्य का पालन किया और DailyWTF को कोड सबमिट किया?
कीपला

1
मेरे पिछले काम में हमें अपने कोडबेस से DWTF तक कुछ भी जमा करने से स्पष्ट रूप से मना किया गया था।
मात्रा_देव

9
@quant_dev: तथ्य यह है कि उनके पास ऐसी नीति थी, जो उनके डेवलपर्स के बारे में डरावनी बातें बताती है ...
जॉन फिशर

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

बस शॉर्टकट लेने वास्तव में आप केवल dailywtf पाने के लिए पर्याप्त नहीं है ...
poolie

9

मेरी राय में यह मॉक पर अत्यधिक विधि मंगलाचरण चेक है। मुझे लगता है कि यह 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 के बारे में है, लेकिन नकल के बारे में एक अच्छा अध्याय है)


अत्यधिक विधि मंगलाचरण चेक पर बिंदु के लिए +1। हालांकि, हमेशा सिक्के का फ्लिप पक्ष होता है जहां एक अप्रत्याशित विधि मंगलाचरण आपकी पद्धति में विफलता का कारण बनता है। शुक्र है कि मॉकिटो में मोक्स के लिए Answer.RETURNS_SMART_NULLSसेटिंग है जो इसे निदान करने में मदद करता है।
ब्रिंगरहैसॉ

4

मैंने अपने अनुभव में कुछ विरोधी पैटर्न देखे हैं।

  • डोमेन कक्षाएं मॉक / स्टड की जा रही हैं जहां एक राज्य परिवर्तन हो सकता है और जिसे सत्यापित करने की आवश्यकता है।
  • एकीकरण परीक्षण मॉक और कंक्रीट कक्षाओं के मिश्रण के साथ बातचीत करते हैं जो एकीकरण परीक्षणों के उद्देश्य को पराजित करता है।
  • उत्पादन कोड में नकली के अनजाने उपयोग (ऐसा कभी नहीं होना चाहिए)

अन्यथा मॉकिटो के साथ मेरा अनुभव विशेष रूप से मॉकिटो एक हवा रहा है। उन्होंने लिखने और बनाए रखने के लिए परीक्षणों को बहुत आसान बना दिया है। GWTTestCase की तुलना में GWT व्यू / प्रेजेंटर इंटरैक्शन टेस्टिंग मोक्स के साथ बहुत आसान है।


2 और 3 निश्चित समस्याएं हैं! क्या आपको (1) का एक सरल उदाहरण मिला है?
आर्मंड

2

मुझे लगता है कि परीक्षण जो एक आवेदन की कई परतों में नकली का उपयोग करते हैं विशेष रूप से समझने और बदलने के लिए मुश्किल है। हालाँकि, मुझे लगता है कि हाल के वर्षों में इसमें सुधार करके मॉक फ्रेमवर्क एपीआई (मैं सुविधाजनक जहां JMock का उपयोग करता हूं) द्वारा कम किया गया है।

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

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

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