2013-04-11 4 views
5

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

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

जब मैं वीएस 2012 टेस्ट एक्सप्लोरर का उपयोग करके "सभी चलाएं", 22 परीक्षण विफल हो जाते हैं। वे सभी प्राथमिक कुंजी बाधा उल्लंघन के कुछ बदलाव के साथ असफल हो जाते हैं। मतलब, जब वे इन परीक्षणों के लिए डेटा प्रारंभ कर रहे हैं, तो डेटा उस कक्षा में पिछले परीक्षण विधि से साफ़ नहीं किया गया था। यदि मैं सभी परीक्षणों को फिर से चलाता हूं, तो मुझे हर बार असफल परीक्षण मिलते हैं। यह काफी प्रतिलिपिबद्ध है। कोई फर्क नहीं पड़ता कि मैं कितनी बार सभी परीक्षण चलाता हूं। प्राथमिक 27 उल्लंघनों के साथ ये 27 परीक्षण विफल हो गए हैं।

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

मुझे पता है कि यह कैसा दिखता है।

"आप स्पष्ट रूप से अपने परीक्षण डेटा को साफ नहीं कर रहे हैं।" यदि वह मामला था, तो मुझे हर दौड़ पर असफल परीक्षण देखना चाहिए, इससे कोई फर्क नहीं पड़ता। उन 27 परीक्षणों को हर रन में असफल होना चाहिए, न कि जब मैं सब कुछ चलाता हूं।

"कक्षाओं और चीजों के बीच आपके पास अद्वितीय प्राथमिक कुंजी नहीं होनी चाहिए।" ऊपर देखो। यहां तक ​​कि अगर मेरी कक्षाओं में प्राथमिक कुंजी दोहराई गई थी (जो मैं नहीं करता, क्योंकि मैंने अलग-अलग वर्गों के भीतर परीक्षण डेटा पर प्राथमिक कुंजी की विशिष्टता को व्यक्तिगत रूप से तीन बार जांच लिया है), क्योंकि ये परीक्षण अलग-अलग धागे पर एक साथ नहीं चलते हैं (जिसे थ्रेडआईडी लॉगिंग करके सत्यापित किया गया है), किसी दिए गए परीक्षण के लिए क्लीनअप कोड डुप्लीकेट डेटा को साफ करेगा, भले ही।

"आपको कनेक्शन पूलिंग का उपयोग नहीं करना चाहिए।" नहीं, वास्तव में मैं हूं। और मैंने एसक्यूएल प्रोफाइलर का उपयोग करके सत्यापित किया है कि अनुरोध निश्चित रूप से पूल किए गए हैं। इसके अलावा, क्योंकि ये परीक्षण समानांतर में नहीं चल रहे हैं, केवल एक कनेक्शन धागा है।

"आपको कनेक्शन पूलिंग का उपयोग नहीं करना चाहिए।" खैर, हाँ, मुझे चाहिए, क्योंकि अंतर्निहित कोडेबेस विभिन्न वेब परियोजनाओं का समर्थन करता है, लेकिन तर्क के लिए मैंने कनेक्शन पूलिंग अक्षम (पूलिंग = कनेक्शन स्ट्रिंग में झूठी का उपयोग करके) के सभी परीक्षणों को चलाने का प्रयास किया और मुझे सटीक परिणाम मिलते हैं। व्यवहार में कोई बदलाव नहीं, जो भी हो।

"आपके स्थानीय पर्यावरण में कुछ गड़बड़ होना चाहिए।" मुझे अन्य सहयोगियों के देव बक्से (जो संयोग से एसक्यूएल 2012 का उपयोग करते हैं) पर भी इन परीक्षणों को चलाने वाले एक ही परिणाम मिलते हैं। यह मेरे पर्यावरण, या यहां तक ​​कि SQL सर्वर के मेरे संस्करण के लिए अद्वितीय नहीं है।

"आपको कमांड लाइन से mstest चलाने का प्रयास करना चाहिए।" वह पहले से ही किया है। वही परिणाम

अगर किसी को ऐसा कुछ सामना करना पड़ा है, तो कृपया मुझे बताएं। मुझे पता है कि मुझे कुछ आसान होना चाहिए, क्योंकि यह आमतौर पर इस तरह की समस्याओं के मामले में है, लेकिन मैंने कई आधारों को कवर किया है जैसा कि संभवतः मैं इसे हल करने की कोशिश में कर सकता हूं।

+0

