2010-12-28 15 views
10

ग्रीटिंग्स स्टैक ओवरफ्लॉवर,यूनिट परीक्षण सॉकेट

मेरे पास एक ऐसा एप्लिकेशन है जिसमें संचार अबास्ट्रक्शन परत मौजूद है। कनेक्टर नामक इस परत में प्रत्येक कार्यान्वयन, मेरे एप्लिकेशन को एक कनेक्टेड पीयर (जैसे: HTTP, टीसीपी सॉकेट, यूडीपी सॉकेट इत्यादि) के साथ डेटा का आदान-प्रदान करने का एक तरीका प्रदान करता है।

उदाहरण के अनुसार, मैं एक Connector_Tcp वर्ग, लिखने, खुला और पास कि तरीकों जैसे पढ़ लागू करता है।

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

मुझे इस वर्ग की इकाई परीक्षण के बारे में कुछ सलाह चाहिए।

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

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

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

आप एक सॉकेट-निर्भर वर्ग की इकाई परीक्षण के बारे में कैसे जाएंगे? प्रत्येक इकाई के लिए एक सॉकेट खोलें? एक सर्वर सर्वर का उपयोग करें, फिर इसे मैन्युअल रूप से परिभाषित सॉकेट संसाधन से कनेक्ट करने और इसका परीक्षण करने के लिए ...?

मुझे लगता है कि मेरी समस्या वास्तव में निम्नलिखित है:

इकाई परीक्षण में विफल रहता है ... कैसे करना है मैं जानता हूँ कि यदि:

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

मैं इकाई परीक्षण की जरूरत है केवल परीक्षण करने के लिए करता है, तो विधि ठीक से या नहीं व्यवहार कर रहा है ...

+1

मैंने कोई वास्तविक PHP विकास नहीं किया है, लेकिन क्या आप अपनी सॉकेट कक्षा से प्राप्त एक नकली कक्षा बना सकते हैं? – Dave

+0

@ डेव: मैं कर सकता हूं। मैं प्रत्येक एकल वर्ग के लिए नकली वस्तुओं का उपयोग करता हूं जिसके लिए एक कनेक्टर की आवश्यकता होती है। मेरी समस्या यह है: मुझे यह सुनिश्चित करने के लिए सॉकेट क्लास का परीक्षण करने की ज़रूरत है कि यह अबास्ट्रक्शन लेयर के सम्मेलनों का सम्मान करता है ... एक नकली वस्तु का परीक्षण करके, यह स्पष्ट रूप से मुझे नहीं बताता है कि सॉकेट क्लास काम करता है या नहीं। – netcoder

+0

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

उत्तर

4

मैंने सी/सी ++ में यद्यपि एक समान अमूर्त परत लिखा है, और मुझे यूनिट-टेस्ट करने का मौका मिला है सॉकेट आधारित कोड। मुझे नहीं पता कि यहां PHP के लिए स्वाभाविक रूप से विशिष्ट कुछ है या नहीं, इसलिए मैं केवल जेनेरिक सलाह दे सकता हूं।

  • अपने सेटअप में एक सर्वर सॉकेट बनाएं, इसे आंसू में बंद करें। इस पर निर्भर करता है कि क्या आप सर्वर सॉकेट से कनेक्ट करने वाले कई क्लाइंट का समर्थन करते हैं, आप परीक्षण विधि में उस भाग को करना चाह सकते हैं।
  • मान लें कि आप अपने क्लाइंट कोड में कनेक्ट करने के लिए पोर्ट निर्दिष्ट कर सकते हैं, सर्वर सॉकेट पोर्ट 0 (क्षणिक बंदरगाह) से बांधें, और उसके बाद क्लाइंट कोड में इसका उपयोग करें। यह पहले से उपयोग में बंदरगाह के लिए बाध्यकारी की समस्या को खत्म कर देगा।
  • अपने सॉकेट पर टाइमआउट सेट करें। यदि आपका परीक्षण कुछ अप्रत्याशित कारणों से विफल रहता है, तो आप नहीं चाहते हैं कि यह हमेशा के लिए कनेक्शन के लिए प्रतीक्षा कर रहा है।
  • आपको क्लाइंट/सर्वर व्यवहार को अंतःस्थापित करने में सक्षम होना चाहिए। उदाहरण के लिए, आप यह जांचना चाहेंगे कि क्या होता है यदि सर्वर क्लाइंट पढ़ने/लिखने के माध्यम से कनेक्शन के आधे रास्ते को बंद कर देता है। या तो एसिंक्रोनस I/O या बहु-थ्रेडिंग नौकरी करेगी। मुझे यकीन नहीं है कि PHP में आपके पास क्या है।
