कोड का परीक्षण कैसे करें जो जटिल एपीआई (उदाहरण के लिए अमेज़ॅन एस 3) पर निर्भर करता है?


13

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

  1. कोड को चलाएं, वास्तव में दस्तावेज़ अपलोड करें, AWS के एपीआई के साथ जांचें कि इसे अपलोड किया गया है और परीक्षण के अंत में इसे हटा दें। यह परीक्षण को बहुत धीमा कर देगा, हर बार परीक्षण चलाने पर पैसे खर्च होंगे और उसी परिणाम को वापस नहीं करेंगे।

  2. मॉक एस 3। यह सुपर बालों वाला है क्योंकि मुझे उस वस्तु के आंतरिक के बारे में कोई पता नहीं है और यह गलत लगता है क्योंकि यह बहुत जटिल है।

  3. बस सुनिश्चित करें कि MyObject.upload () सही तर्कों और विश्वास के साथ कहा जाता है कि मैं S3 ऑब्जेक्ट का सही उपयोग कर रहा हूं। यह मुझे परेशान करता है क्योंकि यह सुनिश्चित करने का कोई तरीका नहीं है कि मैंने अकेले परीक्षणों से एस 3 एपीआई का सही उपयोग किया।

मैंने जाँच की कि अमेज़ॅन कैसे अपने एसडीके का परीक्षण करता है और वे सब कुछ नकली करते हैं। उनके पास 200 रेखाओं वाला हेल्पर है जो मॉकिंग करता है। मुझे नहीं लगता कि मेरे लिए ऐसा करना व्यावहारिक है।

मैं इसे कैसे हल करूं?


उत्तर नहीं, लेकिन व्यवहार में हम आपके द्वारा बताए गए तीन दृष्टिकोणों का उपयोग करते हैं।
जालौन

जवाबों:


28

दो मुद्दों पर हमें यहाँ देखना है।

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

दूसरा यह है कि आप अपने व्यावसायिक तर्क के साथ थर्ड-पार्टी कोड में कॉल मिला रहे हैं, परीक्षण चुनौतियां पैदा कर रहे हैं और संभवतः आपके कोड को अधिक भंगुर बना रहे हैं।

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

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

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

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

खैर, हम नहीं करते। यदि हम दिशानिर्देश का पालन करते हैं, तो हम उन वस्तुओं का मजाक नहीं उड़ा सकते, जिनके हम मालिक नहीं हैं। लेकिन ... यदि हम अपनी प्रत्यक्ष निर्भरता के मालिक हैं, तो हम उनका मजाक उड़ा सकते हैं। पर कैसे? हम S3 API के लिए अपना स्वयं का रैपर बनाते हैं। हम इसे S3 API की तरह बना सकते हैं, या हम इसे अपनी आवश्यकताओं को और अधिक बारीकी से (पसंदीदा) फिट कर सकते हैं। हम इसे थोड़ा और सार भी बना सकते हैं, एक के PersistenceServiceबजाय कहें AmazonS3BucketPersistenceServiceविधियों के साथ एक इंटरफ़ेस होगा #save(Thing)और #fetch(ThingId), हमारे द्वारा देखे जा सकने वाले तरीकों के प्रकार (ये उदाहरण हैं, आप वास्तव में विभिन्न तरीकों को चाहते हैं)। अब हम अपने कॉलिंग कोड से PersistenceServiceS3 API (कहते हैं S3PersistenceService) के आसपास इसे लागू कर सकते हैं ।

अब उस कोड को जो S3 API को कॉल करता है। हमें उन कॉल को किसी PersistenceServiceऑब्जेक्ट से बदलने की आवश्यकता है । हम ऑब्जेक्ट में हमारे पास करने के लिए निर्भरता इंजेक्शन का उपयोग PersistenceServiceकरते हैं। यह महत्वपूर्ण है कि एक के लिए नहीं पूछें S3PersistenceService, लेकिन एक के लिए पूछने के लिए PersistenceService। यह हमारे परीक्षणों के दौरान कार्यान्वयन को स्वैप करने की अनुमति देता है।

सभी कोड जो एस 3 एपीआई का उपयोग करते थे PersistenceService, अब सीधे हमारा उपयोग करते हैं , और हमारा S3PersistenceServiceअब एस 3 एपीआई के लिए सभी कॉल करता है। हमारे परीक्षणों में, हम इसका मजाक उड़ा सकते हैं PersistenceService, क्योंकि हम इसके मालिक हैं, और यह सुनिश्चित करने के लिए कि हमारा कोड सही कॉल करता है, मॉक का उपयोग करें। लेकिन अब वह परीक्षण करना छोड़ देता है S3PersistenceService। इसमें पहले जैसी ही समस्या है: हम बाहरी सेवा पर कॉल किए बिना इसे टेस्ट नहीं कर सकते। इसलिए ... हम इसे परीक्षण नहीं करते हैं। हम S3 एपीआई निर्भरता का मजाक उड़ा सकते हैं , लेकिन इससे हमें कोई अतिरिक्त विश्वास नहीं होगा। इसके बजाय, हमें इसे उच्च स्तर पर परीक्षण करना होगा: एकीकरण परीक्षण।

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

