ইউনিট পরীক্ষার জন্য 'রিয়েল' ডাটাবেস ব্যবহারে সমস্যা হ'ল পরীক্ষাগুলি সেটআপ, ডাউন ডাউন এবং বিচ্ছিন্নকরণ। আপনি সম্পূর্ণ নতুন মাইএসকিউএল ডাটাবেস স্পিন করতে এবং কেবল একটি ইউনিট পরীক্ষার জন্য টেবিল এবং ডেটা তৈরি করতে চান না। এটির সাথে সমস্যাগুলি ডাটাবেসের বাহ্যিক প্রকৃতির সাথে সম্পর্কিত এবং আপনার পরীক্ষা ডাটাবেসটি হ্রাস পেয়েছে, আপনার ইউনিট পরীক্ষা ব্যর্থ। পরীক্ষার জন্য আপনার কাছে একটি অনন্য ডাটাবেস রয়েছে কিনা তা নিশ্চিত করার বিষয়টিও রয়েছে। তারা কাটিয়ে উঠতে পারে, তবে একটি সহজ উত্তর আছে।
ডাটাবেসকে উপহাস করা একটি বিকল্প তবে এটি চালিত প্রকৃত ক্যোয়ারিগুলি পরীক্ষা করে না। আপনি ডিএও থেকে প্রাপ্ত ডেটা সঠিকভাবে সিস্টেমের মাধ্যমে চলেছে কিনা তা নিশ্চিত করতে চাইলে এটি আরও সহজ সমাধান হিসাবে ব্যবহার করা যেতে পারে। তবে ডিএও নিজেই পরীক্ষার জন্য আপনার ডিএওর পিছনে কিছু দরকার যা ডেটা এবং কোয়েরিগুলি সঠিকভাবে চালিত হয়।
প্রথম কাজটি হ'ল মেমরি ডেটাবেস ব্যবহার করা। হাইপারএসকিউএল এটির জন্য একটি দুর্দান্ত পছন্দ কারণ এটিতে অন্য একটি ডাটাবেসের উপভাষা অনুকরণ করার ক্ষমতা রয়েছে - যাতে ডাটাবেসের মধ্যে সামান্য পার্থক্য একই থাকে (ডাটা টাইপ, ফাংশন এবং এর মতো)। এইচএসকিএলডিবিতে ইউনিট পরীক্ষার জন্য কিছু দুর্দান্ত বৈশিষ্ট্যও রয়েছে।
db.url=jdbc:hsqldb:file:src/test/resources/testData;shutdown=true;
এটি testData
ফাইল থেকে ডাটাবেসের স্থিতি (টেবিলগুলি, প্রাথমিক ডেটা) লোড করে । shutdown=true
শেষ সংযোগটি বন্ধ হয়ে গেলে স্বয়ংক্রিয়ভাবে ডাটাবেস বন্ধ হয়ে যাবে।
নির্ভরতা ইনজেকশন ব্যবহার করে , ইউনিট পরীক্ষাগুলি উত্পাদন (বা পরীক্ষা, বা স্থানীয়) কী ব্যবহার করে তার চেয়ে আলাদা একটি ডাটাবেস নির্বাচন করুন ।
আপনার ডিএও তারপরে ইনজেকশন করা ডাটাবেস ব্যবহার করে যার জন্য আপনি ডাটাবেসের বিরুদ্ধে পরীক্ষা শুরু করতে পারেন।
ইউনিট পরীক্ষাগুলি এরপরে এমন কিছু দেখতে পাবেন (একঘেয়ে কাটানো স্টাফের গুচ্ছটি ব্রাভিটির জন্য অন্তর্ভুক্ত নয়):
@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);
}
এবং এইভাবে, আপনি একটি ইউনিট পরীক্ষা পেয়েছেন যা ডিএও-কে কল করে এবং পরীক্ষার সময়কালের জন্য বিদ্যমান ফ্লাই ডাটাবেসে একটি ডেটা সেট করা ডেটা ব্যবহার করছে। দৌড়ানোর আগে আপনাকে বাহ্যিক সংস্থান বা ডাটাবেসের অবস্থার বিষয়ে চিন্তা করতে হবে না, বা একটি পরিচিত রাষ্ট্রের কাছে পুনরুদ্ধার করতে হবে (ভাল, 'পরিচিত রাষ্ট্রটি' বিদ্যমান নেই 'যা প্রত্যাবর্তনের পক্ষে তুচ্ছ)।
আমি ডাটাবেস স্থাপন, টেবিলগুলি তৈরি এবং ডেটা লোড করার ক্ষেত্রে একটি সহজ প্রক্রিয়া বর্ণনা করেছিলাম তার অনেক কিছুই ডিবিউনিট তৈরি করতে পারে। যদি আপনার কোনও কারণে আসল ডাটাবেস ব্যবহার করার প্রয়োজন হয় তবে এটি ব্যবহারের চেয়ে আরও ভাল সরঞ্জাম।
উপরের কোডটি একটি গৌণ প্রকল্পের অংশ যা আমি গিথাবের টেস্টিং উইথএইচসিএলডিবি ধারণার প্রমাণের জন্য লিখেছিলাম