मुझे एक ही समस्या थी लेकिन मुझे पता चला कि यह मेरा गलत परीक्षण कार्यान्वयन था जिसके कारण यह हुआ (निश्चित रूप से आपके मामले से कुछ भी नहीं करना)। आप समस्या बहुत डरावनी है इसलिए आपके द्वारा उल्लिखित प्रश्न पूछने के लिए हर किसी के लिए तार्किक है। कृपया अपनी परीक्षा कक्षाओं में से एक का नमूना पोस्ट करें। विशेष रूप से जिस तरह से आप अपना डेटाबेस बदलते हैं। अन्यथा आपको एक अच्छा जवाब पाने की संभावना नहीं है। – Schaliasos

+1

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

उत्तर

2

निम्नलिखित यह मानना ​​है कि आपका डेटाबेस पूर्ण रिकवरी मोड में है और आप अपने परीक्षणों के दौरान किसी भी पुनर्स्थापना या अन्य चालबाजी नहीं करते हैं (जैसे डीबी को अलग करना/पुनः प्राप्त करना)।

आपकी समस्या की जांच करने के लिए यहां एक बहुत ही कठिन दृष्टिकोण है, लेकिन यह पता लगाने के लिए आवश्यक डेटा प्रदान करने की गारंटी है।

  1. टेस्ट स्वीट शुरू करने से पहले यह अधिकार क्या डेटाबेस की एक पूर्ण बैकअप ले लो। हम डेटाबेस को पुनर्स्थापित करने जा रहे हैं, इसलिए यह भी सुनिश्चित करें कि डेटाबेस फ़ाइलों की 2-3 प्रतियों के लिए आपके पास पर्याप्त डिस्क स्थान है।

  2. घटनाओं के लिए किसी SQL Profiler ट्रेस बनाएं, चयन आरपीसी शुरू/पूरा, एसक्यूएल बैच शुरू/पूरा, SQL विवरण शुरू करने/पूरा शुरू करने/पूरा, सपा वक्तव्य, टीएम: * पूरा, SQLTransaction, DTCTransaction, और उपयोगकर्ता त्रुटि संदेश। सभी कॉलम कैप्चर करें।

  3. समस्या का पुनरुत्पादन विफलता उत्पन्न करने के लिए न्यूनतम संख्या में परीक्षण चलाएं। परीक्षणों को खत्म करने दें ताकि आप सभी सफाई कोड को कैप्चर कर सकें, फिर प्रोफाइलर ट्रेस को रोक दें।

  4. लेनदेन लॉग बैकअप लें हमें बाद में पॉइंट-इन-टाइम पुनर्स्थापना के लिए इसकी आवश्यकता हो सकती है।

  5. ट्रेस में विफलता का पता लगाएं यदि आपको प्राथमिक कुंजी विफलता मिल रही है, तो इसे ट्रैक करना आसान होना चाहिए, बस उपयोगकर्ता त्रुटि संदेश की तलाश करें। त्रुटि होने पर सटीक लिखें।

  6. स्पष्ट समस्याओं के लिए ट्रेस की जांच करें त्रुटि से शुरू करें और जब तक आप असफल परीक्षण की शुरुआत न करें तब तक पीछे की ओर काम करें। आखिरी असफल परीक्षण के लिए सेटअप शुरू होने पर सटीक लिखें। इस श्रेणी में सभी वर्गों की जांच करें। एसक्यूएल बिल्कुल क्या आप उम्मीद करते हैं? क्या पंक्ति सही मायने रखती है? क्या लेनदेन सही है? (लेनदेन में कॉलम आईडी कॉलम पर प्रत्येक कथन के लिए अलग नहीं होना चाहिए, और प्रत्येक कथन के अंदर एक लेनदेन के लिए अलग होना चाहिए)। यदि आपने गलत मिलान किया है तो TRAN/COMMIT TRAN/रोलबैक ट्रैन, लेनदेन आईडी आपको बताएगा।

  7. विफल परीक्षण सेटअप से पहले डीबी को पुनर्स्थापित करें इसे एक नए डेटाबेस में पुनर्स्थापित करें ताकि हम मूल और प्रतिलिपि की तुलना कर सकें। सबसे पहले "रिकॉर्डे डाटाबेस .... नॉर्वे के साथ" का उपयोग करके पूर्ण बैकअप को पुनर्स्थापित करें। फिर "रीस्टोर लॉग .. WTIH STOPAT, RECOVERY" का उपयोग करके लेनदेन लॉग बैकअप को पुनर्स्थापित करें और असफल परीक्षण सेटअप से पहले एक समय निर्दिष्ट करें।

  8. डेटाबेस स्थिति सत्यापित करें परीक्षण डेटा की जांच करें जो साफ़ नहीं हो सकता है। क्या यह सब कुछ होना चाहिए? यदि नहीं, तो आप डेटाबेस को पहले के बिंदु पर पुन: स्थापित कर सकते हैं। परीक्षण शुरू होने से ठीक पहले आप एक बिंदु की तलाश में हैं जहां डेटाबेस एक अच्छी, ज्ञात स्थिति में है।

  9. त्रुटि होने से ठीक पहले डीबी को पुनर्स्थापित करें यदि आपके पास कमरा है, तो एक और नए डीबी में पुनर्स्थापित करें। पीके उल्लंघन के कारण डेटा की जांच करें। क्या त्रुटि तब होती है जब आप समस्याग्रस्त कथन फिर से चलाते हैं? सत्यापित करें कि यह होता है या नहीं होता है।

    • यदि ऐसा नहीं होता है, तो आपकी समस्या संभावित रूप से गलत मिलान लेनदेन हैंडलिंग की संभावना है। यदि आप पहले एक COMMIT खो रहे थे, तो हो सकता है कि आपके पास अभी भी एक लेनदेन हो। जब आप STOPAT के साथ पुनर्स्थापित करते हैं, तो किसी भी गैर-प्रतिबद्ध लेनदेन को वापस ले जाया जाएगा। इससे यह भी समझाया जाएगा कि परीक्षण कैसे व्यक्तिगत रूप से काम करते हैं, लेकिन साथ में वे असफल हो जाते हैं।
    • यदि ऐसा होता है, तो जब तक आपको समस्या नहीं मिल जाती तब तक पीछे की ओर काम करें। इससे पहले कि आप इसे समझने से पहले डीबी को कई बार पुनर्स्थापित करने की आवश्यकता हो। आपका प्रक्रिया बहाल डीबी, का पता लगाने की जांच, डेटा की जांच, अलग बात करने के लिए बहाल, का पता लगाने की जांच, डेटा की जांच, आदि हो जाएगा
  10. आप नुकसान में अभी भी कर रहे हैं इस सब के बाद है, तो आप जांच करने के लिए चाहते हो सकता है अपने यूनिट परीक्षणों के हिस्से के रूप में डेटाबेस स्नैपशॉट का उपयोग करना। असल में, डीबी स्नैपशॉट, सेटअप और रन टेस्ट बनाएं, टियरडाउन को डेटाबेस को वापस स्नैपशॉट पर वापस करने के साथ बदल दिया गया है। यह प्रत्येक परीक्षण से पहले और बाद में एक समान डेटाबेस की गारंटी देगा।

