2010-10-28 13 views
15

मैं एक पायथन क्लाइंट + सर्वर लिख रहा हूं जो संचार के लिए gevent.socket का उपयोग करता है। क्या कोड के सॉकेट-स्तरीय ऑपरेशन का परीक्षण करने के कोई अच्छे तरीके हैं (उदाहरण के लिए, सत्यापित करना कि किसी अवैध प्रमाणपत्र वाले SSL कनेक्शन अस्वीकार कर दिए जाएंगे)? या यह spawn एक वास्तविक सर्वर के लिए सबसे आसान है?पायथन: यूनिट परीक्षण सॉकेट-आधारित कोड?

संपादित करें: मुझे विश्वास नहीं है कि "बेवकूफ" मॉकिंग जटिल जटिलताओं के कारण एसएसएल घटकों का परीक्षण करने के लिए पर्याप्त होगा। क्या मैं उसमें गलत हूँ? या एसएसएल की सामग्री का परीक्षण करने का एक बेहतर तरीका है?

उत्तर

15

आप आसानी से एक सर्वर शुरू कर सकते हैं और फिर परीक्षण मामले में इसका उपयोग कर सकते हैं। गीवेंट का own test suite ठीक है कि गीवेन्ट के built-in servers का परीक्षण करने के लिए।

उदाहरण के लिए:

class SimpleServer(gevent.server.StreamServer): 

    def handle(self, socket, address): 
     socket.sendall('hello and goodbye!') 

class Test(unittest.TestCase):  

    def test(self): 
     server = SimpleServer(('127.0.0.1', 0)) 
     server.start() 
     client = gevent.socket.create_connection(('127.0.0.1', server.server_port)) 
     response = client.makefile().read() 
     assert response == 'hello and goodbye!' 
     server.stop() 

बंदरगाह मूल्य के लिए 0 उपयोग करने का अर्थ सर्वर किसी भी उपलब्ध पोर्ट का उपयोग करेगा। सर्वर शुरू होने के बाद, bind द्वारा चुना गया वास्तविक मूल्य विशेषता के रूप में उपलब्ध है।

StreamServer का समर्थन करता है भी एसएसएल, निर्माता को keyfile और certfile तर्क गुजरती हैं और यह इसे अपने हैंडलर को पार करने से पहले SSLObject के साथ प्रत्येक सॉकेट लपेट होगा।

आप StreamServer उपयोग नहीं करते हैं और अपने सर्वर Greenlet पर आधारित है तो वास्तव में spawning यह आपको क्या करना चाहिए है। परीक्षण मामले के अंत में kill को मत भूलना।

एक सर्वर शुरू करना और एक ग्रीनलेट स्पॉइंग करना gevent में तेजी से संचालन है, जो एक नया धागा या प्रक्रिया बनाने से बहुत तेज़ है और आप प्रत्येक टेस्ट केस के लिए आसानी से एक नया सर्वर बना सकते हैं। जैसे ही आपको सर्वर की आवश्यकता नहीं है, बस सफाई करना न भूलें।

मुझे विश्वास है कि किसी भी gevent एपीआई का नकल करने की कोई आवश्यकता नहीं है, सर्वर के रूप में इसका उपयोग करना बहुत आसान है और ग्राहक खुशी से उसी प्रक्रिया में रह सकते हैं।

+0

यदि आपके पास कई परीक्षण हैं जो सभी एक सरल सर्वर बनाते हैं (ध्यान दें कि पोर्ट नंबर समान है) और इन परीक्षणों को समानांतर में चलाएं, तो आप या तो डेडलॉक्स या परीक्षण विफलताओं को प्राप्त करेंगे। – Sardathrion

+1

मेरे उदाहरण में पोर्ट नंबर शून्य है, जिसका अर्थ है कि बाइंड() को एक मुफ्त बंदरगाह मिलेगा और इसका उपयोग करेगा। –

+0

अगर यह एक अलग ग्रीनलेट में पैदा नहीं होता है तो यह कैसे प्रतिक्रिया करता है? क्या 'कनेक्ट' और 'पढ़ा' अंतर्निहित अवरोध है? हालांकि, हरे रंग के coroutines की सादगी और शक्ति के बारे में महान उदाहरण :) – schlamar

7

एक और (आईएमओ बेहतर) तरीका है: आपको जिस पुस्तकालय का उपयोग कर रहे हैं उसका नकल करना चाहिए। पायथन के लिए एक उदाहरण मॉकिंग सहायक mox है।

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

+0

मुझे नहीं लगता कि यह इतना आसान है ... डिज़ाइन द्वारा, एसएसएल को फिर से नहीं चलाया जा सकता है ... इसलिए मुझे यकीन नहीं है कि मैं एक एसएसएल हैंडशेक का मज़ाक उड़ाता हूं। –

+0

मैंने यह नहीं कहा कि आप अपनी लाइब्रेरी को मोक्स के साथ नकल कर सकते हैं, मैंने केवल इतना कहा है कि आपको इसे किसी तरह से नकल करना चाहिए। ऐसे मामलों में मैं कभी-कभी एक डमी क्लास को हाथ से लिखता हूं जो मोक्स के साथ नकली करना मुश्किल या असंभव है। शायद आपको mox के साथ gevent.ssl ​​नकली करना चाहिए? आप वास्तव में क्या कर रहे हैं, क्या आप स्वयं एसएसएल हैंडशेक लागू कर रहे हैं? यदि नहीं, तो आप इसे आसानी से नकल करने में सक्षम होना चाहिए। –

+0

मुझे परीक्षणों में 'gevent.ssl' को हैंडशेक चलाने की ज़रूरत है ताकि मैं यह सत्यापित कर सकूं कि यह उन त्रुटियों को उठाता है जो मुझे उम्मीद है (और कनेक्शन स्वीकार करता है जो मुझे लगता है कि इसे स्वीकार करना चाहिए)। आप सही कह रहे हैं, एक बार कनेक्शन स्थापित होने के बाद, मैं बातचीत को नकल कर सकता हूं ... लेकिन यह जो भी मैं चाहता हूं उसे काफी कवर नहीं करता है। –

6

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

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

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