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