हाल ही में, मैंने स्टैक ओवरव्लो पर एक प्रश्न पूछा (और उत्तर दिया) कि एक इकाई परीक्षण स्वयं द्वारा चलाए जाने पर क्यों काम करेगा और फिर यूनिट परीक्षणों के पूरे बैच के साथ चलने पर स्पोरैडिक रूप से विफल हो जाएगा। यहां देखें: SQL Server and TransactionScope (with MSDTC): Sporadically can't get connectionकचरा कलेक्टर यूनिट परीक्षणों के साथ कैसे काम करता है?
यूनिट परीक्षण एक समय में चलते समय गुज़रने के बाद और फिर एक साथ चलने में असफल होने का एक क्लासिक संकेत है कि कोड के साथ कुछ गंभीरता से गलत है।
मुझे पता चला कि संसाधन संसाधन का थोड़ा सा हिस्सा है। एक SQL सर्वर से कनेक्शन को रिहा करने के लिए एक सूक्ष्म त्रुटि के कारण, मैं कनेक्शन से बाहर चला रहा था और परीक्षण विफल रहे थे। AFAIK, यह लगभग एक स्मृति रिसाव की तरह काम करता है; कनेक्शन को कनेक्शन पूल से आवंटित किया जाता है और कभी भी मुक्त नहीं किया जाता है क्योंकि स्मृति आवंटित की जा सकती है और फिर मुक्त नहीं होती है।
हालांकि, यह मुझे एक परेशान प्रश्न के साथ छोड़ देता है? मेरे परीक्षणों को एक समय में चलाने और उन्हें सूट के रूप में चलाने के बीच क्या अंतर है? यदि परीक्षण एक समय में एक बार चलाते हैं और फिर एक साथ चलते समय असफल होते हैं, तो परीक्षण रनों के बीच कुछ प्रकार का क्लीन-अप होना चाहिए जो केवल तब होता है जब परीक्षण एक समय में चलते हैं।
मुझे अनुमान है कि यह .net कचरा कलेक्टर क्या करता है या परीक्षणों के बीच नहीं करता है। एक मामले में, कनेक्शन परीक्षण के बीच मुक्त कर रहे हैं; एक और मामले में, वे नहीं हैं।
मैं इसे कैसे समझा सकता हूं?
अद्यतन: आप में से उन लोगों के लिए कोड के विनिर्देशों के बारे में पूछना, यह आसान है। मैं अपनी सेटअप विधि में एक नया TransactionScope
ऑब्जेक्ट घोषित करता हूं और इसे अपने Teardown
विधि में निपटान करता हूं। हालांकि, समस्या परीक्षण 100 परीक्षण मामलों के साथ एक डेटा संचालित परीक्षण था; परीक्षण के तहत कोड ने SqlHelper वर्ग का उपयोग करके एक चयनित कथन से SqlDataReader
ऑब्जेक्ट को पॉप्युलेट किया और फिर SqlDataReader
पर बंद विधि को कॉल नहीं किया। क्योंकि मैंने एसक्लहैल्टर क्लास का उपयोग एसक्लडाटा रीडर प्राप्त करने के लिए किया था, इसलिए मुझे उम्मीद थी कि कनेक्शन मेरे लिए संभाले गए थे। ऐसा नहीं!
लेकिन को स्पष्ट करने के लिए, मैं अपनी विशिष्ट स्थिति के बारे में नहीं पूछ रहा हूं। मैं क्या जानना चाहता हूं: आम तौर पर, संसाधनों के बीच संसाधनों को कैसे मुक्त किया जाता है? मुझे लगता है कि यह कचरा कलेक्टर का कुछ आवेदन होगा। मुझे आश्चर्य है कि कचरा कलेक्टर अभी भी पिछले टेस्ट रन (रेस कंडीशन?)
अपडेट: यूनिट टेस्ट के साथ कचरा संग्रह के बारे में मुझे क्या पता है। अपनी जिज्ञासा के बाद, मैंने यूनिट परीक्षणों को खींच लिया जो असफल रहे क्योंकि SqlDataReader
ऑब्जेक्ट द्वारा कनेक्शन खोला गया था। मैंने प्रत्येक परीक्षण के अंत में System.GC.Collect()
जोड़ने का प्रयास किया। इसने कनेक्शन को सफलतापूर्वक मुक्त कर दिया, लेकिन ~ 50% प्रदर्शन जुर्माना लगाया।
यदि आप कनेक्शन से बाहर हो रहे हैं क्योंकि आप परीक्षणों के बीच उनमें से पर्याप्त रिलीज नहीं करते हैं, तो मुझे संदेह होगा कि आपके आंसू के तरीकों में कोई समस्या है। उन्हें एक समय में चलाने पर, ओएस कुछ आंसू का ख्याल रखता है, लेकिन सूट के रूप में चलाता है आपका संसाधन उपयोग लंबे समय तक चलता रहता है। – MikeD
हो सकता है कि आपको कहीं और कुछ 'निपटान' या 'बंद करें' कॉल कहीं और चाहिए? – Gabe