2009-10-22 8 views
18

मैंने पहले से ही this पोस्ट को देखा है लेकिन यह अभी भी जावा के लिए सवाल पूछता है। ऐसा लगता है कि यह किसी ऐप के लिए एक दबदबात्मक मुद्दा होना चाहिए (मैं इस उपयोग के मामले में एक वेब ऐप का परीक्षण कर रहा हूं) जो बहु-थ्रेडेड है। आपने लोगों को इस तरह से कैसे निपटाया है जो आपके धागे को अंतःस्थापित करने की अनुमति देता है - मूल रूप से यादृच्छिक थ्रेड व्यवहार का परीक्षण करना।जावा में मैं प्रभावी ढंग से परीक्षण (इकाई/एकीकरण) समवर्ती कोड कैसे कर सकता हूं?

उत्तर

9

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

यह एक स्थिर कोड विश्लेषक चलाने के लायक भी है। ये चर के असंगत सिंक्रनाइज़ेशन (अन्य चीजों के साथ) उठाएंगे, और तुरंत चिंता के लिए क्षेत्रों को हाइलाइट करेंगे। FindBugs ऐसा एक उपकरण है।

0

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

3

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

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

+0

असल में मैंने इस विज्ञापन-प्रक्रिया विधि को '@ टेस्ट' में आजमाया और यह पंजीकरण भी नहीं किया, थ्रेड एक विधि पर कार्य करता है जो '@ पहले' पहलू को ट्रिगर करता है जो उस थ्रेड पर 'थ्रेडलोकल' सेट करता है थ्रेड एंडपॉइंट पर कहीं और इस्तेमाल किया जाता है - यह जेपीए के आसपास बनाया गया एक जटिल उपयोग केस है, मेरे अस्तित्व का झुकाव इसे एक बहु-थ्रेड परीक्षण को समझना है। हालांकि सामान्य जुनीट ठीक काम करता है। –

0

मेरा उत्तर उन स्थितियों को बनाने से बचने के लिए है जहां आप स्मार्ट डिज़ाइन और मौजूदा तकनीक के न्यायसंगत उपयोग के साथ दौड़ की स्थिति ले सकते हैं। उदाहरण के लिए, यदि आपका एमटी ऐप स्वयं निहित कार्य वस्तुओं का उपयोग करता है, तो आप थ्रेड के बीच संचार तंत्र के रूप में उपयोग करने के लिए अपने आवेदन में एक जेएमएस ब्रोकर एम्बेड कर सकते हैं। इसी प्रकार सिस्टम संसाधनों के साथ जो दौड़ की स्थिति के अधीन हो सकते हैं, उन हिस्सों को बहु-थ्रेडेड न बनाएं। यदि आपके पास ऐसी फाइलें हैं जिन्हें आपको लिखने की आवश्यकता है, तो उन्हें एक थ्रेड जेएमएस उपप्रणाली के माध्यम से पारित जानकारी का उपयोग करके लिखने के लिए जिम्मेदार बनाएं।

आखिरकार इकाई परीक्षण एमटी कोड के लिए संख्याओं के आधार पर कोई पेंट नहीं है यह सुनिश्चित करने के लिए कि यह दौड़ की स्थिति के लिए कमजोर नहीं है।

2

मेरा सुझाव है कि आपको Java Concurrency in Practice मिलें - न केवल आपको बताएगा कि दौड़ की स्थिति से पहले कैसे बचें, परीक्षण समेकन पर एक अनुभाग है।

जावा के लिए उपलब्ध समेकन के लिए स्थिर विश्लेषण उपकरण भी हैं - दुर्भाग्यवश, जबकि मुझे पता है कि वे वहां हैं, मैं उनका मूल्यांकन करने की स्थिति में नहीं हूं।

-1

कोड जो गैर-निर्धारिती थ्रेडिंग समस्याओं के कारण संभवतः विफल हो सकता है परीक्षण नहीं किया जाना चाहिए। इसके बजाए, इसे हटाया जाना चाहिए, और कुछ ऐसा हो सकता है जो हो सकता है।

अधिकांश समय यह सब कुछ एकल-थ्रेडेड बनाकर किया जा सकता है - केवल कुछ छोटे ऐप्स को छोटी स्केलेबिलिटी बूस्ट की आवश्यकता होती है जो प्री-एम्प्टिव शेड्यूलिंग प्रदान करता है। वैकल्पिक रूप से, आप एक थ्रेडिंग आर्किटेक्चर स्थापित कर सकते हैं जहां ओएस, कंपाइलर या थर्ड-पार्टी टूल का उपयोग हार्ड गारंटी प्रदान करने के लिए किया जाता है कि गैर-निर्धारिती संचालन नहीं हो सकता है।

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