2009-12-31 16 views
14

के लिए SimpleHTTPServer का उपयोग करना मैं एक पायथन मॉड्यूल लिख रहा हूं जो एक निश्चित वेब सेवा API को लपेटता है। यह सभी आरईएसटी है, इसलिए कार्यान्वित करने के लिए अपेक्षाकृत सरल है।यूनिट परीक्षण

हालांकि, जब यूनिट परीक्षण की बात आती है तो मुझे एक समस्या मिली: क्योंकि मैं उन मॉडलों को नहीं चलाता जिनके लिए मैंने यह मॉड्यूल बनाया है, मैं उन्हें हथौड़ा नहीं बनाना चाहता, लेकिन साथ ही, मुझे पुनर्प्राप्त करने की आवश्यकता है मेरे परीक्षण चलाने के लिए डेटा। मैंने SimpleHTTPServer को देखा, जो ठीक होगा।

मैंने अपने मुद्दे का एक हिस्सा हल किया, लेकिन अब, क्योंकि मैं थ्रेड को समाप्त नहीं कर सकता, मुझे एक बार से अधिक परीक्षण एप्लिकेशन लॉन्च करते समय "उपयोग में पहले से ही पता" के साथ समस्याएं मिलती हैं।

यहां कुछ नमूना कोड

PORT = 8001 

handler = SimpleHTTPServer.SimpleHTTPRequestHandler 

httpd = SocketServer.TCPServer(("", PORT), handler) 

httpd_thread = threading.Thread(target=httpd.serve_forever) 
httpd_thread.setDaemon(True) 
httpd_thread.start() 

api_data = urllib.urlopen("http://localhost:8001/post/index.json") 
print "Data start:" 
print json.load(api_data) 

कहाँ "index.json" एक नकली JSON फ़ाइल जो असली बात विकल्प मैंने बनाया है। कार्यक्रम समाप्त होने के बाद मैं चीजों को अच्छी तरह से कैसे साफ कर सकता हूं?

+0

SimpleHTTPServer वास्तव में सबसे आसान तरीका होना चाहिए। आप किस तरह की समस्याएं कर रहे हैं? – balpha

+0

मैंने चीजों को दोहराया, मुझे उम्मीद है कि यह अब स्पष्ट है। – Einar

उत्तर

11

एक subclass of TCPServer with allow_reuse_address set True उपयोग करके देखें:

class TestServer(SocketServer.TCPServer): 
    allow_reuse_address = True 

... 
httpd = TestServer(("", PORT), handler) 
+0

शानदार! अच्छा और सरल – Claudiu

+0

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

4

हम wsgiref पर बनाए गए सर्वर का उपयोग करते हैं। http://docs.python.org/library/wsgiref.html

इस सर्वर में सुविधाओं को जोड़ने के लिए बहुत आसान है क्योंकि हम इकाई परीक्षण जोड़ते हैं।

हम subprocess के साथ सर्वर शुरू करते हैं। http://docs.python.org/library/subprocess.html?highlight=subprocess#module-subprocess

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

हमारे पास वास्तव में एक छोटा डब्लूएसजीआई एप्लीकेशन है जो सर्वर को एक उचित रूप से नियंत्रित तरीके से बंद कर देता है ताकि लॉग ठीक से बंद हो जाएं।

+0

वास्तव में, लगता है कि उपप्रोसेस एक अच्छा विकल्प हो सकता है। आगे की जांच करेंगे। – Einar

4

पुराना धागा लेकिन यहाँ जवाब मुझे मदद नहीं की, मैं HTTPServer उपयोग कर रहा हूँ, और (प्रत्येक इकाई परीक्षण के बाद नीचे बंद डिफ़ॉल्ट HTTPServer द्वारा allow_reuse_address = 1 सेट है)। हालांकि मुझे अभी भी शटडाउन कॉल करने के बाद उपयोग में समस्या का पता चला है। मैंने उपयोग किया:

from BaseHTTPServer import HTTPServer 

class MyHTTPServer(HTTPServer): 
    def shutdown(self): 
     self.socket.close() 
     HTTPServer.shutdown(self) 

यह सुनिश्चित नहीं है कि यह डिफ़ॉल्ट रूप से क्यों नहीं होता है? क्या यह इष्टतम नहीं हो सकता है?

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