2013-02-05 5 views
6

मैं एक लोकप्रिय एपीआई के लिए क्लाइंट लाइब्रेरी पर काम कर रहा हूं। वर्तमान में, कहा गया क्लाइंट के मेरे सभी यूनिट परीक्षण एक परीक्षण खाते के खिलाफ वास्तविक एपीआई कॉल कर रहे हैं।मैं पाइथन के साथ एक एपीआई क्लाइंट का परीक्षण कैसे करूं?

def test_get_foo_settings(self): 
    client = MyCustomClient(token, account) 
    results = client.get_foo_settings() 

    assert_is(type(results), list) 

मैं अपने परीक्षण खाते के खिलाफ वास्तविक API कॉल बनाना बंद करना चाहते हैं:

यहाँ एक उदाहरण है।

मुझे इससे कैसे निपटना चाहिए? क्या मुझे क्लाइंट और प्रतिक्रिया के लिए कॉल करने के लिए Mock का उपयोग करना चाहिए?

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

किसी भी दिशा और/या मेरे प्रकार के परिदृश्य में नकली का उपयोग करने के नमूने की सराहना की जाएगी।

+0

मैं सिर्फ 'कहा जाता fudge', आपको लगता है कि बाहर की जाँच हो सकता है परीक्षण के लिए एक दिलचस्प मॉड्यूल के बारे में सीखा। – BenDundee

उत्तर

6

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

उदाहरण के लिए, सेवा HTTP का उपयोग करता है और आप अनुरोध का उपयोग कर रहे सेवा से संपर्क करने के लिए यदि:

class MyClient(…): 
    def _do_get(self, suffix): 
     return requests.get(self.service_url + "/" + suffix).json() 

    def do_stuff(self): 
     return self._do_get("stuff") 

फिर, के लिए:

class MyClient(…): 
    def do_stuff(self): 
     result = requests.get(self.service_url + "/stuff") 
     return result.json() 

मैं पहली बार अनुरोध के चारों तरफ छोटे आवरण लिखते थे परीक्षण, मैं प्रासंगिक कार्यों का मज़ाक उड़ाऊंगा:

class MyClientWithMocks(MyClient): 
    def _do_get(self, suffix): 
      self.request_log.append(suffix) 
      return self.send_result 

और इस तरह के परीक्षणों में इसका उपयोग करें:

def test_stuff(self): 
    client = MyClientWithMocks(send_result="bar") 
    assert_equal(client.do_stuff(), "bar") 
    assert_contains(client.request_log, "stuff") 

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

+0

यह उत्तर कुछ और स्पष्टीकरण से लाभान्वित होगा * क्यों * आप इस दृष्टिकोण को पसंद करते हैं, [इस सवाल] के रूप में (http://stackoverflow.com/q/37885554/3001761) सुझाव देता है! – jonrsharpe

+0

क्या आप अनुरोधों की नकल नहीं करेंगे .get() और क्या यह do_stuff() कॉल _do_get() को do_get() से वापसी मान के बजाय अधिक समझ में आता है? –

संबंधित मुद्दे