2009-04-20 15 views
9

क्या किसी के पास सेलेनियम जैसे एकीकरण परीक्षण ढांचे से बने डेटाबेस लेनदेन को रोल करने के सर्वोत्तम अभ्यास या पसंदीदा तरीके के लिए कोई सुझाव है?एकीकरण के बाद रोलबैक डेटाबेस (सेलेनियम) परीक्षण

यहां हमारी वर्तमान स्थिति है: हमारे पास एक यूनिट वेब प्रोजेक्ट है जिसमें कई यूनिट परीक्षण हैं जो हमारे यूनिट टेस्ट पर्यावरण में ठीक काम करते हैं - प्रत्येक परीक्षा में एक अभिभावक वर्ग होता है जो [सेटअप] और रोल में लेनदेन खोलता है [TearDown] में लेनदेन वापस। प्रत्येक परीक्षण के बाद, हमारे यूनिट परीक्षण डेटाबेस को मूल स्थिति में वापस बहाल कर दिया जाता है।

हालांकि, एक बार जब हम अपने एकीकरण वातावरण में जाते हैं तो चीजें बदलती हैं। हमारा निरंतर एकीकरण सर्वर स्वचालित रूप से हमारे कामों को संकलित करता है और उन्हें एक परीक्षण सर्वर पर धक्का देता है, ताकि सर्वर हमेशा सबसे अद्यतित कोड पर चलता है। हमने साइट के साथ उपयोगकर्ता इंटरैक्शन को स्वचालित करने के लिए सेलेनियम इंस्टेंस भी सेट किया है। सेलेनियम परीक्षण मूल रूप से मौजूदा सेलेनियम सर्वर के साथ संवाद करते हैं, और सर्वर की चीजों को बताते हैं, "ब्राउज़र लॉन्च करें और http://testsite/TestPage.aspx पर जाएं - आईडी 'def' के साथ फॉर्म फ़ील्ड में टेक्स्ट 'abc' दर्ज करें - नए पृष्ठ पर टेक्स्ट 'xyz' '

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

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

क्या यह एक समस्या है जिसे हल किया गया है? कोई सलाह बहुत बढ़िया होगी।

धन्यवाद!

उत्तर

3

हम प्रत्येक परीक्षण से पहले एक ड्रॉप/बनाएं-टेबल स्क्रिप्ट चला रहे हैं। यह काफी तेज़ है और यह सुनिश्चित करता है कि पिछले परीक्षणों से कुछ भी नहीं बचा है।

पीएस: हम एनएचबर्ननेट का उपयोग कर रहे हैं, जो इस स्क्रिप्ट को फ्लाई पर बनाता है और स्क्लाइट पर परीक्षण को स्मृति में चलाता है, यह रोशनी है। लेकिन अगर हम एसक्लसेवर पर स्विच करते हैं तो यह अभी भी काफी तेज़ है।

+0

धन्यवाद स्टीफन, यह सबसे अच्छा समाधान लगता है - हम सिर्फ छोटा टेबल का सहारा लिया और दिया है फिर से लोड हो रहा है प्रत्येक परीक्षण के बाद फिक्स्चर, जो वास्तव में * वह * कर नहीं है, और ऐसा लगता है कि यह अच्छी तरह से काम कर रहा है। फिर से धन्यवाद! – matt

+1

ओरेकल पर छंटनी काफी तेज़ है, क्योंकि आप इस ऑपरेशन को रोलबैक नहीं कर सकते हैं। हमारी स्थिति में स्क्रिप्ट आसान हैं, स्क्रिप्ट पहले से ही उपलब्ध हैं, हमें कुछ और बनाए रखने की ज़रूरत नहीं है। –

+0

क्या यह स्क्रिप्ट प्रत्येक परीक्षण विधि या परीक्षण मामले से पहले चलती है? मैं हर टेस्ट विधि मानूंगा .... यह स्क्रिप्ट कैसे चलती है? क्या आपके पास बैक एंड में एक सेवा एपीआई है? – HDave

3

यह एक कठिन समस्या है और समाधान आम तौर पर प्रत्येक ऐप के लिए अद्वितीय है। जब तक प्रमुख ढांचे "अनुशंसित दृष्टिकोण" को अपनाते हैं, तब तक यह एक दर्द जारी रहेगा।

मेरी सबसे अच्छी सिफारिश: आपके ऐप की शुरुआत में इस उपयोग के लिए योजना। एपी को शामिल करें जो डीबी को ऐप के नीचे से रीसेट कर दिया गया है (यानी: रीसेट कैश)।

2

Amnesia (more docs, recent code) नामक एक प्रोजेक्ट है जिसे विशेष रूप से इस परिदृश्य के लिए डिज़ाइन किया गया है। यह using the MSDTC TransactionScope to rollback test changes की प्रक्रिया को सरल बनाता है। (प्रयोग विशेष रूप से पहले से ही MSDTC का उपयोग करने वालों नहीं सबसे अनुप्रयोगों में डेटा का उपयोग करने के लिए मामूली आक्रामक परिवर्तन की आवश्यकता होगी।)

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