2009-01-06 43 views
6

के साथ एएसपी.नेट एमवीसी टीडीडी मैं परीक्षण के साथ एक नया एमवीसी प्रोजेक्ट शुरू करने की कोशिश कर रहा हूं और मैंने सोचा कि जाने का सबसे अच्छा तरीका 2 डेटाबेस होगा। 1 के खिलाफ परीक्षण करने के लिए और 1 जब मैं ऐप चलाता हूं और इसका उपयोग करता हूं (वास्तव में परीक्षण भी करता है क्योंकि यह अभी तक उत्पादन नहीं है)।LINQ और SQL डेटाबेस

परीक्षण डेटाबेस के लिए मैं तालिका स्क्रिप्ट बनाने और परीक्षण सेटअप विधि के भीतर डेटा स्क्रिप्ट भरने और फिर इसे आंसू नीचे विधि में हटाने के बारे में सोच रहा था।

मैं लिंक से एसक्यूएल का उपयोग करने जा रहा हूं हालांकि मुझे नहीं लगता कि यह मुझे ऐसा करने की अनुमति देगा?

क्या मुझे एडीओ रूट जाना होगा यदि मैं इसे इस तरह से करना चाहता हूं? या क्या मुझे सिर्फ एक मॉक ऑब्जेक्ट का उपयोग करना चाहिए और डेटा को सरणी या कुछ के रूप में स्टोर करना चाहिए?

सर्वोत्तम प्रथाओं पर कोई सुझाव?

जेफ स्टैक ओवरव्लो के लिए ऐसा करने के बारे में कैसे गए?

उत्तर

2

मैंने tvanfosson और रिकमिग्रेशन से लिंक की जांच की और उनके साथ खेलने के बाद मैं मॉकिंग डेटाकॉन्टेक्स्ट विधि को सबसे अच्छा पसंद करता हूं। मुझे एहसास हुआ कि मुझे टेबल बनाने और उन्हें हर समय छोड़ने की आवश्यकता नहीं है।

थोड़ा और शोध के बाद मुझे स्टीफन वाल्थर का आलेख http://stephenwalther.com/blog/archive/2008/08/17/asp-net-mvc-tip-33-unit-test-linq-to-sql.aspx मिला जो मुझे आसान और अधिक विश्वसनीय लगता है।

तो मैं इस कार्यान्वयन के साथ जा रहा हूं।

सहायता के लिए धन्यवाद।

4

मैं डेटा कॉन्टेक्स्ट रैपर के लिए एक इंटरफ़ेस परिभाषित करता हूं और डेटाकॉन्टेक्स्ट के लिए रैपर के कार्यान्वयन का उपयोग करता हूं। यह मुझे अपने परीक्षणों में वैकल्पिक, नकली डेटाकॉन्टेक्स्ट कार्यान्वयन का उपयोग करने की अनुमति देता है (या इसे आसान बनाते हैं, तो इसे मजाक करें)। यह डेटाबेस को मेरे यूनिट परीक्षणों से पूरी तरह से हटा देता है। मुझे http://andrewtokeley.net/archive/2008/07/06/mocking-linq-to-sql-datacontext.aspx पर कुछ स्टार्टर कोड मिला, हालांकि मैंने इसे बढ़ा दिया है ताकि यह मेरी इकाई कक्षाओं पर सत्यापन कार्यान्वयन को संभाल सके।

मुझे यह भी जिक्र करना चाहिए कि मेरे पास क्यूए के लिए एक अलग स्टेजिंग सर्वर है, इसलिए पूरे सिस्टम का लाइव परीक्षण है। मैं बस अपने यूनिट परीक्षण में एक वास्तविक डेटाबेस का उपयोग नहीं करता हूं।

+0

मैं उसी डेटाकॉन्टेक्स्ट मॉकिंग कोड का उपयोग करता हूं और यह अच्छी तरह से –

1

आप अपने यूनिट परीक्षणों के लिए वास्तव में डेटाबेस को मारने के आसपास कुछ और तरीका ढूंढना चाहेंगे क्योंकि इसमें बहुत अधिक समय लगता है। ऐसा कहा जा रहा है, क्या आपने एसक्यूएल स्क्रिप्ट का उपयोग करने के बजाय अपनी टेबल बनाने/हटाने के लिए माइग्रेशन का उपयोग करने पर विचार किया है? RikMigrations वह है जो मैं अपना डेटाबेस बनाने के लिए उपयोग कर रहा हूं ताकि मैं आसानी से एक ही स्थान पर अपने सभी कोड को संशोधित कर सकूं। Justin Etheredge पर using RikMigrations पर एक अच्छा लेख है।

1

मैं, ऊपर की ज्यादा से सहमत इकाई परीक्षण से संबंधित। हालांकि, मुझे लगता है कि इस मुद्दे को उठाना महत्वपूर्ण है कि मॉक रिपोजिटरीज और यूनिट परीक्षणों का उपयोग करके आपको डीबी इंटीग्रेशन टेस्ट के रूप में परीक्षण के समान स्तर नहीं मिलते हैं।

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

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

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

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

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

यूनिट परीक्षण सरल के लिए ठीक हैं गणना, बुनियादी व्यापार नियम, आदि और निश्चित रूप से वे अधिकांश परिचालनों के लिए सबसे अच्छी पसंद हैं जिनमें डीबी (या अन्य संसाधन) पहुंच शामिल नहीं है। लेकिन मुझे नहीं लगता कि वे एकीकरण परीक्षण के रूप में मूल्यवान हैं - लोग यूनिट परीक्षणों के बारे में बहुत कुछ बोलते हैं, लेकिन एकीकरण परीक्षणों के बारे में बहुत कुछ कहा जाता है।

मुझे उम्मीद है कि यूनिट परीक्षणों के बारे में उन भावुक लोगों को इसके लिए आग लग जाएगी। यह ठीक है - मैं बस कुछ संतुलन लाने और लोगों को याद दिलाने की कोशिश कर रहा हूं कि पारित इकाइयों के परीक्षण से भरे परियोजनाएं अभी भी उस क्षेत्र में लागू होने के बाद बुरी तरह विफल हो सकती हैं।

+0

दिलचस्प काम करता है, लेकिन निश्चित रूप से टेंगेंट पर बंद होता है .. साथ ही पत्र टीएफएस ने मेरी रीढ़ की हड्डी नीचे एक कड़वाहट भेजी! – Lloyd