Integration Testing হল একটি সফটওয়্যার টেস্টিং কৌশল, যার মাধ্যমে বিভিন্ন সিস্টেম বা মডিউল একত্রে কাজ করছে কিনা তা পরীক্ষা করা হয়। এটি সাধারণত ইউনিট টেস্টিংয়ের পরে করা হয় এবং এর লক্ষ্য হচ্ছে সিস্টেমের বিভিন্ন কম্পোনেন্টের মধ্যে ইন্টারঅ্যাকশন এবং ডেটা প্রবাহ সঠিকভাবে কাজ করছে কিনা তা যাচাই করা।
NHibernate-এ Integration Testing প্রধানত ডেটাবেসের সাথে কাজ করে, যেখানে আপনার লক্ষ্য থাকবে একটি সঠিক পরিবেশে (ডাটাবেস, সেশন ফ্যাক্টরি ইত্যাদি) কোডের সঠিক কার্যকারিতা যাচাই করা।
Integration Testing কী?
Integration Testing এমন একটি প্রক্রিয়া, যেখানে একাধিক সিস্টেম বা মডিউলকে একত্রে পরীক্ষা করা হয়। এখানে প্রতিটি মডিউল এককভাবে টেস্ট করা হয় না, বরং তাদের ইন্টিগ্রেশন বা একসাথে কাজ করার ক্ষমতা যাচাই করা হয়।
NHibernate ব্যবহার করার সময়, Integration Testing সাধারণত Session এবং Transaction এর সাথে কাজ করার সময় ডেটাবেসের ইন্টিগ্রেশন পরীক্ষা করা হয়।
Integration Testing এর মূল লক্ষ্য
- Multiple Components Interaction: একাধিক কম্পোনেন্ট যেমন, ডেটাবেস, সেশন, ট্যাবল, এবং সার্ভিসের ইন্টিগ্রেশন পরীক্ষিত হয়।
- Data Flow Validation: সঠিকভাবে ডেটা প্রবাহ এবং সঠিক ডেটাবেস অপারেশন (যেমন, ইনসার্ট, আপডেট, ডিলিট) সম্পন্ন হচ্ছে কিনা তা নিশ্চিত করা।
- Transaction Management: একাধিক ডেটাবেস ট্রানজেকশন এবং তাদের কম্প্লিট বা রোলব্যাক সঠিকভাবে পরিচালনা হচ্ছে কিনা তাও পরীক্ষা করা হয়।
Integration Testing এর পদ্ধতি
NHibernate-এ Integration Testing সাধারণত Unit of Work প্যাটার্ন এবং Transaction Management এর সাথে সংযুক্ত থাকে। নিচে কিছু গুরুত্বপূর্ণ পদ্ধতি আলোচনা করা হলো যা ব্যবহার করে NHibernate অ্যাপ্লিকেশনের ইন্টিগ্রেশন টেস্টিং করা যায়।
1. Test with In-memory Database
NHibernate এর Integration Testing করার সবচেয়ে সহজ উপায় হলো In-memory Database ব্যবহার করা। এতে ডেটাবেস তৈরি করতে কোনো প্রকার ফাইল বা পরিসর সংরক্ষণ করতে হয় না, এবং এটি দ্রুত টেস্টিং করার সুযোগ দেয়।
একটি ইন-মেমরি ডেটাবেস কনফিগার করার জন্য SQLite ব্যবহার করা যেতে পারে।
In-memory Database Integration Test Example:
public class EmployeeIntegrationTest
{
private ISessionFactory sessionFactory;
[SetUp]
public void Setup()
{
// In-memory SQLite database setup
var cfg = new Configuration();
cfg.Configure(); // Hibernate configuration file
cfg.SetProperty("hibernate.dialect", "NHibernate.Dialect.SQLiteDialect");
cfg.SetProperty("hibernate.connection.driver_class", "NHibernate.Driver.SQLite20Driver");
cfg.SetProperty("hibernate.connection.connection_string", "DataSource=:memory:;Version=3;New=True;");
sessionFactory = cfg.BuildSessionFactory();
}
[Test]
public void TestEmployeeInsertion()
{
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
// Create a new employee
var employee = new Employee { Name = "John Doe", Age = 30 };
session.Save(employee);
transaction.Commit();
}
// Verify the employee was inserted
using (var session = sessionFactory.OpenSession())
{
var employee = session.Get<Employee>(1);
Assert.AreEqual("John Doe", employee.Name);
Assert.AreEqual(30, employee.Age);
}
}
[TearDown]
public void TearDown()
{
sessionFactory.Close();
}
}
এখানে একটি ইন-মেমরি SQLite ডেটাবেস ব্যবহার করে ইন্টিগ্রেশন টেস্ট তৈরি করা হয়েছে। SetUp মেথডে ডেটাবেস কনফিগারেশন এবং TestEmployeeInsertion মেথডে ডেটাবেসে Employee অবজেক্ট ইনসার্ট করা হচ্ছে।
2. Test with Real Database
প্রকৃত ডেটাবেসের সাথে Integration Testing করার জন্য আপনার ডেটাবেস কনফিগারেশন এবং সংযোগ সরাসরি বাস্তব পরিবেশে চালাতে হবে। এই ধরনের টেস্টিং সাধারণত ডেটাবেসে রিয়েল টাইম অপারেশন পরীক্ষা করতে ব্যবহৃত হয়।
Real Database Integration Test Example:
[Test]
public void TestRealDatabaseIntegration()
{
// Use a real database connection string
var connectionString = "Server=localhost;Database=testdb;User Id=myuser;Password=mypassword;";
var cfg = new Configuration();
cfg.Configure();
cfg.SetProperty("hibernate.connection.connection_string", connectionString);
sessionFactory = cfg.BuildSessionFactory();
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
// Create a new employee
var employee = new Employee { Name = "Jane Doe", Age = 25 };
session.Save(employee);
transaction.Commit();
}
// Verify the employee was inserted into the real database
using (var session = sessionFactory.OpenSession())
{
var employee = session.Get<Employee>(1);
Assert.AreEqual("Jane Doe", employee.Name);
Assert.AreEqual(25, employee.Age);
}
}
এখানে, real database (যেমন, SQL Server, MySQL) ব্যবহার করা হয়েছে যেখানে ডেটাবেসের লাইফটাইমে Employee টেবিলে ইনসার্ট অপারেশন পরীক্ষা করা হচ্ছে।
3. Test Transactions with Rollback
Transaction Rollback নিশ্চিত করার জন্য ইন্টিগ্রেশন টেস্টিংয়ে একটি গুরুত্বপূর্ণ কৌশল হল RollBack পদ্ধতি ব্যবহার করা। এটি নিশ্চিত করে যে টেস্ট শেষে ডেটাবেসে কোনো পরিবর্তন থাকবে না এবং ডেটাবেস সঠিক অবস্থায় ফিরে যাবে।
[Test]
public void TestEmployeeTransactionRollback()
{
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
var employee = new Employee { Name = "Temporary Employee", Age = 29 };
session.Save(employee);
// Manually rollback the transaction
transaction.Rollback();
}
// Verify that the employee was not saved to the database
using (var session = sessionFactory.OpenSession())
{
var employee = session.Get<Employee>(1);
Assert.IsNull(employee); // Employee should not exist
}
}
এখানে, টেস্টের পরে Rollback ব্যবহার করা হয়েছে যাতে টেস্টের শেষে ডেটাবেসে কোনো পরিবর্তন না থাকে।
4. Test with Mocking Frameworks
একটি Mocking Framework (যেমন, Moq বা NSubstitute) ব্যবহার করে, আপনি বাস্তব ডেটাবেস বা সেশন ফ্যাক্টরি ব্যবহারের পরিবর্তে মক অবজেক্ট ব্যবহার করে Integration Testing করতে পারেন। এতে ডেটাবেসের উপর কোন আসল অপারেশন না করেও কোডের লজিক টেস্ট করা সম্ভব হয়।
সারাংশ
Integration Testing গুরুত্বপূর্ণ একটি অংশ যেটি আপনাকে কোডের বিভিন্ন অংশ একত্রে কাজ করছে কিনা তা যাচাই করতে সহায়তা করে। NHibernate-এ ইনটিগ্রেশন টেস্টিংয়ের সময়, ইন-মেমরি ডেটাবেস ব্যবহার, রিয়েল ডেটাবেসের সাথে টেস্টিং, ট্রানজেকশন রোলব্যাক ইত্যাদি কৌশল ব্যবহার করা যেতে পারে। এগুলি নিশ্চিত করে যে ডেটাবেস অপারেশনগুলো সঠিকভাবে কাজ করছে এবং কোনো ধরনের পরিবর্তন অবাঞ্ছিতভাবে ডেটাবেসে প্রভাব ফেলছে না।
Read more