8

मैं एकीकरण/स्वीकृति परीक्षण के लिए SpecFlow सेट अप करने का प्रयास कर रहा हूं। स्क्लाइट में हमारे उत्पाद का बैकिंग डेटाबेस (हालांकि एक बड़ा नहीं है) है।डेटाबेस पैटर्न के साथ SpecFlow एकीकरण परीक्षण

यह वास्तव में थोड़ा चिपचिपा बिंदु साबित हो रहा है; मैं परीक्षण के लिए डेटाबेस कैसे मॉडल करूं?

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

मैं निम्नलिखित दृष्टिकोण के बारे में सोच सकते हैं:

  1. परीक्षण के साथ विधानसभा में एक डेटाबेस संकलित करें, तो प्रत्येक परीक्षा के लिए यह छाया-कॉपी। यद्यपि धीमा लगता है।
  2. मैं स्मृति में डेटाबेस बना सकता हूं और इसे पूर्व निर्धारित डेटा के साथ पॉप्युलेट कर सकता हूं।
  3. मैं स्मृति में डेटाबेस बना सकता हूं और किसी भी तरह से गिवेन्स डेटाबेस को पॉप्युलेट कर सकता है। ऐसा लगता है कि यह परीक्षणों को बहुत ही खराब कर देगा, लेकिन उन्हें अधिक नियंत्रण दे सकता है और परीक्षणों को कम नाजुक बना सकता है।
  4. मैं प्रत्येक डेटाबेस परस्पर संपर्क और मैक्स का उपयोग कर सकता हूं। इस विचार से प्यार नहीं है क्योंकि मैं डेटाबेस इंटरैक्शन का परीक्षण करने के लिए इसका उपयोग करना चाहता हूं।
  5. डेटाबेस में परीक्षणों को संकलित करें और इसे बेस-स्टेट कोड पर लौटने के लिए क्लीन-अप कोड पर भरोसा करें (यह मुझे मेरे लिए डोडी लगता है)। लेनदेन के साथ ऐसा नहीं करना चाहते क्योंकि कुछ परीक्षणों के साथ कई इंटरैक्शन होंगे (इसलिए एक आइटम लिखें, फिर इसे विभिन्न विशेषाधिकारों के साथ वापस पढ़ने का प्रयास करें)।

उत्तर

4

पर विचार कैसे परीक्षण करने के लिए पहले, मैं आप इसे क्या आप परीक्षण करना चाहते को देखने के लिए मूल्यवान हो सकता है लगता है।

से शुरू होने वाला डेटा, मुझे लगता है कि यह वास्तव में एक तत्व, या एक छोटी संख्या लेने में मदद करता है, और अपने परीक्षणों को चलाने के लिए सही परीक्षण डेटा देने के लिए उनके आसपास की घटनाओं का एक सेट कल्पना करता है । उदाहरण के लिए;

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

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

एक बात यह है कि आपके प्रश्न को आपके डेटा को अपडेट करने की आवश्यकता नहीं है। उदाहरण के लिए आप परीक्षणों का एक सेट रखना चाहते हैं जो आपके संस्थाओं के जीवन चक्र के विभिन्न चरणों में काम करते हैं, उदाहरण के लिए कुछ परीक्षण "बेबी बॉब" के साथ सौदा करते हैं, अन्य "10yr पुराने बॉब" या "विवाहित बॉब" आदि के साथ।यदि आपका डीबी केवल पढ़ा जाता है तो यह कोई समस्या नहीं है यदि आप अपने परीक्षण लिख सकते हैं ताकि वे अन्य डेटा देखें, लेकिन कभी-कभी आप अपने परीक्षणों के माध्यम से एक कहानी बनाना चाहते हैं। यदि आपके परीक्षण डेटा बदलते हैं, तो आपको यह सुनिश्चित करने में समस्या होगी कि आपके परीक्षण क्रम में चलते हैं (MSTest OrderedTest या mbUnit DependsOn देखें), या आप अपने परीक्षण अलग कर सकते हैं ताकि वे प्रत्येक अलग डेटा इकाई से निपट सकें (यह ठीक है यदि आपकी इकाई को एक पंक्ति में वर्णित किया जा सकता है, लेकिन इसे प्राप्त करने के लिए आपको कई तालिकाओं को पढ़ना कठिन होता है)।

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