अगले चरण के लिए एकीकरण परीक्षण लिखना है S3PersistenceService। इन्हें नाम या फ़ोल्डर से अलग किया जाना चाहिए ताकि हम इन्हें अपने तेज़ इकाई परीक्षणों से अलग से चला सकें। एकीकरण परीक्षण अक्सर यूनिट परीक्षणों के रूप में एक ही परीक्षण ढांचे का उपयोग कर सकते हैं यदि कोड पर्याप्त जानकारीपूर्ण है, इसलिए हमें एक नया टूल सीखने की आवश्यकता नहीं है। एकीकरण परीक्षण का वास्तविक कोड वह है जो आप अपने विकल्प 1 के लिए लिखेंगे।


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

@Yerken जैसा कि मैं इसके बारे में सोच रहा हूं, मुझे पूरा यकीन है कि मैं उस सवाल का एक और लंबा जवाब भर सकता हूं। यह आपके लिए भी सार्थक हो सकता है क्योंकि आपको सिर्फ मेरी प्रतिक्रिया से अधिक मिल सकता है।
13

4

आपको दोनों करने की जरूरत है।

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

आपको उन unittests की भी ज़रूरत है जो अधिक तेज़ी से चलती हैं। चूँकि यह आम तौर पर बहुत मुश्किल है कि किसी बाहरी सिस्टम पर बहुत ज्यादा निर्भर न हो (इसलिए आप कार्यान्वयन को खत्म कर सकते हैं या खत्म हो सकते हैं) आपको संभवतः S3 पर एक सरल इंटरफ़ेस लिखने की कोशिश करनी चाहिए, जिसके खिलाफ आप कोड कर सकते हैं। उस इंटरफेस को मॉकिट करें जो कि यूनिटैस्ट में है, इसलिए आपके पास जल्दी-जल्दी चलने वाले यूनीटेस्ट हो सकते हैं।

पहला परीक्षण यह जाँचता है कि आपका कोड वास्तव में S3 के साथ काम करता है, दूसरा परीक्षण जो आपका कोड सही कोड को S3 से बात करता है।


2

मैं कहूंगा कि यह एपीआई के आपके उपयोग की जटिलता पर निर्भर करता है

  1. आपको निश्चित रूप से कम से कम कुछ परीक्षण करने की आवश्यकता है जो वास्तव में एस 3 एपीआई को आमंत्रित करते हैं और पुष्टि करते हैं कि यह अंत से अंत तक काम किया।

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

सवाल यह है कि: क्या आपको एपीआई का मजाक उड़ाने की जरूरत है?

और मुझे लगता है कि यह निर्भर करता है कि आप इसके साथ कितना करते हैं। यदि आप केवल एक या दो सरल क्रियाएं कर रहे हैं, तो मुझे नहीं लगता कि आपको किसी मॉक-अप की परेशानी में जाने की जरूरत है। मैं सिर्फ कार्यों के अपने उपयोग की जाँच करने और कुछ लाइव परीक्षण करने से संतुष्ट होऊंगा।

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


1

पिछले उत्तरों में जोड़ते हुए, मुख्य प्रश्न यह है कि क्या (और कैसे) आप अपने परीक्षणों के लिए S3 एपीआई का मजाक बनाना चाहते हैं।

व्यक्तिगत S3 प्रतिक्रियाओं को मैन्युअल रूप से मॉक करने के बजाय, आप कुछ बहुत ही परिष्कृत मौजूदा मॉकिंग फ्रेमवर्क का लाभ उठा सकते हैं। उदाहरण के लिए मोटो कार्यक्षमता प्रदान करता है जो वास्तविक S3 API के समान है।

आप लोकलस्टैक पर भी एक नज़र डाल सकते हैं , एक रूपरेखा जो मौजूदा उपकरणों को जोड़ती है और एक पूरी तरह कार्यात्मक स्थानीय क्लाउड वातावरण (एस 3 सहित) प्रदान करती है जो एकीकरण परीक्षण की सुविधा प्रदान करती है।

हालाँकि, इनमें से कुछ उपकरण अन्य भाषाओं (पायथन) में लिखे गए हैं, जावा / JUnit, में आपके परीक्षणों से बाहरी प्रक्रिया में परीक्षण वातावरण को स्पिन करना आसान होना चाहिए।

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