एक REST सर्वर के विरुद्ध REST क्लाइंट का परीक्षण करना। फिक्स्चर कैसे करें?


10

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

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

लेकिन जब हमने REST सर्वर को REST क्लाइंट से अलग कर दिया है तो क्या होगा?

हम यह सुनिश्चित करना चाहते हैं कि हमारा REST क्लाइंट न केवल सही ढंग से पढ़ रहा है, बल्कि सही तरीके से बना रहा है, अपडेट कर रहा है और हटा रहा है।

मैं दूरस्थ परीक्षण REST सर्वर के खिलाफ ऐसा करने के लिए कोई उदाहरण या सुझाव नहीं पा सका हूं

यह मानकर कि मुझे केवल फिक्स्चर परोसने वाला परीक्षण परीक्षण सर्वर मिला है। HTTP की संपूर्ण स्टेटलेस प्रकृति का अर्थ है कि "BEGIN TRANSACTION" और "ROLLBACK TRANSACTION" या "RELOAD FIXTURES" प्रकार का संदेश भेजना कठिन होगा, है ना?

मैं ऐसा करने वाला पहला व्यक्ति नहीं हो सकता, इसलिए मुझे इस बारे में सोचने का एक अलग तरीका चाहिए।

कोई सुझाव?


शायद, चूंकि यह एक परीक्षण सर्वर है, आपके पास एक समापन बिंदु हो सकता है जो जुड़नार को फिर से लोड करेगा?
डेविड रेडक्लिफ

यदि आपकी मुख्य समस्या आपके परीक्षण सर्वर को पूर्वनिर्धारित स्थिति में वापस लाने की है, तो आप अपने बाकी एपीआई के लिए "RELOAD TESTDATA" जैसे कुछ विशेष परीक्षण कार्यों को क्यों नहीं जोड़ना चाहते हैं? बेशक, आपको यह सुनिश्चित करना चाहिए कि उत्पादन में किस तरह की एपीआई कॉल उपलब्ध नहीं है।
डॉक्टर ब्राउन

जवाबों:


7

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

इसके लिए मैं सिफारिश करेंगे के खिलाफ आप क्या करने की कोशिश कर रहे हैं क्या कर रहे।

विशेष रूप से:

हम यह सुनिश्चित करना चाहते हैं कि हमारा REST क्लाइंट न केवल सही ढंग से पढ़ रहा है, बल्कि सही तरीके से बना रहा है, अपडेट कर रहा है और हटा रहा है।

इसके बजाय मैं क्या सुझाव दूंगा:

  • आपके REST क्लाइंट के लिए भवन परीक्षण, यह सुनिश्चित करने के लिए कि यह विशिष्ट इनपुट और आउटपुट को देखते हुए सही ढंग से व्यवहार करता है। अच्छे (अपेक्षित) और बुरे (अप्रत्याशित) मूल्यों के लिए खाता।

  • अपने इच्छित सेवा के अनुसार व्यवहार करने के लिए, अपनी REST सेवा के लिए भवन परीक्षण (यदि आप इसे नियंत्रित करते हैं, तो वह है)

  • परीक्षण को उनके समस्या डोमेन के करीब रखें, ताकि वे उस संदर्भ में महत्वपूर्ण होने के डिजाइन और विकास को निर्देशित करने में मदद कर सकें


3
आप एकीकरण परीक्षणों के पूरे विचार को यहाँ आकस्मिक रूप से खारिज करते हैं। मुझे नहीं लगता कि इस दृष्टिकोण को अभ्यास से सूचित किया गया है।
फेबेलिंग

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

एक एपीआई का मजाक उड़ाना समस्या को हल करने का एक शानदार तरीका है। लेकिन आप यह कैसे सुनिश्चित करते हैं कि एपीआई == वास्तविक एपीआई का मजाक उड़ाया जाए?
FrEaKmAn

4

यहाँ ध्यान रखने के लिए दो कोण:

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

2

मुझे लगता है कि क्लाइंट का परीक्षण करने के लिए REST सर्वर प्रतिक्रियाएं बनाना सबसे अच्छा तरीका है।

