मैं एक बहुत ही अजीब समस्या से निपट रहा हूं। प्रारंभ में, मैंने सोचा था कि यह टेस्ट डेटा साफ करने में एक समस्या थी ... लेकिन मेरे टेस्ट डेटा क्लीनअप कोड को पूरी तरह से रीफैक्टर करने के बाद और अभी भी वही व्यवहार देख रहा है ... मुझे नुकसान है।एमएसटीएस्ट यूनिट परीक्षण (वीएस 2012) बनाम एसक्यूएल सर्वर, इंटरमीटेंट प्राथमिक कुंजी टकराव
मेरे पास विभिन्न कक्षाओं में 245 यूनिट परीक्षण विधियां हैं। प्रत्येक वर्ग का अपना अनूठा परीक्षण डेटा होता है, और मैं उन वस्तुओं को प्रारंभ करता हूं, और फिर प्रत्येक परीक्षण विधि में डेटा को आमतौर पर डेटाबेस में डाला जाता है और फिर परीक्षणों में छेड़छाड़ की जाती है। प्रत्येक टेस्ट क्लास में क्लास क्लेनअप विधि होती है जो डेटाबेस से सभी टेस्ट डेटा साफ़ करती है, और क्लासक्लेनअप भी टेस्टइनाइज़िलाइज पर चलाया जाता है, यह सुनिश्चित करने के लिए कि किसी अन्य टेस्ट विधि को चलाने से पहले सबकुछ साफ़ हो जाए।
जब मैं वीएस 2012 टेस्ट एक्सप्लोरर का उपयोग करके "सभी चलाएं", 22 परीक्षण विफल हो जाते हैं। वे सभी प्राथमिक कुंजी बाधा उल्लंघन के कुछ बदलाव के साथ असफल हो जाते हैं। मतलब, जब वे इन परीक्षणों के लिए डेटा प्रारंभ कर रहे हैं, तो डेटा उस कक्षा में पिछले परीक्षण विधि से साफ़ नहीं किया गया था। यदि मैं सभी परीक्षणों को फिर से चलाता हूं, तो मुझे हर बार असफल परीक्षण मिलते हैं। यह काफी प्रतिलिपिबद्ध है। कोई फर्क नहीं पड़ता कि मैं कितनी बार सभी परीक्षण चलाता हूं। प्राथमिक 27 उल्लंघनों के साथ ये 27 परीक्षण विफल हो गए हैं।
हालांकि, अजीब बात यह है कि अगर मैं केवल उन असफल परीक्षणों को फिर से चलाता हूं, केवल 9 परीक्षण विफल हो जाते हैं। यह भी पुन: उत्पन्न होता है, जिसका अर्थ है, इससे कोई फर्क नहीं पड़ता कि मैं केवल 27 इन असफल परीक्षणों को कितनी बार चलाता हूं, 14 असफल हो जाएंगे, और शेष पास हो जाएंगे। यह जारी है क्योंकि मैं केवल असफल परीक्षण चलाता हूं, जब तक कि मैं उस बिंदु पर न जाऊं जहां कोई भी परीक्षण विफल न हो। यह भी ध्यान दिया जाना चाहिए कि यदि मैं प्रत्येक टेस्ट क्लास को व्यक्तिगत रूप से चलाता हूं, तो सब कुछ गुजरता है।
मुझे पता है कि यह कैसा दिखता है।
"आप स्पष्ट रूप से अपने परीक्षण डेटा को साफ नहीं कर रहे हैं।" यदि वह मामला था, तो मुझे हर दौड़ पर असफल परीक्षण देखना चाहिए, इससे कोई फर्क नहीं पड़ता। उन 27 परीक्षणों को हर रन में असफल होना चाहिए, न कि जब मैं सब कुछ चलाता हूं।
"कक्षाओं और चीजों के बीच आपके पास अद्वितीय प्राथमिक कुंजी नहीं होनी चाहिए।" ऊपर देखो। यहां तक कि अगर मेरी कक्षाओं में प्राथमिक कुंजी दोहराई गई थी (जो मैं नहीं करता, क्योंकि मैंने अलग-अलग वर्गों के भीतर परीक्षण डेटा पर प्राथमिक कुंजी की विशिष्टता को व्यक्तिगत रूप से तीन बार जांच लिया है), क्योंकि ये परीक्षण अलग-अलग धागे पर एक साथ नहीं चलते हैं (जिसे थ्रेडआईडी लॉगिंग करके सत्यापित किया गया है), किसी दिए गए परीक्षण के लिए क्लीनअप कोड डुप्लीकेट डेटा को साफ करेगा, भले ही।
"आपको कनेक्शन पूलिंग का उपयोग नहीं करना चाहिए।" नहीं, वास्तव में मैं हूं। और मैंने एसक्यूएल प्रोफाइलर का उपयोग करके सत्यापित किया है कि अनुरोध निश्चित रूप से पूल किए गए हैं। इसके अलावा, क्योंकि ये परीक्षण समानांतर में नहीं चल रहे हैं, केवल एक कनेक्शन धागा है।
"आपको कनेक्शन पूलिंग का उपयोग नहीं करना चाहिए।" खैर, हाँ, मुझे चाहिए, क्योंकि अंतर्निहित कोडेबेस विभिन्न वेब परियोजनाओं का समर्थन करता है, लेकिन तर्क के लिए मैंने कनेक्शन पूलिंग अक्षम (पूलिंग = कनेक्शन स्ट्रिंग में झूठी का उपयोग करके) के सभी परीक्षणों को चलाने का प्रयास किया और मुझे सटीक परिणाम मिलते हैं। व्यवहार में कोई बदलाव नहीं, जो भी हो।
"आपके स्थानीय पर्यावरण में कुछ गड़बड़ होना चाहिए।" मुझे अन्य सहयोगियों के देव बक्से (जो संयोग से एसक्यूएल 2012 का उपयोग करते हैं) पर भी इन परीक्षणों को चलाने वाले एक ही परिणाम मिलते हैं। यह मेरे पर्यावरण, या यहां तक कि SQL सर्वर के मेरे संस्करण के लिए अद्वितीय नहीं है।
"आपको कमांड लाइन से mstest चलाने का प्रयास करना चाहिए।" वह पहले से ही किया है। वही परिणाम
अगर किसी को ऐसा कुछ सामना करना पड़ा है, तो कृपया मुझे बताएं। मुझे पता है कि मुझे कुछ आसान होना चाहिए, क्योंकि यह आमतौर पर इस तरह की समस्याओं के मामले में है, लेकिन मैंने कई आधारों को कवर किया है जैसा कि संभवतः मैं इसे हल करने की कोशिश में कर सकता हूं।
मुझे एक ही समस्या थी लेकिन मुझे पता चला कि यह मेरा गलत परीक्षण कार्यान्वयन था जिसके कारण यह हुआ (निश्चित रूप से आपके मामले से कुछ भी नहीं करना)। आप समस्या बहुत डरावनी है इसलिए आपके द्वारा उल्लिखित प्रश्न पूछने के लिए हर किसी के लिए तार्किक है। कृपया अपनी परीक्षा कक्षाओं में से एक का नमूना पोस्ट करें। विशेष रूप से जिस तरह से आप अपना डेटाबेस बदलते हैं। अन्यथा आपको एक अच्छा जवाब पाने की संभावना नहीं है। – Schaliasos
आपने उल्लेख किया कि वे व्यक्तिगत रूप से सफल होते हैं। परीक्षण मामलों की न्यूनतम संख्या क्या है जो आप चला सकते हैं और एक विफल हो सकता है? क्या आप इसे दो मामलों में कम कर सकते हैं? क्या आपने पूरे रन को कैप्चर करने के लिए प्रोफाइलर चलाया है जब यह त्रुटि उत्पन्न करता है? – StrayCatDBA