NSubstitute
NSubstitute: একটি শক্তিশালী ইউনিট টেস্টিং ফ্রেমওয়ার্ক
ভূমিকা
NSubstitute হলো .NET প্ল্যাটফর্মের জন্য একটি জনপ্রিয় ইউনিট টেস্টিং ফ্রেমওয়ার্ক। এটি বিশেষভাবে ডিজাইন করা হয়েছে ডিপেন্ডেন্সি ইনজেকশন (Dependency Injection) এবং টেস্ট-ড্রাইভেন ডেভেলপমেন্ট (Test-Driven Development) চর্চাগুলিকে সহজ করার জন্য। NSubstitute ব্যবহারের মাধ্যমে ডেভেলপাররা সহজেই মক (Mock) অবজেক্ট তৈরি করতে পারে এবং জটিল পরিস্থিতিগুলি পরীক্ষা করতে পারে। এই নিবন্ধে, NSubstitute-এর বৈশিষ্ট্য, ব্যবহার, সুবিধা এবং কিছু উন্নত কৌশল নিয়ে আলোচনা করা হবে।
NSubstitute কেন ব্যবহার করবেন?
ঐতিহ্যবাহী ইউনিট টেস্টিং ফ্রেমওয়ার্কগুলোর তুলনায় NSubstitute ব্যবহারের বেশ কিছু সুবিধা রয়েছে:
- সহজ সিনট্যাক্স: NSubstitute-এর সিনট্যাক্স খুবই সহজ এবং পাঠযোগ্য, যা নতুন ব্যবহারকারীদের জন্য দ্রুত শেখা সহজ করে তোলে।
- শক্তিশালী মকিং ক্ষমতা: এটি ইন্টারফেস, অ্যাবস্ট্রাক্ট ক্লাস এবং কংক্রিট ক্লাস সহ যেকোনো ধরনের ডিপেন্ডেন্সি মক করতে পারে।
- স্বয়ংক্রিয় স্টাবিং: NSubstitute স্বয়ংক্রিয়ভাবে স্টাবিং (Stubbing) সমর্থন করে, যার ফলে টেস্ট কেস লেখার পরিমাণ কমে যায়।
- কল ভেরিফিকেশন: এটি নিশ্চিত করে যে নির্দিষ্ট মেথডগুলো প্রত্যাশিত আর্গুমেন্টসহ কল করা হয়েছে।
- নমনীয়তা: NSubstitute বিভিন্ন ধরনের টেস্টিং পরিস্থিতিতে ব্যবহার করা যেতে পারে, যেমন টেস্ট-ড্রাইভেন ডেভেলপমেন্ট, বিহেভিয়ার-ড্রাইভেন ডেভেলপমেন্ট (বিডিডি) এবং বিদ্যমান কোডবেস পরীক্ষা করা।
NSubstitute এর মূল ধারণা
NSubstitute এর কার্যকারিতা বোঝার জন্য কিছু মূল ধারণা সম্পর্কে জানা দরকার:
- মক (Mock): মক হলো একটি অবজেক্ট যা আসল অবজেক্টের আচরণ অনুকরণ করে। এটি টেস্টিংয়ের সময় আসল ডিপেন্ডেন্সিগুলোকে প্রতিস্থাপন করতে ব্যবহৃত হয়।
- স্টাব (Stub): স্টাব হলো একটি মক অবজেক্টের একটি অংশ, যা একটি নির্দিষ্ট মেথডের জন্য নির্দিষ্ট আউটপুট প্রদান করে।
- কল স্পেসিফিকেশন (Call Specification): কল স্পেসিফিকেশন ব্যবহার করে মক অবজেক্টের নির্দিষ্ট মেথড কল করা হয়েছে কিনা এবং কী আর্গুমেন্টসহ কল করা হয়েছে তা যাচাই করা যায়।
NSubstitute এর প্রাথমিক ব্যবহার
NSubstitute ব্যবহার করে একটি সাধারণ উদাহরণ দেখা যাক। প্রথমে, আপনাকে NSubstitute প্যাকেজটি আপনার প্রোজেক্টে ইনস্টল করতে হবে। Visual Studio-তে Package Manager Console ব্যবহার করে এটি করা যেতে পারে:
```powershell Install-Package NSubstitute ```
এরপর, আপনি নিম্নলিখিত কোড ব্যবহার করে একটি মক অবজেক্ট তৈরি করতে পারেন:
```csharp using NSubstitute; using NUnit.Framework;
public interface IEmailSender {
void SendEmail(string to, string subject, string body);
}
public class EmailService {
private readonly IEmailSender _emailSender;
public EmailService(IEmailSender emailSender) { _emailSender = emailSender; }
public void SendWelcomeEmail(string userEmail) { _emailSender.SendEmail(userEmail, "Welcome!", "Thank you for registering."); }
}
[TestFixture] public class EmailServiceTests {
[Test] public void SendWelcomeEmail_SendsEmailWithCorrectParameters() { // Arrange var emailSender = Substitute.For<IEmailSender>(); var emailService = new EmailService(emailSender);
// Act emailService.SendWelcomeEmail("[email protected]");
// Assert emailSender.Received().SendEmail("[email protected]", "Welcome!", "Thank you for registering."); }
} ```
এই উদাহরণে, `IEmailSender` ইন্টারফেসের একটি মক অবজেক্ট তৈরি করা হয়েছে। `SendWelcomeEmail` মেথডটি কল করার সময়, মক অবজেক্টটি `SendEmail` মেথডটি কল হয়েছে কিনা এবং সঠিক আর্গুমেন্টসহ কল হয়েছে কিনা তা যাচাই করে।
উন্নত ব্যবহার এবং কৌশল
NSubstitute আরও অনেক উন্নত বৈশিষ্ট্য সরবরাহ করে, যা জটিল টেস্টিং পরিস্থিতিগুলি মোকাবেলা করতে সহায়ক। নিচে কয়েকটি কৌশল আলোচনা করা হলো:
১. একাধিক কল ভেরিফিকেশন
আপনি `Received()` পদ্ধতির সাথে `Times` স্পেসিফিকেশন ব্যবহার করে একাধিক কল ভেরিফিকেশন করতে পারেন।
```csharp emailSender.Received(2).SendEmail(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()); ```
এই কোডটি নিশ্চিত করে যে `SendEmail` মেথডটি ঠিক দুইবার কল করা হয়েছে।
২. আর্গুমেন্ট ম্যাচিং
`Arg.Any<T>()`, `Arg.Is<T>(predicate)` এবং `Arg.Equals(expectedValue)` এর মতো আর্গুমেন্ট ম্যাচিং ব্যবহার করে আপনি নির্দিষ্ট আর্গুমেন্টের সাথে মেথড কল যাচাই করতে পারেন।
```csharp emailSender.Received().SendEmail(Arg.Is<string>(email => email.Contains("@example.com")), Arg.Any<string>(), Arg.Any<string>()); ```
এই কোডটি নিশ্চিত করে যে `SendEmail` মেথডটি "@example.com" ডোমেইনযুক্ত একটি ইমেল অ্যাড্রেসসহ কল করা হয়েছে।
৩. রিটার্ন ভ্যালু স্টাবিং
আপনি `Returns()` পদ্ধতি ব্যবহার করে মক অবজেক্টের মেথডের রিটার্ন ভ্যালু স্টাব করতে পারেন।
```csharp emailSender.When(x => x.SendEmail(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>())).Do(x => { /* কিছু কাজ */ }); emailSender.SendEmail(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()).Returns(true); ```
এই কোডটি `SendEmail` মেথডের জন্য একটি স্টাব তৈরি করে, যা সর্বদা `true` রিটার্ন করবে।
৪. ব্যতিক্রম থ্রো করা
আপনি `Throws()` পদ্ধতি ব্যবহার করে মক অবজেক্ট থেকে ব্যতিক্রম থ্রো করতে পারেন।
```csharp emailSender.When(x => x.SendEmail(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>())).Throws(new Exception("Email sending failed.")); ```
এই কোডটি `SendEmail` মেথডটি কল করার সময় একটি `Exception` থ্রো করবে।
৫. সিকোয়েন্সিং
আপনি `InOrder()` পদ্ধতি ব্যবহার করে মেথড কলের ক্রম যাচাই করতে পারেন।
```csharp emailSender.ReceivedInOrder().SendEmail("[email protected]", "Subject1", "Body1"); emailSender.ReceivedInOrder().SendEmail("[email protected]", "Subject2", "Body2"); ```
এই কোডটি নিশ্চিত করে যে `SendEmail` মেথডটি প্রথমে "[email protected]" এবং পরে "[email protected]" আর্গুমেন্টসহ কল করা হয়েছে।
৬. কাস্টম ম্যাচার
আপনি নিজের কাস্টম ম্যাচার তৈরি করতে পারেন, যা আরও জটিল আর্গুমেন্ট ম্যাচিংয়ের জন্য ব্যবহার করা যেতে পারে।
NSubstitute এবং অন্যান্য টেস্টিং ফ্রেমওয়ার্ক
NSubstitute অন্যান্য জনপ্রিয় .NET টেস্টিং ফ্রেমওয়ার্কের সাথে সহজেই ব্যবহার করা যেতে পারে, যেমন:
- NUnit: NUnit হলো একটি বহুল ব্যবহৃত ইউনিট টেস্টিং ফ্রেমওয়ার্ক।
- xUnit.net: xUnit.net হলো একটি আধুনিক ইউনিট টেস্টিং ফ্রেমওয়ার্ক।
- MSTest: MSTest হলো Microsoft এর তৈরি একটি ইউনিট টেস্টিং ফ্রেমওয়ার্ক।
NSubstitute ব্যবহারের সুবিধা এবং অসুবিধা
সুবিধা:
- সহজ এবং ব্যবহারযোগ্য সিনট্যাক্স।
- শক্তিশালী মকিং এবং স্টাবিং ক্ষমতা।
- স্বয়ংক্রিয় কল ভেরিফিকেশন।
- নমনীয়তা এবং বিভিন্ন টেস্টিং পরিস্থিতিতে ব্যবহার করার সুবিধা।
- ডিপেন্ডেন্সি ইনজেকশন এর সাথে ভালভাবে কাজ করে।
অসুবিধা:
- কিছু ক্ষেত্রে, জটিল স্টাবিং এবং ম্যাচিং কনফিগারেশন কঠিন হতে পারে।
- অন্যান্য মকিং ফ্রেমওয়ার্কের তুলনায় কর্মক্ষমতা কিছুটা কম হতে পারে।
বাস্তব বিশ্বের উদাহরণ
একটি ওয়েব এপিআই (Web API) টেস্টিংয়ের উদাহরণ:
ধরুন, আপনি একটি ওয়েব এপিআই তৈরি করছেন যা ব্যবহারকারীদের ডেটা সংরক্ষণ করে। আপনি `IDataRepository` ইন্টারফেস ব্যবহার করে ডেটা অ্যাক্সেস করছেন। টেস্টিংয়ের সময়, আপনি আসল `DataRepository` এর পরিবর্তে NSubstitute ব্যবহার করে একটি মক অবজেক্ট তৈরি করতে পারেন।
```csharp public interface IDataRepository {
Task SaveUser(User user); Task<User> GetUserById(int id);
}
public class UserService {
private readonly IDataRepository _dataRepository;
public UserService(IDataRepository dataRepository) { _dataRepository = dataRepository; }
public async Task SaveUserAsync(User user) { await _dataRepository.SaveUser(user); }
}
[TestFixture] public class UserServiceTests {
[Test] public async Task SaveUserAsync_CallsSaveUserOnRepository() { // Arrange var dataRepository = Substitute.For<IDataRepository>(); var userService = new UserService(dataRepository); var user = new User { Id = 1, Name = "Test User" };
// Act await userService.SaveUserAsync(user);
// Assert await dataRepository.Received().SaveUser(user); }
} ```
এই উদাহরণে, `SaveUserAsync` মেথডটি কল করার সময় `SaveUser` মেথডটি মক `IDataRepository` অবজেক্টে কল হয়েছে কিনা, তা যাচাই করা হয়েছে।
উপসংহার
NSubstitute একটি শক্তিশালী এবং ব্যবহারযোগ্য ইউনিট টেস্টিং ফ্রেমওয়ার্ক, যা .NET ডেভেলপারদের জন্য অত্যন্ত উপযোগী। এর সহজ সিনট্যাক্স, শক্তিশালী মকিং ক্ষমতা এবং নমনীয়তা এটিকে যেকোনো প্রোজেক্টের জন্য একটি মূল্যবান হাতিয়ার করে তুলেছে। আপনি যদি ইউনিট টেস্টিং এবং ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করে উন্নত মানের কোড লিখতে চান, তাহলে NSubstitute আপনার জন্য একটি চমৎকার পছন্দ হতে পারে।
আরও জানতে:
- সলিড প্রিন্সিপাল (SOLID principles)
- ডিজাইন প্যাটার্ন (Design Patterns)
- রিফ্যাক্টরিং (Refactoring)
- কন্টিনিউয়াস ইন্টিগ্রেশন (Continuous Integration)
- টেস্ট-ড্রাইভেন ডেভেলপমেন্ট (Test-Driven Development)
- বিহেভিয়ার-ড্রাইভেন ডেভেলপমেন্ট (Behavior-Driven Development)
- কোড কভারেজ (Code Coverage)
- মকিং ফ্রেমওয়ার্ক (Mocking Framework)
- স্টাবিং (Stubbing)
- আর্গুমেন্ট ম্যাচিং (Argument Matching)
- কল ভেরিফিকেশন (Call Verification)
- ইনভার্সন অফ কন্ট্রোল (Inversion of Control)
- ডিপেন্ডেন্সি ইনজেকশন (Dependency Injection)
- ইউনিট টেস্টিং (Unit Testing)
- ইন্টিগ্রেশন টেস্টিং (Integration Testing)
- সিস্টেম টেস্টিং (System Testing)
এখনই ট্রেডিং শুরু করুন
IQ Option-এ নিবন্ধন করুন (সর্বনিম্ন ডিপোজিট $10) Pocket Option-এ অ্যাকাউন্ট খুলুন (সর্বনিম্ন ডিপোজিট $5)
আমাদের সম্প্রদায়ে যোগ দিন
আমাদের টেলিগ্রাম চ্যানেলে যোগ দিন @strategybin এবং পান: ✓ দৈনিক ট্রেডিং সংকেত ✓ একচেটিয়া কৌশলগত বিশ্লেষণ ✓ বাজারের প্রবণতা সম্পর্কে বিজ্ঞপ্তি ✓ নতুনদের জন্য শিক্ষামূলক উপকরণ