2010-09-28 7 views
8

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

मैं टेस्ट स्वीट बनाने के लिए, कि निम्नलिखित तरीके से चलेंगे जा रहा हूँ:

  • एक में स्मृति एच 2 डाटाबेस बनाने
  • रन DDL प्रारंभिक सम्मिलित करने के लिए टेबल
  • रन dbUnit बनाने के लिए स्क्रिप्ट डेटा (चलिए इसे STATE0) कहते हैं जो सभी परीक्षणों द्वारा उपयोग किया जाएगा।
  • रन परीक्षण

वहाँ तक यह मेरे लिए अच्छा लग रहा है, लेकिन मैं क्या समझ में नहीं आता, मैं कैसे एक परीक्षण चलाने के बाद STATE0 करने के लिए डेटाबेस वापस लौटने और डेटा बदल करते है?

क्या मैं इसे dbUnit के साथ कर सकता हूं?
या कुछ और के साथ?
क्या मुझे प्रत्येक परीक्षण से पहले डेटाबेस को फिर से बनाना चाहिए?

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

उत्तर

7

डीबीयूनीट आपके @BeforeClass, @Before और @After विधियों को ठीक से लिखते समय स्वचालित रूप से कार्य कर सकता है। जैसे हमारी परियोजना, डर्बी का उपयोग करने में,

तरह
public class MyTest { 
    protected static IDataSet getDataSet() throws Exception { 
     URL url = MyTest.class.getClassLoader().getResource("MyDataSet.xml"); 
     return new XmlDataSet(new FileInputStream(url.getPath())); 
    } 

    private static JdbcDatabaseTester databaseTester; 

    @BeforeClass 
    public static void setUpClass() throws Exception { 
     // Init test environment, session etc. 
     databaseTester = new JdbcDatabaseTester(
       "org.apache.derby.jdbc.ClientDriver", 
       "jdbc:derby://localhost:1527/myschema", 
       "username", "password"); 
     databaseTester.setDataSet(getDataSet()); 
    } 

    @AfterClass 
    public static void tearDownClass() { 
     // Close session etc. 
    } 

    @Before 
    public void setUp() throws Exception { 
     databaseTester.onSetup(); 
    } 

    @After 
    public void tearDown() throws Exception { 
     databaseTester.onTearDown(); 
    } 

    @Test 
    public void test() throws Exception { ... } 
} 

इस कोड (के एक सबसेट) राज्य प्रत्येक परीक्षा के बाद MyDataSet.xml द्वारा परिभाषित करने के लिए डीबी स्कीमा वापस डालता है ऐसे ही एक परीक्षण का मामला लग रहा है। (ध्यान दें कि, के रूप में @Pascal टिप्पणी की, रीसेट हमेशा पूर्ण नहीं हो सकता है - एक परीक्षण एक मेज जो डाटासेट में नहीं है को संशोधित करता है, यह @Before/@After तरीकों से प्रभावित नहीं होगा।)

+1

क्या यह वास्तव में डीबी को "रीसेट" करता है? मेरा मतलब है, अगर मेरा परीक्षण तालिका 'FOO' में कुछ डेटा डालें और यदि' MyDataSet.xml' में 'FOO' शामिल नहीं है, तो' FOO 'को "रीसेट नहीं किया जाएगा", है ना? –

+0

@ पास्कल, आप शायद सही हैं। मानव होने के नाते, हमेशा यह जांचना उचित होता है कि यदि मैं परीक्षण चला रहा हूं जिसमें तालिका 'FOO' शामिल है, तो तालिका वास्तव में डेटासेट में शामिल की जाती है। –

+0

éter मैं इसके साथ सहमत हूं। यह सिर्फ इतना है कि मेरे में नाइटपिकर अंतिम वाक्य के वाक्यांश द्वारा पूरी तरह से आश्वस्त नहीं था :) वैसे भी +1। –

5

प्रारंभ करने के लिए प्रारंभिक डाटासेट डेटाबेस, बस अपने परीक्षण स्थिति में इन तरीकों को लागू:

@Override 
protected DatabaseOperation getSetUpOperation() throws Exception 
{ 
    return DatabaseOperation.CLEAN_INSERT; // by default (will do DELETE_ALL + INSERT) 
} 

@Override 
protected DatabaseOperation getTearDownOperation() throws Exception 
{ 
    return DatabaseOperation.NONE; // by default 
} 

आप विदेशी कुंजी की कमी हो सकती है यदि आपके परीक्षण के कुछ एक रिक्त तालिका (उदाहरण के लिये प्रारंभिक डेटासेट में नहीं परिभाषित) की पंक्तियों डालें।

बस किसी भी पंक्ति के बिना अपने डेटासेट में इस खाली तालिका जोड़ें:

<mydb_mypopulatedtable id="1" name="toto" alias="funky"/> 
<mydb_mypopulatedtable id="2" name="titi" alias="groovy"/> 
<mydb_mypopulatedtable id="3" name="tutu" alias="creepy"/> 

<mydb_myemptytable /> 

यहाँ, myemptytable mypopulatedtable के लिए एक विदेशी कुंजी है। यदि myemptytable परिभाषित नहीं किया गया था, तो DBUnit mypopulatedtable को हटाने का प्रयास करेगा लेकिन बाधा के कारण विफल हो जाएगा। यदि परिभाषित किया गया है, तो डीबीयूनीट पहले मेरी छूट योग्य पंक्तियों को हटा देगा।

+0

हमेशा के लिए इस के लिए देख रहे थे! – suguspnk