2012 प्रबंधन स्टूडियो में एक बेहतर डेटाबेस पुनर्स्थापना विज़ार्ड है जो समय को बिंदु को बहुत आसान बनाता है। शुभकामनाएँ!

+0

ठीक है, मैं इन चरणों के माध्यम से जा रहा हूं और मैंने असफलताओं की मात्रा को काफी कम कर दिया है। मुझे कुछ कैस्केड डिलीट मिले हैं जो कुछ खराब-अनुमानित परीक्षण डेटा के साथ संयुक्त नहीं हो रहे थे। अत्यंत विस्तृत और उपयोगी जानकारी के लिए धन्यवाद। मैं इसे उत्तर के रूप में चिह्नित करने जा रहा हूं। – Finster

0

सुनिश्चित नहीं हैं जैसे कि यह है, लेकिन मैं कुछ इसी तरह की थी क्यों तुम्हारा विफल हो रहा है और अब मैं इस तरह सेटअप में एक transactionscope डाल:

public void SetUp() 
{ 
_transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew); 
} 

और टियरडाउन में यह निपटाने। यह मेरे डेटाबेस मुद्दों से छुटकारा पा लिया और मुझे मैन्युअल क्लीनअप कोड लिखने से रोका।

+0

वास्तव में यह बदतर बना दिया। मेरे पास एक SQLConnectionContext है जो SqlConnection के लिए एक रैपर के रूप में कार्य करता है। मैंने उन तरीकों के रचनाकारों में ट्रांजैक्शनस्कोप तात्कालिकता डाली (जहां हम SqlConnection.Open() को कॉल करते हैं और फिर मेरे निपटान विधि में एक TransactionScope.Close() कहते हैं, और यह किसी भी व्यक्तिगत परीक्षण को चलाने के लिए समय को बढ़ाता है परिमाण, और वास्तव में प्राथमिक परीक्षण और विदेशी कुंजी उल्लंघनों के साथ अधिक परीक्षण विफल रहे। – Finster

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