रूबी के लिए, फेकवेब रत्न है जिसका उपयोग आप नकली प्रतिक्रियाओं का उपयोग करने के लिए कर सकते हैं - https://github.com/chrisk/febeweb

इसके अलावा, जावास्क्रिप्ट में आप Sinon.JS जैसी किसी चीज़ का उपयोग कर सकते हैं, जो आपको एक नकली सर्वर देता है - http://sinonjs.org/docs/#fakeServer


1

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

एक काल्पनिक अजगर ग्राहक लें जो urllib2अनुरोध करने के लिए उपयोग करता है । आपके पास शायद क्लाइंट में कुछ विधि है, चलो इसे कॉल करें get(), इसमें कॉल है urllib2.Request()। आपको केवल अपनी कक्षा के लिए कॉल को मॉक करने की आवश्यकता है get()

@patch('your.Client.get')
def test_with_mock(self, your_mock):
    your_mock.return_value({'some': 'json'})
    test_obj = your.Client.get_object(5)
    your_mock.assert_called_with('/the/correct/endpoint/5')

यह बहुत ही सरल उदाहरण पायथन की मॉक लाइब्रेरी का उपयोग करता है एक काल्पनिक your.Clientवर्ग का परीक्षण करने के लिए एक get_object()विधि के साथ जो कुछ एपीआई से कुछ प्राप्त करने के लिए सही यूआरएल उत्पन्न करता है। अनुरोध करने के लिए ग्राहक get()उस url के साथ अपनी विधि कहता है । यहां, उस पद्धति का मजाक उड़ाया गया है ( your.Client.get"पैच" है ताकि यह नियंत्रण में हो your_mock), और परीक्षण यह जांचता है कि क्या सही समापन बिंदु का अनुरोध किया गया था।

नकली विधि कॉन्फ़िगर की गई JSON प्रतिक्रिया ( your_mock.return_value) को वापस करती है जिसे क्लाइंट को संभालना चाहिए और आप परीक्षण करने के लिए आगे के दावे करेंगे कि यह अपेक्षित डेटा को अपेक्षित तरीके से नियंत्रित करता है।


लेकिन आप यह कैसे सुनिश्चित कर रहे हैं कि जब आप "सही" अनुरोध कर रहे हैं कि यह एक वास्तविक अधिकार (उत्पादन में) अनुरोध है? क्योंकि अगर मैं आपके सुझाव को समझता हूं, अगर एपीआई बदलता है या टूटता है, तो आपके परीक्षण अभी भी काम करेंगे। जबकि उत्पादन में यह पूरी तरह से अलग कहानी है।
FrEaKmAn

1

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

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

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

यदि आपको लगता है कि यह बहुत अधिक है (अनुचित के अर्थ में) प्रयास है, तो विचार करें कि डेटाबेस के लिए जुड़नार के साथ दृष्टिकोण बस यही करता है: डेटाबेस या एप्लिकेशन राज्य में हेरफेर करने के लिए अतिरिक्त, परीक्षण-विशिष्ट साधनों का उपयोग करना।

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


1

बंदर पैच

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

लाभ

  • सर्वर स्टार्टअप के साथ सिंक्रनाइज़ करने के लिए नहीं है (क्योंकि कोई सर्वर नहीं है)
  • जुड़नार जैसी चीजों का प्रबंधन करने के लिए क्लासिक यूनिट सेटअप और टियरडाउन विधि का लाभ उठाएं
  • परीक्षण के अधिक बारीक दाने के नियंत्रण के लिए मॉक / स्टब्स और अन्य बंदर पैच का उपयोग करने की क्षमता
  • एक xUnit फ्रेमवर्क का उपयोग करके लिखा जा सकता है

समझौतों से

  • बहु-प्रक्रिया इंटरैक्शन / मुद्दों (लॉकिंग, संसाधन भुखमरी, आदि) को उजागर नहीं करता है
  • मल्टी-सर्वर समस्याओं (डेटा क्रमांकन, क्लस्टरिंग शैली) को उजागर नहीं करता है
  • नेटवर्क मुद्दों का पर्दाफाश नहीं करता है क्योंकि यह नकली है (पहुंच, टाइमआउट त्रुटियां, आदि)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.