मैंने हाल के वर्षों में कई परियोजनाओं के लिए थ्रेड हैंडलिंग कोड लिखते समय इस मुद्दे का कई बार सामना किया है। मैं देर से उत्तर प्रदान कर रहा हूं क्योंकि विकल्प प्रदान करते समय अधिकांश अन्य उत्तर वास्तव में परीक्षण के बारे में प्रश्न का उत्तर नहीं देते हैं। मेरा जवाब उन मामलों को संबोधित किया गया है जहां मल्टीथ्रेड कोड का कोई विकल्प नहीं है; मैं पूर्णता के लिए कोड डिजाइन मुद्दों को कवर करता हूं, लेकिन यूनिट परीक्षण पर भी चर्चा करता हूं।
परीक्षण योग्य मल्टीथ्रेडेड कोड लिखना
पहली बात यह है कि अपने उत्पादन थ्रेड हैंडलिंग कोड को सभी कोड से अलग करना है जो वास्तविक डेटा प्रसंस्करण करता है। इस तरह, डेटा प्रोसेसिंग को एकल रूप से पिरोया कोड के रूप में परीक्षण किया जा सकता है, और केवल वही चीज़ जो मल्टीथ्रेडेड कोड करता है, जो धागों का समन्वय करता है।
याद रखने वाली दूसरी बात यह है कि मल्टीथ्रेड कोड में कीड़े संभावित हैं; वे कीड़े जो खुद को कम से कम बार प्रकट करते हैं वे कीड़े हैं जो उत्पादन में घुस जाएंगे, उत्पादन में भी पुन: पेश करना मुश्किल होगा, और इस प्रकार सबसे बड़ी समस्याएं पैदा होंगी। इस कारण से, कोड को लिखने का मानक कोडिंग दृष्टिकोण और फिर इसे डिबग करना जब तक यह काम करता है मल्टीथ्रेडेड कोड के लिए एक बुरा विचार है; यह कोड में परिणाम देगा जहां आसान कीड़े तय हो गए हैं और खतरनाक कीड़े अभी भी हैं।
इसके बजाय, जब मल्टीथ्रेडेड कोड लिखते हैं, तो आपको उस रवैये के साथ कोड लिखना होगा जिसे आप पहली बार बग्स लिखने से बचने जा रहे हैं। यदि आपने डेटा प्रोसेसिंग कोड को ठीक से हटा दिया है, तो थ्रेड हैंडलिंग कोड काफी छोटा होना चाहिए - अधिमानतः कुछ लाइनें, सबसे कम कुछ दर्जन लाइनें - कि आपके पास बग लिखे बिना इसे लिखने का मौका है, और निश्चित रूप से कई बगों को लिखे बिना। , यदि आप थ्रेडिंग को समझते हैं, तो अपना समय लें, और सावधान रहें।
मल्टीथ्रेड कोड के लिए लेखन इकाई परीक्षण
एक बार मल्टीथ्रेड कोड को जितना संभव हो उतना सावधानीपूर्वक लिखा जाता है, यह उस कोड के लिए अभी भी सार्थक परीक्षण लिख रहा है। परीक्षणों का प्राथमिक उद्देश्य अत्यधिक समय पर निर्भर दौड़ की स्थिति के कीड़े के लिए परीक्षण करने के लिए इतना अधिक नहीं है - ऐसी दौड़ स्थितियों के लिए बार-बार परीक्षण करना असंभव है - बल्कि यह परीक्षण करने के लिए कि इस तरह के कीड़े को रोकने के लिए आपकी लॉकिंग रणनीति कई थ्रेड के लिए बातचीत करने की अनुमति देती है जैसा कि इरादा है ।
सही लॉकिंग व्यवहार का ठीक से परीक्षण करने के लिए, एक परीक्षण में कई थ्रेड्स शुरू होने चाहिए। परीक्षण को दोहराने योग्य बनाने के लिए, हम चाहते हैं कि थ्रेड्स के बीच होने वाली बातचीत पूर्वानुमान योग्य क्रम में हो। हम बाहरी रूप से थ्रेड को टेस्ट में सिंक्रनाइज़ नहीं करना चाहते हैं, क्योंकि यह उन बग्स को मास्क करेगा जो उत्पादन में हो सकते हैं जहां थ्रेड बाहरी रूप से सिंक्रनाइज़ नहीं होते हैं। यह थ्रेड सिंक्रोनाइज़ेशन के लिए टाइमिंग देरी का उपयोग छोड़ देता है, जो कि जब भी मुझे मल्टीथ्रेडेड कोड के परीक्षण लिखने होते हैं, वह तकनीक जिसका मैंने सफलतापूर्वक उपयोग किया है।
यदि देरी बहुत कम हो जाती है, तो परीक्षण नाजुक हो जाता है, क्योंकि मामूली समय अंतर - विभिन्न मशीनों के बीच का कहना है जिस पर परीक्षण चलाए जा सकते हैं - समय के बंद होने और परीक्षण विफल होने का कारण हो सकता है। मैंने आमतौर पर जो किया है वह देरी के साथ शुरू होता है जो परीक्षण विफलताओं का कारण बनता है, देरी को बढ़ाता है ताकि परीक्षण मेरे विकास मशीन पर मज़बूती से पास हो जाए, और उसके बाद देरी को दोगुना कर दें ताकि परीक्षण में अन्य मशीनों पर पास होने का अच्छा मौका हो। इसका मतलब यह है कि परीक्षण में समय की एक बड़ी मात्रा होगी, हालांकि मेरे अनुभव में, सावधानीपूर्वक परीक्षण डिजाइन उस समय को एक दर्जन से अधिक सेकंड तक सीमित कर सकता है। चूँकि आपके आवेदन में थ्रेड कोऑर्डिनेशन कोड की बहुत अधिक जगह होनी चाहिए, जो आपके टेस्ट सूट के लिए स्वीकार्य होनी चाहिए।
अंत में, अपने परीक्षण द्वारा पकड़े गए बगों की संख्या पर नज़र रखें। यदि आपके परीक्षण में 80% कोड कवरेज है, तो आपके लगभग 80% बग्स को पकड़ने की उम्मीद की जा सकती है। यदि आपका परीक्षण अच्छी तरह से डिज़ाइन किया गया है, लेकिन कोई बग नहीं पाता है, तो एक उचित मौका है कि आपके पास अतिरिक्त बग नहीं हैं जो केवल उत्पादन में दिखाई देंगे। यदि परीक्षण एक या दो कीड़े पकड़ता है, तो आप अभी भी भाग्यशाली हो सकते हैं। इसके अलावा, और आप अपने थ्रेड हैंडलिंग कोड की पूरी समीक्षा या फिर से लिखना भी सोच सकते हैं, क्योंकि यह संभावना है कि कोड में अभी भी छिपे हुए कीड़े हैं जो कोड के उत्पादन तक बहुत मुश्किल हैं, और बहुत तब ठीक करना मुश्किल है।