यूनिट परीक्षण के लिए एक 'वास्तविक' डेटाबेस का उपयोग करने में समस्या सेटअप की है, नीचे ले जाओ, और परीक्षणों के अलगाव। आप एक पूरी तरह से नए MySQL डेटाबेस को स्पिन नहीं करना चाहते हैं और केवल एक यूनिट टेस्ट के लिए टेबल और डेटा बना सकते हैं। इसके साथ समस्याओं को डेटाबेस की बाहरी प्रकृति के साथ करना है और आपका परीक्षण डेटाबेस नीचे है, आपकी इकाई परीक्षण विफल हो जाते हैं। यह सुनिश्चित करने के लिए भी समस्याएं हैं कि आपके पास परीक्षण के लिए एक अद्वितीय डेटाबेस है। उन्हें दूर किया जा सकता है, लेकिन एक सरल उत्तर है।
डेटाबेस का मजाक उड़ाना एक विकल्प है, लेकिन यह वास्तविक प्रश्नों का परीक्षण नहीं करता है। यह एक बहुत ही सरल समाधान के रूप में इस्तेमाल किया जा सकता है जब आप सुनिश्चित करना चाहते हैं कि डीएओ से डेटा ठीक से सिस्टम से गुजरता है। लेकिन स्वयं DAO के परीक्षण के लिए आपको DAO के पीछे कुछ चाहिए होता है, जिसमें डेटा और प्रश्न ठीक से चलते हैं।
पहली बात यह है कि स्मृति डेटाबेस में एक का उपयोग करें। हाइपरएसडी इसके लिए एक उत्कृष्ट विकल्प है क्योंकि इसमें किसी अन्य डेटाबेस की बोली का अनुकरण करने की क्षमता है - ताकि डेटाबेस के बीच मामूली अंतर समान हो (डेटा प्रकार, फ़ंक्शन और इसी तरह)। hsqldb में यूनिट टेस्टिंग के लिए कुछ अच्छे फीचर्स भी हैं।
db.url=jdbc:hsqldb:file:src/test/resources/testData;shutdown=true;
यह testData
फ़ाइल से डेटाबेस (तालिकाओं, प्रारंभिक डेटा) की स्थिति को लोड करता है । shutdown=true
अंतिम कनेक्शन बंद होने पर स्वचालित रूप से डेटाबेस को बंद कर देगा।
निर्भरता इंजेक्शन का उपयोग करते हुए , यूनिट परीक्षणों के उत्पादन (या परीक्षण, या स्थानीय) के उपयोग की तुलना में एक अलग डेटाबेस का चयन करें।
आपका DAO तब इंजेक्ट किए गए डेटाबेस का उपयोग करता है जिसके लिए आप डेटाबेस के विरुद्ध परीक्षण शुरू कर सकते हैं।
इकाई परीक्षण तब कुछ ऐसे दिखेंगे जैसे (उबाऊ सामान जो कि संक्षिप्तता के लिए शामिल नहीं है):
@Before
public void setUpDB() {
DBConnection connection = new DBConnection();
try {
conn = connection.getDBConnection();
insert = conn.prepareStatement("INSERT INTO data (txt, ts, active) VALUES (?, ?, ?)");
} catch (SQLException e) {
e.printStackTrace();
fail("Error instantiating database table: " + e.getMessage());
}
}
@After
public void tearDown() {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
private void addData(String txt, Timestamp ts, boolean active) throws Exception {
insert.setString(1, txt);
insert.setTimestamp(2, ts);
insert.setBoolean(3, active);
insert.execute();
}
@Test
public void testGetData() throws Exception {
// load data
Calendar time = Calendar.getInstance();
long now = time.getTimeInMillis();
long then1h = now - (60 * 60 * 1000); // one hour ago
long then2m = now - (60 * 1000 * 2); // two minutes ago
addData("active_foo", new Timestamp(then1h), true); // active but old
addData("inactive_bar", new Timestamp(then1h), false); // inactive and old
addData("active_quz", new Timestamp(then2m), true); // active and new
addData("inactive_baz", new Timestamp(then2m), false); // inactive and new
DataAccess dao = new DataAccess();
int count = 0;
for (Data data : dao.getData()) {
count++;
assertTrue(data.getTxt().startsWith("active"));
}
assertEquals("got back " + count + " rows instead of 1", count, 1);
}
और इस प्रकार, आपको एक इकाई परीक्षण मिला है जो डीएओ को कॉल करता है और उस डेटा का उपयोग कर रहा है जो परीक्षण की अवधि के लिए मौजूद फ्लाई डेटाबेस पर स्थापित किया गया था। रन से पहले आपको बाहरी संसाधनों या डेटाबेस की स्थिति के बारे में चिंता करने की ज़रूरत नहीं है, या किसी ज्ञात स्थिति में पुनर्स्थापित करना (ठीक है, 'ज्ञात राज्य' 'अस्तित्व में नहीं है' जो कि वापस लौटने के लिए तुच्छ है)।
DBUnit डेटाबेस बनाने में, टेबल बनाने और डेटा लोड करने में एक सरल प्रक्रिया का वर्णन करता है। यदि आपको किसी कारण से वास्तविक डेटाबेस का उपयोग करने की आवश्यकता है, तो यह उपयोग करने के लिए बेहतर उपकरण है।
उपरोक्त कोड एक मैवेन परियोजना का हिस्सा है जिसे मैंने अवधारणा परीक्षण के प्रमाण के लिए लिखा था