मैं किस वर्ग की जांच कर सकता हूं जिसे एक वेब सेवा कॉल की आवश्यकता है?


21

मैं एक वर्ग का परीक्षण करने की कोशिश कर रहा हूं जो कुछ Hadoop वेब सेवाओं को कॉल करता है। कोड बहुत अधिक रूप है:

method() {
    ...use Jersey client to create WebResource...
    ...make request...
    ...do something with response...
}

जैसे एक create directory method, एक create folder method आदि है।

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


5
आपने ऐसी चीज़ों के बारे में मार्गदर्शन नहीं किया है, जो आपके पास नहीं हैं। यही कारण है कि एक बहुत बड़ा कारण है कि आप चीजों को नकली चाहिए ... हो रहा है
थॉमस ओवेन्स

1
मैंने इसे बहुत सारे ब्लॉगों में पढ़ा है, जिनमें से एक इसे amazon.com/Growing-Object-Oriented-Software-Guided-Tests/dp/… के संदर्भ में जाना जाता है, जो मुझे पता है कि एक अच्छी तरह से मानी जाने वाली किताब है ( blog.86light)। com / eric-smith / 2011/10/27 / thats-not-yours.html , mockobjects.com/2007/04/test-smell-everything-is-mocked.html )
क्रिस कूपर

1
@ क्रिसहॉपर: मई मैं बताता हूं कि अंतिम लिंक बहुत पुराना है (2007 से)। तब से बहुत कुछ बदल गया है। मैं इस पोस्ट से यह महसूस करता हूं कि मॉकिंग बहुत कठिन था, जब आपको वास्तव में व्यवहार को लागू करने के लिए विरोध करना पड़ा था ताकि रिटर्न मान स्थापित करने के लिए केवल एक
मॉकिंग

जवाबों:


41

मेरी राय में अगर आप एक इकाई परीक्षण है, तो एक एकीकरण परीक्षण के विपरीत, webservice कॉल का मजाक उड़ाना चाहिए।

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

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

कोड का एकमात्र भाग जो यहां प्रासंगिक है वह है ...do something with response...। बाकी का मज़ाक उड़ाओ।


2
याद रखें कि आपको उस सेवा में अपरिहार्य परिवर्तनों के दौरान Hadoop webservice द्वारा उत्पन्न लोगों के साथ अपने नकली ऑब्जेक्ट हस्ताक्षर और रिटर्न वैल्यू को रखना होगा।
पीसीआर

यह शायद ही कभी Hadoop जैसे शेल्फ घटकों के परीक्षण के लायक है। लेकिन यदि आप किसी अन्य टीम या संगठन द्वारा प्रदान की गई कस्टम वेब सेवा को कॉल कर रहे हैं, तो आप आत्मरक्षा में इसके लिए एक परीक्षण लिखना चाह सकते हैं। इस तरह जब चीजें गलत हो जाती हैं, तो आप जल्दी से जांच सकते हैं कि क्या समस्या आपके कोड या वेब सेवा की है। यह स्वचालित रूप से चलाने के लिए एक इकाई परीक्षण नहीं है; यह आवश्यकतानुसार नैदानिक ​​है।
केविन क्लाइन

@kevincline मैं उन परीक्षणों की आवश्यकता पर पूरी तरह सहमत हूं जो आप प्रस्तावित करते हैं, और वास्तव में मैं उन्हें अपने दिन की नौकरी में लिखता हूं और उपयोगी साबित हुआ हूं। लेकिन वे परिभाषा नहीं इकाई परीक्षणों द्वारा हैं, जो कि सवाल यह था कि :) इस पर विचार करें: यदि यह एक इकाई परीक्षण है, और कोड विफल हो जाता है क्योंकि webservice बदल गया था, तो "इकाई" क्या है जो आप परीक्षण कर रहे हैं? क्या वास्तव में विफल? आप इकाई परीक्षण द्वारा आवश्यकतानुसार अलगाव में परीक्षण नहीं कर रहे हैं।
एंड्रेस एफ।

1
@AndresF .: मुझे लगता है कि हम हिंसक समझौते में हैं: "यह [नैदानिक] एक इकाई परीक्षण नहीं है ..."
केविन क्लाइन

@kevincline राइट! मैंने आपकी टिप्पणी को गलत बताया, क्षमा करें!
एंड्रेस एफ।

5

जब आप इकाई परीक्षण कर रहे होते हैं, तो मैं "उन वस्तुओं का मजाक नहीं उड़ाता, जो आपके पास नहीं हैं"।

अस्तित्व का नकली उद्देश्य यह तथ्य है कि मॉड्यूल, पुस्तकालय, कक्षाएं होंगी जो हमारे पास नहीं होंगी।

आपके परिदृश्य के लिए मेरा सुझाव वेब सेवा कॉल का मज़ाक है।

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

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


1

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

class WebClass {

private WebServiceInterface webserviceInterface;

    void method(){
        R result = webServiceInterface.performWebServiceCall();
        ... do something with result
    }

    public void setWebServiceInterface(WebServiceInterface webServiceInterface){
        this.webServiceInterface = webServiceInterface;
    }
}


interface WebServiceInterface {

   R performWebServiceCall();

}


class WebClassTest {

private WebServiceInterface mock;    
private R sampleResult = new R();

    @Before
    public void before(){
        mock = EasyMock.createMock(WebServiceInterface.class);
    }


    @Test
    public void test() {
        WebClass classUnderTest = new WebClass();
        EasyMock.expect(mock.performWebServiceCall()).andReturn(sampleResult);
        classUnderTest.setWebServiceInterface(mock);
        classUnderTest.method();
        EasyMock.verify(mock);
    }
}

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

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

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


1

इस मामले में मोक्स स्वीकार्य हैं, लेकिन आपको इसकी आवश्यकता नहीं है। इकाई परीक्षण method()के बजाय, इकाई परीक्षण केवल उस हिस्से का परीक्षण करता है जो प्रतिक्रिया को संभालता है।

एक फ़ंक्शन निकालें ResponseDataजो (जो भी प्रकार उपयुक्त हो) और फिर क्रिया करता है।

मॉकिंग के बजाय, अब आप सिर्फ एक रिस्पॉन्सडाटा ऑब्जेक्ट का निर्माण करते हैं और इसे पास करते हैं।

आप पूर्ण एकीकरण परीक्षणों के लिए सेवा की कॉलिंग को छोड़ सकते हैं - जो method()कुल में कवर करेंगे


0

मैंने क्या किया है, और यह काम करता है:

  1. सभी कोड कॉल webservices प्रॉक्सी के माध्यम से है।
  2. प्रॉक्सी एक वर्ग को बुलाता है जो सांख्यिकीय रूप से जानता है कि क्या हम प्रॉक्सी का उपयोग कर रहे हैं या नहीं और तदनुसार अनुप्रेषित करते हैं। मोक्स सिर्फ हैशमैप हैं जो प्रत्येक अनुरोध के लिए दिए गए उत्तर देता है।
  3. इस क्रम में कई बार परीक्षण चलाएं:

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

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

3.3 फिर 3.2 के समान परीक्षण चलाए जाते हैं, लेकिन इस बार विकास के वातावरण में चल रहे असली वेबसर्विस के खिलाफ हैं।

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

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