Microsoft Technologies Test Driven Development (TDD) এবং NHibernate গাইড ও নোট

325

Test Driven Development (TDD) হল একটি সফটওয়্যার ডেভেলপমেন্ট পদ্ধতি যেখানে কোড লেখার আগে প্রথমে টেস্ট কেস লেখা হয়। TDD এর মূল ধারণা হল কোড লেখার পূর্বে টেস্ট কেস লিখে, পরে সেই টেস্টের ভিত্তিতে কোড তৈরি করা। NHibernate ব্যবহার করার সময়, TDD একটি গুরুত্বপূর্ণ কৌশল হতে পারে যাতে আপনার ডেটাবেস লেয়ারটি (ORM) সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা যায়।

TDD এর তিনটি মূল ধাপ:

  1. Red: প্রথমে একটি টেস্ট লিখুন যা আপনার বর্তমান কোডের জন্য ফেল করবে। এটি একটি নতুন ফিচারের জন্য টেস্ট কেস হতে পারে।
  2. Green: এখন কোড লিখুন যা টেস্টটি পাস করতে সাহায্য করবে।
  3. Refactor: কোডটি রিফ্যাক্টর করুন, তবে টেস্টগুলি যেন সবসময় পাস করতে থাকে, তা নিশ্চিত করুন।

NHibernate এবং TDD এর মধ্যে সম্পর্ক

NHibernate এর সাথে TDD ব্যবহার করার সময়, আপনাকে যে বিষয়গুলো মনে রাখতে হবে তা হলো:

  • Mocking: NHibernate এর Session অবজেক্টকে মক করা। এটি গুরুত্বপূর্ণ, কারণ আপনি ডেটাবেসে কোন পরিবর্তন করতে চান না, তবে টেস্টের মাধ্যমে সেগুলিকে যাচাই করতে চান।
  • Integration Tests: TDD-তে সাধারণত ইউনিট টেস্ট এবং ইন্টিগ্রেশন টেস্ট থাকে। NHibernate এর সাথে ইন্টিগ্রেশন টেস্টে প্রকৃত ডেটাবেসের উপর কাজ করতে হয়, তবে এটি সঠিকভাবে কনফিগার করা উচিত যাতে ডেটাবেসে কোনও অবাঞ্ছিত পরিবর্তন না হয়।
  • In-Memory Database: টেস্টিং এর জন্য একটি ইন-মেমরি ডেটাবেস ব্যবহার করা যেতে পারে, যেমন SQLite, যাতে আপনি টেস্ট চলাকালীন কোনও প্রকৃত ডেটাবেসকে প্রভাবিত না করেন।

NHibernate এবং TDD এর জন্য টেস্ট কেস লেখা

এখানে আমরা একটি Employee ক্লাসের জন্য TDD এবং NHibernate ব্যবহার করে একটি সাধারণ টেস্ট কেস লিখে দেখব।

1. Employee ক্লাস তৈরি করা

public class Employee
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual decimal Salary { get; set; }
}

2. Test Setup - NHibernate কনফিগারেশন

TDD এর জন্য আমাদের প্রথমে NHibernate কনফিগারেশন সঠিকভাবে সেট করতে হবে, যাতে টেস্ট চলাকালীন ডেটাবেস সঠিকভাবে কাজ করে।

public class NHibernateHelper
{
    private static ISessionFactory sessionFactory;

    public static ISessionFactory SessionFactory
    {
        get
        {
            if (sessionFactory == null)
            {
                sessionFactory = new Configuration()
                    .Configure() // hibernate.cfg.xml থেকে কনফিগারেশন লোড করে
                    .BuildSessionFactory();
            }
            return sessionFactory;
        }
    }

    public static ISession OpenSession()
    {
        return SessionFactory.OpenSession();
    }
}

3. Test Class তৈরি করা

এখন আমরা একটি সাধারণ unit test লিখব যেখানে Employee ক্লাসের একটি ইনস্ট্যান্স ডাটাবেসে ইনসার্ট করে তা টেস্ট করা হবে। আমরা NUnit এবং NHibernate ব্যবহার করে টেস্ট করব। এখানে in-memory database ব্যবহার করা হবে যাতে টেস্টের জন্য কোন প্রকৃত ডেটাবেসে পরিবর্তন না হয়।

using NUnit.Framework;
using NHibernate;
using System;

[TestFixture]
public class EmployeeTests
{
    private ISession session;

    [SetUp]
    public void Setup()
    {
        session = NHibernateHelper.OpenSession();
    }

    [TearDown]
    public void TearDown()
    {
        if (session.IsOpen)
        {
            session.Close();
        }
    }