तो अब वास्तव में अपने सवाल का जवाब देने,

  1. छाया अपने डेटाबेस कॉपी - हाँ, मैं इस एक बार SQLServer डेवलपर के साथ किया और एक xxx.mdb कि परीक्षण चलाने से पहले में नकल कर ली लिया है । हालांकि कुछ आधुनिक परीक्षण ढांचे समानांतर में परीक्षण चलाएंगे NCrunch, तो यह सिर्फ टूट जाता है।
  2. डेटाबेस बनाएं और को पूर्व-पॉप्युलेट करें - यह नहीं किया गया है, लेकिन मेरी चिंताएं तब होती हैं जहां एक परीक्षण डेटाबेस को एक अप्रत्याशित स्थिति में बदल देता है। अन्य परीक्षण विफल हो जाएंगे जब उन्होंने कुछ भी गलत नहीं किया है।
  3. डेटाबेस बनाएँ और गिवेंस का उपयोग करें - मैं इस NUnit साथ [SetupFixture] के माध्यम से एक Linq करने वाली एसक्यूएल DB.You की चोटी पर किया है अभी भी समानांतर परीक्षण रन लेकर चिंतित हैं, और आप अपने गिवेंस के विवरण के स्तर को संतुलित करने के लिए है (StackOverflow-When do BDD scenarios become too specific देखें), और आपके पास डेटा अपडेट ऑर्डरिंग/डेटा अलगाव समस्या है, लेकिन यह आपको वास्तव में अच्छी तरह से काम कर सकता है ताकि आप अपनी डेटा कहानियों के माध्यम से काम कर सकें और अपने परीक्षणों में डेटा बढ़ा सकें। दूसरी तरफ, एक परीक्षण विफल होना चाहिए और डेटा को खराब स्थिति में छोड़ देना चाहिए, जिससे आप असफलताओं के साथ समाप्त हो सकते हैं, लेकिन कम से कम आपको केवल उस व्यक्ति को देखने की ज़रूरत है जो पहले विफल हो। इस प्रकार का परीक्षण डेवलपर्स के लिए उनके वर्कस्टेशन पर बहुत अच्छी तरह से नहीं खेलेंगे क्योंकि वे केवल एक ही परीक्षण नहीं चला सकते हैं, खासकर एनसीआरंच जैसे टूल्स के साथ, जो केवल उन परीक्षणों को चला सकता है जिनके कोड बदल गए हैं।
  4. डेटाबेस मॉक करें इस प्रकार मैं अब चीजों को करने का विकल्प चुनता हूं। चाल यह है कि यदि आप व्यक्तिगत रूप से एक उचित सख्त टीडीडी प्रक्रिया का पालन कर रहे हैं, जहां आप केवल उस विधि का परीक्षण करते हैं जिस पर आप काम कर रहे हैं, तो आप वास्तव में कुछ स्तरों के साथ समाप्त होते हैं जो डेटाबेस इंटरैक्शन का परीक्षण करते हैं, उदा। [Test]DALLayerTests.ShouldReadARowAndCreatePOCO(), लेकिन अधिकांश अन्य जो वास्तव में क्या होता है परीक्षण करने के लिए मैक किए गए डेटा का उपयोग करते हैं उदा। [Test]BusinessObjectPersonTests.ShouldGetBirthdayCongratulations()
  5. उपयोग कोड को साफ - कभी यह कोशिश की, यह लग रहा है कुशल :-)
+0

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

+1

असल में, नकली करें जो आपके पास नहीं है!लेखन परीक्षण आपके द्वारा नियंत्रित व्यवहार को सत्यापित करने के बारे में है। यदि आप आवश्यकतानुसार काम करने के लिए अपने डेटाबेस पर भरोसा नहीं कर सकते हैं तो आप कोड को ठीक नहीं करने के लिए अपने विक्रेता के साथ बग रिपोर्ट बढ़ाएंगे। लेकिन क्या होगा यदि यह डीबी नहीं है, बल्कि आपके संगठन में एक और टीम का उत्पाद है? क्या आप चाहते हैं कि आपके परीक्षण विफल हो जाएं क्योंकि कोड गलत है? असल में आप कर सकते हैं, लेकिन आपको यह देखने के लिए कुछ परीक्षणों की आवश्यकता है कि आपका आंतरिक कोड काम कर रहा है, और जब यह उनके सिस्टम से कनेक्ट होता है तो असफल हो रहा है। – AlSki

+0

जब आप कहते हैं कि एकीकरण परीक्षण आयोजित करते समय डेटाबेस तक पहुंचना उचित है, तो मैं आपके साथ भी सहमत हूं, लेकिन इस प्रश्न का संदर्भ यह है कि परिदृश्यों के विकल्प और नुकसान क्या हैं। – AlSki

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