2009-05-05 11 views
8

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

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

मैं वर्तमान में हाइबरनेट + स्प्रिंग ट्रांजेक्शनल परीक्षण समर्थन का उपयोग कर रहा हूं, जैसे कि मेरे व्यक्तिगत परीक्षण विधियां लेनदेन में लिपटे हैं।

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

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

उत्तर

7

क्या आप एक विशिष्ट डेटाबेस विक्रेता के साथ अटक गए हैं? यदि नहीं, तो आप HSQLDB जैसे इन-मेमोरी डेटाबेस का उपयोग कर सकते हैं। जब आप परीक्षण के साथ होते हैं तो आप बस राज्य को फेंक देते हैं। यह केवल तभी उपयुक्त है जब टेस्ट सूट की शुरूआत में टेबल खाली हो जाएं (आपके प्रोग्रामेटिक सेटअप से पहले)।

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

<session-factory> 
    ... 
    <property name="hibernate.hbm2ddl.auto">create</property> 
    ... 
</session-factory> 

हैं।

+0

कभी-कभी मैं सबसे सरल विकल्पों को भूल जाता हूं। बोनस आपको इंगित करता है। –

+0

तो समाधान के रूप में इसे स्वीकार करके इसका मतलब है कि आपने डीबी सेटअप/प्रति व्यक्तिगत परीक्षण को फाड़ने का विकल्प चुना है? –

+0

मैं वास्तव में एक स्थिर @BeforeClass Junit विधि का उपयोग कर उसी कक्षा में परिभाषित परीक्षणों के एक सेट के लिए डीबी स्थापित करने के साथ चला गया। लेकिन @Before JUnit विधि के साथ प्रति-परीक्षण आधार पर करना आसान होगा। –

0

DNUnit इस संबंध में आपकी मदद करेगा। यदि आप चाहें तो प्रत्येक व्यक्तिगत परीक्षण केस के लिए आप अलग-अलग डेटा सेट बना सकते हैं।

0

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

+0

का उपयोग नहीं होगा DBUnit धारणात्मक एसक्यूएल पटकथा है कि प्रश्न में की संभावना से इनकार किया गया था के बराबर हो? – topchef

+0

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

0

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

बेशक

, इस डाटाबेस सेटअप में अद्यतन के लिए काम नहीं करेगा ... लेकिन अगर आप को सीमित कर दिया अपडेट की संख्या तो डेटा के इस प्रकार के लिए प्राचीन छवि को सहेजने पर विचार करने और डाटाबेस फाड़ के दौरान इसे फिर से स्थापित।

0

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

मैंने इसे देशी जेडीबीसी के साथ किया, "बैकअप डेटाबेस" और 'डेटाबेस को पुनर्स्थापित' '' परीक्षण 'डेटाबेस' 'टी-एसक्यूएल परीक्षण के बीच में किया, और यह काफी अच्छी तरह से काम किया।

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

0

क्या कोई कारण है कि आपके डेटाबेस परीक्षण चलाने के लिए डेटाबेस से कनेक्शन होना चाहिए? ऐसा लगता है कि आपकी कक्षा को दोबारा सुधारना आसान हो सकता है ताकि आप डेटाबेस के साथ बातचीत का मज़ाक उड़ा सकें। आप कक्षाओं (कुछ अपवादों के साथ) के साथ-साथ EasyMock (www.easymock.org) के साथ इंटरफेस का मज़ाक उड़ा सकते हैं।

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

0

हाइबरनेट में एक साफ छोटी सुविधा है जो बहुत कम दस्तावेज और अज्ञात है। डेटाबेस स्कीमा पीढ़ी के बाद ताजा डेटाबेस में डेटा आयात करने के बाद आप सत्र फ़ैक्टरी निर्माण के दौरान SQL स्क्रिप्ट निष्पादित कर सकते हैं। आपको बस अपनी क्लासपाथ रूट में import.sql नाम की एक फ़ाइल जोड़ने की आवश्यकता है और या तो अपने hibernate.hbm2ddl.auto प्रॉपर्टी के रूप में बनाएं या बनाएं-ड्रॉप करें।

http://in.relation.to/Bloggers/RotterdamJBugAndHibernatesImportsql

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

  • कोई संबंधित समस्या नहीं^_^