    [Test]
    public void TestEmployeeInsertion()
    {
        // Arrange
        var employee = new Employee { Name = "John Doe", Salary = 50000 };

        // Act
        using (var transaction = session.BeginTransaction())
        {
            session.Save(employee);
            transaction.Commit();
        }

        // Assert
        using (var transaction = session.BeginTransaction())
        {
            var insertedEmployee = session.Get<Employee>(employee.Id);
            Assert.IsNotNull(insertedEmployee);
            Assert.AreEqual("John Doe", insertedEmployee.Name);
            Assert.AreEqual(50000, insertedEmployee.Salary);
        }
    }
}

এখানে:

  • Setup মেথডে আমরা একটি নতুন NHibernate সেশন তৈরি করছি।
  • TearDown মেথডে আমরা সেশনটি বন্ধ করে দিচ্ছি।
  • TestEmployeeInsertion টেস্ট কেসে, একটি Employee অবজেক্ট তৈরি করে তা ডেটাবেসে ইনসার্ট করা হচ্ছে, তারপর আমরা যাচাই করছি যে ডেটাবেসে সঠিকভাবে ইনসার্ট হয়েছে কিনা।

Mocking NHibernate এর Session

TDD এর একটি গুরুত্বপূর্ণ অংশ হল মকিং। সাধারণত, যখন আপনি ইউটিলিটি ক্লাস বা ডেটাবেস সম্পর্কিত কোড টেস্ট করেন, তখন ডেটাবেসের সাথে সরাসরি যোগাযোগ করার পরিবর্তে মক অবজেক্ট ব্যবহার করা হয়। NHibernate এর ISession এবং ITransaction ইন্টারফেসগুলি মক করা যেতে পারে। এর জন্য আপনি Moq বা NSubstitute মত লাইব্রেরি ব্যবহার করতে পারেন।

using Moq;
using NHibernate;
using NUnit.Framework;

[TestFixture]
public class EmployeeServiceTests
{
    private Mock<ISession> mockSession;
    private Mock<ITransaction> mockTransaction;

    [SetUp]
    public void Setup()
    {
        mockSession = new Mock<ISession>();
        mockTransaction = new Mock<ITransaction>();
    }

    [Test]
    public void TestEmployeeInsertionWithMocking()
    {
        // Arrange
        var employeeService = new EmployeeService(mockSession.Object);
        var employee = new Employee { Name = "Jane Doe", Salary = 60000 };

        mockSession.Setup(s => s.BeginTransaction()).Returns(mockTransaction.Object);

        // Act
        employeeService.SaveEmployee(employee);

        // Assert
        mockSession.Verify(s => s.Save(It.IsAny<Employee>()), Times.Once);
        mockTransaction.Verify(t => t.Commit(), Times.Once);
    }
}

এখানে:

  • Mock এবং Mock ব্যবহার করে NHibernate এর সেশন এবং ট্রানজেকশন মক করা হয়েছে।
  • Verify মেথড দিয়ে নিশ্চিত করা হয়েছে যে Save মেথড এবং Commit ট্রানজেকশন একবার করে কল করা হয়েছে।

ইন-মেমরি ডেটাবেস ব্যবহার

TDD এর মধ্যে in-memory database ব্যবহার করা অত্যন্ত উপকারী, কারণ এটি দ্রুত টেস্টিং প্রদান করে এবং ডেটাবেসে কোনো স্থায়ী পরিবর্তন করতে হয় না। আপনি NHibernate এর সাথে SQLite বা H2 ব্যবহার করতে পারেন ইন-মেমরি ডেটাবেস হিসেবে।

<hibernate-configuration>
    <session-factory>
        <!-- Use SQLite In-Memory Database -->
        <property name="hibernate.dialect">NHibernate.Dialect.SQLiteDialect</property>
        <property name="hibernate.connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
        <property name="hibernate.connection.connection_string">Data Source=:memory:;Version=3;New=True;</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
    </session-factory>
</hibernate-configuration>

এখানে:

  • SQLite ইন-মেমরি ডেটাবেস ব্যবহৃত হচ্ছে, যা টেস্টের সময় কার্যকরী হবে এবং টেস্ট শেষে ডেটাবেসটি মুছে যাবে।

সারাংশ

TDD এবং NHibernate ব্যবহার করে আপনি:

  • কোড লেখার আগে টেস্ট কেস তৈরি করবেন।
  • ডেটাবেস লেয়ারটি সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করবেন।
  • Mocking এবং In-memory databases ব্যবহার করে ডেটাবেস অপারেশনগুলো টেস্ট করবেন, যাতে ডেটাবেসে কোনো পরিবর্তন না আসে।

এভাবে TDD প্রক্রিয়াটি আপনাকে NHibernate ব্যবহারের সময় একটি শক্তিশালী, পরীক্ষিত এবং দৃঢ় কোড বেস তৈরিতে সাহায্য করবে।

Content added By
Promotion

Are you sure to start over?

Loading...