क्या यह वास्तव में एक एपीआई ग्राहक के परीक्षण के लायक है?


38

यह कुछ ऐसा है जो मुझे थोड़ी देर के लिए परेशान कर रहा है। क्या यह वास्तव में एक एपीआई ग्राहक के परीक्षण के लायक है?

मान लें कि आप किसी पालतू जानवर REST API को कॉल-सार-दूर करने के लिए एक छोटा वर्ग बना रहे हैं। पेटशॉप एक बहुत ही सरल एपीआई है, और इसमें विधियों का एक बुनियादी सेट है:

  • listProducts()
  • getProductDetails(ProductID)
  • addProduct(...)
  • removeProduct(ProductID)

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

मुझे पूरा यकीन है कि मुझे कुछ याद आ रहा है, या मुझे छड़ी का गलत अंत मिल गया है, या मैं पेड़ों के लिए लकड़ी नहीं देख रहा हूं। क्या कोई मुझे सही रास्ते पर खड़ा कर सकता है?


1
अगर यह बुनियादी तरीकों से इतना आसान एपीआई नहीं होता, तो क्या आप अलग महसूस करते? यहां तक ​​कि एक शेड को भी बर्फ पर खड़ा होना पड़ता है।
जेएफओ

जवाबों:


31

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

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

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


मम्म, यकीन नहीं होता कि मैं सहमत हूं। आप परीक्षण कर सकते हैं जो foo()पहले कहा जाता है bar(), लेकिन इसका मतलब यह नहीं है कि foo()पहले कॉल bar()करना सही बात है; कोड की तरह एक यूनिट टेस्ट पास होगा भले ही कोड गलत हो। और अगर वह सब क्लाइंट कर रहा है, तो उस मोक्स को सेट करना जो चेक करता है कि अगर foo()पहले बुलाया जाता है, तो bar()कुछ के लिए अपेक्षाकृत परेशानी होती है जिसे क्लाइंट कोड पर सरसरी नज़र से सत्यापित किया जा सकता है।
डोभाल

1
आप परीक्षण कर सकते हैं कि एक add()विधियाँ दो संख्याओं को सही ढंग से जोड़ती हैं, लेकिन इसका मतलब यह नहीं है कि एल्गोरिथ्म में इस बिंदु पर करने के लिए जोड़ना सही है - add()इकाई परीक्षण सफल होगा भले ही आपका कार्यक्रम गलत हो। यदि यह है गलत बात है, तो अपने levenshteinDistance()विधि दोष नहीं है, add()विधि। यह बिल्कुल वैसा ही है। कोड को तरीकों में अलग करने की बात यह है कि प्रत्येक विधि को केवल एक चीज को सही करने के बारे में ध्यान रखना है।
बजे किलियन फोथ

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

2
"इसलिए, इसके परीक्षण को यह सत्यापित करना चाहिए कि यह उन कॉलों को जारी करता है" मुझे लगता है कि वह परिप्रेक्ष्य जिसे मैं देखने में विफल रहा था। धन्यवाद!
फिलिप बी ओल्डम

1
इसलिए उदाहरण के लिए मेरा यूनिट परीक्षण यह जाँच सकता है कि, कुछ मापदंडों को देखते हुए, निष्पादन के बारे में अनुरोध का शरीर सही है?
मारिया इनेस पर्निसारी

9

संक्षिप्त जवाब:

सभी तरीकों को यूनिट-परीक्षण किया जाना चाहिए।

लंबा जवाब:

हाँ। ये इसके लायक है।

ये कुछ चीजें हैं जो उन एपीआई-परीक्षण विधियों पर यूनिट परीक्षण करती हैं जिन्हें परीक्षण करना चाहिए:

  • कि आप एपीआई कॉल के लिए अच्छी तरह से गठित या सही पैरामीटर पारित कर रहे हैं।
  • आप API द्वारा लौटाए गए कुछ प्रकार के डेटा के अनुसार प्रतिक्रिया दे रहे हैं (मॉक किए गए हैं या नहीं), उदाहरण के लिए जब एपीआई एक खाली स्ट्रिंग लौटाता है तो आपके विधि को एक डिफ़ॉल्ट मान (बस एक उदाहरण) वापस करना चाहिए
  • जब एपीआई कॉल एक त्रुटि पैदा करता है तो कॉलर तरीके सही तरीके से व्यवहार करते हैं

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


आप कहते हैं "नकली या नहीं" ... तो क्या वास्तविक एपीआई के खिलाफ परीक्षण करना ठीक है? यूनिट यूनिट की तरह दिखने पर भी क्या मैं इसे इंटीग्रेशन टेस्ट कह सकता हूं? या इसको कॉल करने के लिए एक और चीज है? मुझे यह पसंद है कि मेरे एपीआई रैपर यह कहते हैं कि यह किसी भी तरह से करता है ...
दान रोसेनस्टार्क

1
@DanRosenstark मुझे लगता है कि जिस मामले में एपीआई सेवा का मजाक नहीं उड़ाया जा रहा है, वह एक एकीकरण परीक्षण है।
ट्यूलेंस कोर्डोवा

यदि आप एपीआई में वास्तविक कॉल करते हैं तो आपको 5 सेकंड में पता नहीं चलेगा कि आपको डेटा वापस मिल रहा है या नहीं? चूंकि API मोक्स वास्तविक कॉल नहीं होते हैं, इसलिए यदि वे API बदलते हैं तो वे विफल हो जाते हैं, केवल उसी तरह से ... इस स्थिति में आपके मॉक टेस्ट पास हो जाएंगे, लेकिन वास्तविक कॉल विफल हो जाएंगे। व्यर्थ लगता है
22

5

ये इकाई परीक्षण नहीं होंगे क्योंकि आप अपने सिस्टम के इनपुट और आउटपुट का परीक्षण कर रहे हैं, सीमित एकीकरण परीक्षणों की तरह।

बहुत सावधान रहें जब आप कहते हैं "यह प्रयास की बर्बादी की तरह लगता है और हम कुछ ऐसा परीक्षण कर रहे हैं जो वास्तव में विफल नहीं हो सकता" - यह विफल हो सकता है, यह विफल हो जाएगा, यह संभवतः उन तरीकों से विफल होगा जिन्हें आप अनुमान नहीं लगा सकते हैं, यदि आपके पास परीक्षण नहीं हैं, तो विफलताएं बदतर होंगी।

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

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