+0

मुझे लगता है कि मुझे सी प्रोग्रामर से सलाह चाहिए, क्योंकि PHP सॉकेट को संभाला जा रहा है। PHP में सॉकेट फ़ंक्शंस सी सॉकेट के समान हैं (वे एक ही स्थिर नामों का भी उपयोग करते हैं!)। ऐसा कहा जा रहा है, मुझे लगता है कि आपने मुझे सही दिशा में इंगित किया था।पोर्ट 0 पर बाध्यकारी और 'होटॉकनाम' का उपयोग करके, मैं उस बंदरगाह संख्या को पुनर्प्राप्त कर सकता हूं जिस पर सर्वर ने पहले से उपयोग किए जा रहे बंदरगाहों के बारे में चिंता किए बिना, ग्राहक को बाध्य किया है और उससे कनेक्ट किया है। मुझे इसके बारे में पहले सोचना चाहिए था! आपका बहुत बहुत धन्यवाद! – netcoder

+0

ओह और बहु-थ्रेडिंग और एकाधिक समवर्ती कनेक्शन के लिए, मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है। इसकी देखभाल करने वाली एक और कक्षा है, इसलिए मुझे यहां सॉकेट का परीक्षण करना है। – netcoder

2

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

उदाहरण के लिए, आप एक यूनिट परीक्षण लिख सकते हैं जो सॉकेट मॉक इंस्टेंस को "बंदरगाह उपलब्ध नहीं है" अपवाद फेंकने के लिए कहता है। उस स्थिति में, आप जोर दे सकते हैं कि आपकी विधि ने अपवाद पकड़ा और इसे उसी पाठ के साथ लॉग किया जो अपवाद में था।

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

तो आप वास्तव में सॉकेट का परीक्षण नहीं कर रहे हैं। आप कुछ घटनाओं को अनुकरण करने के लिए सॉकेट सेट अप कर रहे हैं, और आप यह देखने के लिए परीक्षण कर रहे हैं कि सॉकेट के साथ काम करने वाला आपका कोड सही चीजें कर रहा है या नहीं।

(मैंने जावा, सी #, रूबी और जावास्क्रिप्ट में मॉकिंग फ्रेमवर्क का उपयोग किया है। मैंने कभी PHP के साथ काम नहीं किया है, लेकिन मुझे लगता है कि इसके लिए कुछ अच्छे मॉकिंग फ्रेमवर्क हैं)।

संपादित करें: हां, वहां PHP के लिए कुछ मॉकिंग फ्रेमवर्क हैं। मैं एक की सिफारिश नहीं कर सकता, लेकिन यहां एक जोड़ा है जो मैं खोजने में सक्षम था: PHPUnit और LastCraft

+0

आपके उत्तर के लिए धन्यवाद। मैं पहले से ही PHPUnit का उपयोग कर रहा हूँ। दुर्भाग्य से, जावा और सी # के विपरीत, जो मुझे भी पता है, PHP में सॉकेट सी/सी ++ सॉकेट के बहुत करीब हैं। वास्तव में, PHP सी पुस्तकालय के लिए एक रैपर का उपयोग करता है। PHP सॉकेट ऑब्जेक्ट्स नहीं हैं, लेकिन संसाधन (अधिक या कम पॉइंटर्स) माना जाता है, जो कि आदिम प्रकार की तरह अधिक होते हैं, इस प्रकार मजाक नहीं किया जा सकता है। मेरी कक्षाएं उन सॉकेट फ़ंक्शंस के लिए रैपर हैं, और मुझे यह सुनिश्चित करने की ज़रूरत है कि वे टकराव के कारण विफल होने के बिना * झूठी *, * शून्य * या डेटा लौटाएं। मुझे लगता है कि @axw का जवाब मुझे चाहिए। बहुत बहुत धन्यवाद! – netcoder

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