2010-01-22 16 views
5

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

इकाई परीक्षण मैवेन बिल्ड में कई में से एक है और इस परीक्षण को लिनक्स और विंडोज एक्सपी वातावरण में चलाना है। मेरी वर्तमान विचार प्रक्रिया दोनों ऑपरेटिंग सिस्टम के लिए एक स्क्रिप्ट को हथियाने के लिए है क्योंकि मैं प्रक्रिया को मारने और अपनी जगह में एक नया शुरू करने के लिए स्क्रिप्ट का उपयोग कर सकता हूं। क्या मेरे पास अन्य विकल्प भी है? क्या मैं जुनीट का उपयोग कर एक अलग प्रक्रिया स्थान/वीएम बना सकता हूं?

+0

आप डेटाबेस का परीक्षण करना चाहते हैं? या आप अपने कोड का परीक्षण करना चाहते हैं जो उस डेटाबेस का उपयोग करता है? –

+0

मैं चाहता हूं कि यह मेरे कोड का परीक्षण करे क्योंकि प्रश्न में डेटाबेस एम्बेडेड है। सिस्टम विफलता के दौरान डेटा भ्रष्टाचार गैर-लेनदेन बर्कले डीबी एक्सएमएल (जिसे हमें उपयोग करना है) के साथ समस्या ज्ञात है - मैं भ्रष्टाचार को कम करने के लिए अपने रैपर कोड में कुछ स्वच्छता जांच लागू कर रहा हूं। – toddk

+8

फिर, आप यह साबित करने के लिए यूनिट परीक्षण लिखना चाहेंगे कि आपकी सैनिटी जांच वह करती है जो उन्हें करना है। आप डीबी इंटरफ़ेस का एक मॉक लिख सकते हैं और विभिन्न विफलताओं का अनुकरण कर सकते हैं ताकि आपके पास निर्धारक व्यवहार हो। मौलिक समस्या यह साबित कर रही है कि आपके द्वारा कार्यान्वित स्वच्छता जांच वास्तव में आपके द्वारा वर्णित भ्रष्टाचार को रोकती है। मैं इसे एक यूनिट परीक्षण में नहीं करता जब तक कि प्रत्येक टेस्ट रन पर असफलता पुन: उत्पन्न नहीं होती है। यदि वे नहीं हैं, तो मैं परीक्षण को इसके बजाय एक perf/स्थिरता परीक्षण के रूप में मानता हूं। – ShabbyDoo

उत्तर

1

मैं इस तरह के परीक्षण को यूनिट परीक्षण पर विचार नहीं करता लेकिन फिर भी आप ऐसा कुछ करने में सक्षम हो सकते हैं।

  1. प्रक्रिया बनाने और शुरू करने के लिए ProcessBuilder कक्षा का उपयोग करें, लौटा प्रक्रिया ऑब्जेक्ट स्टोर करें।
  2. रिकॉर्ड डालने शुरू करें।
  3. किसी बिंदु पर destroy() प्रक्रिया।

कृपया इस परीक्षण की गैर-निर्धारिती प्रकृति पर पिछली टिप्पणियों को ध्यान में रखें।

मैं अपने स्वचालित परीक्षण सूट के हिस्से के रूप में SQLite team also doing a simulated failure strategy पर आया हूं।

0

इस प्रकार का व्यवहार लेनदेन के लिए बिल्कुल सही है। यदि आपका कोड लेनदेन शुरू करना था, तो डेटाबेस को पता चल जाएगा कि एक प्रक्रिया मरने के कारण लेनदेन निरस्त होने पर डेटा को कैसे बनाए रखा जाए। आप यहां पहिया को फिर से शुरू कर सकते हैं। डेली डब्ल्यूटीएफ का एक अच्छा उदाहरण है कि हम खुद को reinventing the wheel में कैसे बेवकूफ़ बनाते हैं।

अपने पहले संशोधन पर एक अच्छी कड़ी नजर डालें और अपने आप से कहें, "दस्ताने।"

+4

आप गाना बजानेवालों के लिए प्रचार कर रहे हैं। मुझे बताया गया कि हम डीबी के लेनदेन संस्करण का उपयोग नहीं कर सके ... इसलिए मुझे लगता है कि मुझे "क्यों नहीं?" पूछने की आवश्यकता होगी बहुत आगे जाने से पहले। – toddk

0

पूरी प्रक्रिया के केवल धागे कीड़े का उपयोग करने के बारे में क्या? उदाहरण के लिए:

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

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

0

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

मी।

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