यूनिट एक एपीआई क्लाइंट और रैपर का परीक्षण करती है


14

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

Wrapper --> Client --> External API

मैं पहली बार दोनों के खिलाफ परीक्षण के एक झुंड ने लिखा है Clientऔर Wrapperप्रभावी ढंग से बस का परीक्षण है कि है कि वे आगे उचित कार्यों जो कुछ भी की पर संचालित करने के लिए ( Wrapperपर चल रही है Client, और Clientएक HTTP कनेक्शन पर चल रही है)। हालाँकि, मैं इससे असहज महसूस करने लगा था, क्योंकि मुझे लगता है कि मैं इन कक्षाओं के कार्यान्वयन का परीक्षण कर रहा हूँ, बजाय इंटरफ़ेस के। सिद्धांत रूप में, मैं कक्षाओं को एक और पूरी तरह से मान्य कार्यान्वयन के लिए बदल सकता था, लेकिन मेरे परीक्षण विफल हो जाएंगे क्योंकि मुझे जिन कार्यों की उम्मीद थी उन्हें बुलाया नहीं जा रहा है। यह मेरे लिए नाजुक परीक्षणों की तरह लगता है।

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

अंत में, मैंने प्रोग्रामर एसई के एक अन्य उत्तर से इसे पढ़ा :

एक दूरस्थ एपीआई क्लाइंट का काम कुछ कॉल जारी करना है - अधिक नहीं, कम नहीं। इसलिए, इसके परीक्षण को सत्यापित करना चाहिए कि यह उन कॉलों को जारी करता है - अधिक नहीं, कम नहीं।

और अब मैं कम या ज्यादा आश्वस्त हूं - जब परीक्षण Client, मुझे परीक्षण करने की आवश्यकता है कि यह एपीआई के लिए सही अनुरोध करता है (बेशक, हमेशा संभावना है कि एपीआई बदल जाएगा लेकिन मेरे परीक्षण पास करना जारी है - लेकिन यह जहां एकीकरण परीक्षण उपयोगी होंगे)। चूंकि Clientएपीआई के साथ सिर्फ 1: 1 मैपिंग है, एक वैध कार्यान्वयन से दूसरे में बदलने के बारे में मेरी चिंता वास्तव में लागू नहीं होती है - प्रत्येक विधि के लिए केवल एक वैध कार्यान्वयन है Client

हालाँकि, मैं अभी भी Wrapperकक्षा से जुड़ा हुआ हूँ । मैं निम्नलिखित विकल्प देखता हूं:

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

  2. मैं एक मॉक क्रिएट करता हूं Client। अब मुझे यह तय करना है कि इसका मज़ाक उड़ाने के साथ कितनी दूर जाना है - सेवा का पूरा मज़ाक बनाने के लिए बहुत प्रयास करना होगा (जितना काम खुद पुस्तकालय में चला गया है)। एपीआई स्वयं सरल है, लेकिन सेवा काफी जटिल है (यह अनिवार्य रूप से उस डेटा पर संचालन के साथ डेटास्टोर है)। और फिर, मुझे असली के साथ अपने मॉक को रखना होगा Client

  3. मैं बस परीक्षण करता हूं कि उचित HTTP अनुरोध किए जा रहे हैं। इसका मतलब है कि उन HTTP अनुरोधों को बनाने के लिए Wrapperएक वास्तविक Clientवस्तु के माध्यम से कॉल किया जाएगा , इसलिए मैं वास्तव में इसे अलगाव में परीक्षण नहीं कर रहा हूं। यह इसे एक भयानक इकाई परीक्षण का एक सा बना देता है।

इसलिए मैं इनमें से किसी भी समाधान से विशेष रूप से खुश नहीं हूं। तुम क्या करोगे? क्या इस बारे में जाने का एक सही तरीका है?


मैं इन परिदृश्यों में इकाई परीक्षण से बचने के लिए जाता हूं, जहां एक तीसरा पक्ष पुस्तकालय है जो अधिकतर ग्रुंकवर्क करता है और मेरे पास केवल एक आवरण है (मुख्यतः क्योंकि मुझे नहीं पता कि यह कैसे करना है जो इस तरह से परीक्षण करता है कि वास्तव में कुछ भी सार्थक हो)। आम तौर पर मैं उन मामलों में एकीकरण परीक्षण करता हूं, संभवतः एक मॉक सेवा के साथ। शायद किसी को पता है कि इन के लिए वास्तव में सार्थक इकाई परीक्षण कैसे करना है - मैं हमारे नियंत्रण में प्रणाली में सबसे महत्वपूर्ण घटकों को प्राथमिकता देता हूं। यहाँ महत्वपूर्ण हिस्सा हमारे नियंत्रण से बाहर है। :-(

जवाबों:


10

TLDR : कठिनाई के बावजूद, आपको ग्राहक इकाई परीक्षण के लिए सेवा को स्टुब और उपयोग करना चाहिए।


मुझे यह निश्चित नहीं है कि "दूरस्थ एपीआई क्लाइंट का काम कुछ कॉल जारी करना है, और नहीं, कम नहीं ...", जब तक कि एपीआई में केवल एंडपॉइंट नहीं होते हैं जो हमेशा एक निश्चित स्थिति लौटाते हैं, और न ही उपभोग करते हैं और न ही उत्पादन करते हैं। कोई भी डेटा। यह सबसे उपयोगी एपीआई नहीं होगा ...

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

जैसा कि आप ध्यान दें, आपके पास एकीकरण परीक्षण होना चाहिए जो रैपर से पूर्ण स्टैक को कवर करता है -> ग्राहक -> सेवा -> DB और उससे आगे, लेकिन आपके मुख्य प्रश्न का उत्तर देने के लिए, जब तक कि आपके पास एक ऐसा वातावरण न हो जहां एकीकरण परीक्षण हर हिस्से के रूप में चलाए जा सकें। सीआई बहुत सारे सिरदर्द (साझा परीक्षण डेटाबेस, आदि) के बिना निर्माण करते हैं, आपको एपीआई का एक स्टब बनाने में समय का निवेश करना चाहिए।

स्टब आपको सेवा का एक कार्यशील कार्यान्वयन बनाने देगा, लेकिन सेवा के नीचे किसी भी परत को लागू किए बिना।

इसे पूरा करने के लिए आप डीआई-आधारित समाधान का उपयोग करने पर विचार कर सकते हैं, रिपॉजिटरी पैटर्न के कार्यान्वयन के साथ अन्य संसाधनों के नीचे:

  • REST हैंडलर्स में सभी कार्यात्मक कोड को एक IWhateverRepository पर कॉल के साथ बदलें।
  • REST संसाधनों से निकाले गए कोड, और एक TestWhateverRespository जो इकाई परीक्षण के दौरान उपयोग के लिए डिब्बाबंद प्रतिक्रिया देता है, के साथ एक ProductWhateverRepository बनाएँ।
  • उत्पादन के लिए DI कंटेनर का उपयोग करें या तो विन्यास पर निर्भर करता है, जैसे कि ProductWhateverRepository या TestWhateverRepository DLL / class, आदि।

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

HTH

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