হ্যালো! আমি তোমার Simple Coding Tutor। বর্তমান লেকচারটি তোমার কোর্সের Section 15-এর একটি অত্যন্ত গুরুত্বপূর্ণ লেকচার, যার নাম “xUnit Basics”।
চলো, এই লেকচারটির সম্পূর্ণ বিষয়বস্তু ধাপে ধাপে এবং সহজভাবে বুঝে নিই।
📝 লেকচার সামারি (Summary for Quick Revision)
ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য পুরো লেকচারের মূল বিষয়গুলো নিচে তালিকাভুক্ত করা হলো:
- xUnit Introduction: এটি ASP.NET Core-এ Unit Testing এর জন্য অন্যতম জনপ্রিয় একটি 3rd party ফ্রেমওয়ার্ক।
- Alternatives: .NET-এ বিল্ট-ইন MSTest এবং আরেকটি ফ্রেমওয়ার্ক NUnit রয়েছে, তবে xUnit বেশি ফ্লেক্সিবল এবং MOQ এর সাথে খুব ভালো কাজ করে।
- Project Setup: মেইন প্রজেক্টের বাইরে একটি আলাদা “xUnit Test Project” তৈরি করতে হয়, যেখানে
xunitএবংxunit.runner.visualstudioপ্যাকেজ থাকে। - Why Unit Testing? ডেভেলপাররা তাদের নিজেদের লেখা মেথডগুলো বিভিন্ন ডামি ইনপুট (dummy inputs) দিয়ে চেক করে দেখেন যে মেথডটি ঠিকঠাক কাজ করছে কি না।
- [Fact] Attribute: এই অ্যাট্রিবিউটটি নির্দেশ করে যে নির্দিষ্ট মেথডটি একটি Unit Test।
- AAA Pattern: প্রতিটি Unit Test ৩টি ধাপে সম্পন্ন হয়— Arrange (ডেটা সেটআপ), Act (মেথড কল করা), এবং Assert (Expected ও Actual রেজাল্ট তুলনা করা)।
- Test Explorer: Visual Studio-এর এই উইন্ডো থেকে খুব সহজেই টেস্ট রান করানো এবং এর পাস/ফেইল স্ট্যাটাস দেখা যায়।
🧠 Comprehensive Breakdown (বিস্তারিত আলোচনা)
১. Introduction to xUnit [Priority: 9/10]
xUnit হলো ASP.NET Core-এ Unit Testing করার জন্য একটি অত্যন্ত জনপ্রিয় থার্ড-পার্টি ফ্রেমওয়ার্ক। Controllers, Services বা যেকোনো Classes টেস্ট করার জন্য এটি ব্যবহার করা হয়।
- কেন xUnit বেশি ব্যবহৃত হয়? .NET এর নিজস্ব
MSTestফ্রেমওয়ার্ক থাকা সত্ত্বেও xUnit বেশি জনপ্রিয় কারণ এটি অত্যন্ত Extensible (প্রয়োজন অনুযায়ী কাস্টমাইজ করা যায়), এর Learning Curve খুব সহজ, এবং এটিMOQ(Mocking framework) এর সাথে দারুণভাবে মানিয়ে যায়। - ASP.NET Core-এ “Clean Separation of Concerns” প্যাটার্ন ব্যবহার করা হয়, যার ফলে এর প্রতিটি কম্পোনেন্টকে আলাদাভাবে Unit Test করা খুব সহজ।
২. Project Setup [Priority: 8/10]
Unit Tests লেখার জন্য মেইন সলিউশনে একটি সম্পূর্ণ আলাদা প্রজেক্ট যুক্ত করতে হয়।
- কিভাবে তৈরি করবে? Solution এ Right-click -> Add New Project ->
xUnit Test Projectসিলেক্ট করতে হবে। - প্রজেক্টের নাম লেকচারে দেওয়া হয়েছে
CRUDTests। - এই প্রজেক্ট তৈরি হওয়ার সাথে সাথে দুটি গুরুত্বপূর্ণ প্যাকেজ বাই-ডিফল্ট ইনস্টল হয়ে যায়:
xunit(মূল ফ্রেমওয়ার্ক) এবংxunit.runner.visualstudio(Visual Studio-তে টেস্ট রান করানোর জন্য)।
৩. Anatomy of a Unit Test: The AAA Pattern [Priority: 10/10]
প্রতিটি Unit Test মেথডের ৩টি মূল অংশ থাকে, যাকে সংক্ষেপে AAA Pattern বলা হয়। এটি অত্যন্ত গুরুত্বপূর্ণ একটি কনসেপ্ট।
- Arrange: এই ধাপে ভেরিয়েবল ডিক্লেয়ার করা হয় এবং মেথড রান করানোর জন্য প্রয়োজনীয় ইনপুটগুলো প্রস্তুত করা হয়।
- Act: এই ধাপে মূল মেথডটিকে (যেটি আমরা টেস্ট করতে চাই) ইনপুটগুলো পাস করে কল করা হয় এবং তার Return Value রিসিভ করা হয়।
- Assert: এই ধাপে আমাদের Expected Value (যেটা আমরা আশা করছি) এবং Actual Value (যেটা মেথড আসলেই রিটার্ন করেছে) এর মধ্যে তুলনা করা হয়। যদি দুটো সমান হয়, তবে টেস্ট Pass করে, নইলে Fail করে।
- [Fact] Attribute: টেস্ট মেথডের উপরে
[Fact]অ্যাট্রিবিউট ব্যবহার করা হয়। এটি টেস্ট রানারকে বুঝিয়ে দেয় যে এই মেথডটি একটি Unit Test।
৪. Code Implementation: MyMath Example [Priority: 10/10]
লেকচারে একটি সহজ যোগ অংকের মেথড তৈরি করে তা টেস্ট করে দেখানো হয়েছে।
ধাপ ১: Service Class তৈরি করা (MyMath.cs)
public class MyMath
{
// এই মেথডটি দুটি সংখ্যার যোগফল রিটার্ন করবে
public int Add(int a, int b)
{
return a + b;
}
}
(নোট: ডেমো পারপাসে এটি টেস্ট প্রজেক্টেই তৈরি করা হয়েছে, তবে রিয়েল-ওয়ার্ল্ড প্রজেক্টে এটি মেইন প্রজেক্টের Services ফোল্ডারে থাকে।)
ধাপ ২: Unit Test লেখা (UnitTest1.cs)
using Xunit;
public class UnitTest1
{
[Fact]
public void Add_ShouldReturnSumOfTwoNumbers()
{
// 1. Arrange (প্রয়োজনীয় ডেটা সেটআপ)
MyMath mm = new MyMath();
int input1 = 10;
int input2 = 5;
int expected = 15; // আমরা জানি 10+5=15 হবে
// 2. Act (মেথডটি কল করা)
int actual = mm.Add(input1, input2);
// 3. Assert (তুলনা করা)
Assert.Equal(expected, actual);
}
}
কেন এই টেস্টটি লিখলাম? আমরা চেক করতে চাই ডেভেলপার ভুল করে a - b বা 0 রিটার্ন করে দিয়েছে কি না। যদি ভুল করে থাকে, তবে Expected (15) এবং Actual মিলবে না, এবং টেস্ট ফেইল করবে।
৫. Running the Tests (Test Explorer) [Priority: 7/10]
টেস্ট রান করানোর জন্য Visual Studio-তে “Test Explorer” ব্যবহার করা হয়।
- লেকচারে দেখানো হয়েছে:
View -> Test Explorerএ গিয়ে “Run all tests” বাটনে ক্লিক করতে হবে। - টেস্ট সফল হলে Green Icon দেখায়, আর ফেইল করলে Red Icon দেখায় এবং কেন ফেইল করেছে (যেমন Expected 15 but Actual 0) তার বিস্তারিত দেখায়।
💡 Shortcut Tricks:
- Visual Studio Shortcut: টেস্ট এক্সপ্লোরার ওপেন করতে
Ctrl + E, Tচাপতে পারো। আর সব টেস্ট একসাথে রান করতেCtrl + R, Aচাপতে পারো। - Visual Studio Code (VS Code) Shortcut: VS Code-এ ”.NET Core Test Explorer” এক্সটেনশন ইনস্টল থাকতে হবে। টেস্ট রান করার জন্য
Ctrl + Shift + PচেপেTest: Run All Testsকমান্ডটি চালাতে পারো।
💡 Best Practices & .NET 10 Updates
xUnit Best Practices:
- Naming Convention: টেস্ট মেথডের নাম দেখে যেন বোঝা যায় এটি কী টেস্ট করছে। একটি পপুলার কনভেনশন হলো
MethodName_StateUnderTest_ExpectedBehavior(যেমন:Add_WithPositiveNumbers_ReturnsCorrectSum)। - Clear AAA Spacing: কোড রিডেবিলিটি বাড়ানোর জন্য Arrange, Act, এবং Assert সেকশনগুলোর মাঝে একটি করে ফাঁকা লাইন (blank line) রাখা উচিত (যেমনটা উপরের কোডে দেখানো হয়েছে)।
- One Assert per Test: একটি Unit Test-এ সাধারণত একটি লজিক্যাল
Assertথাকাই উত্তম। এতে টেস্ট ফেইল করলে খুব সহজেই বোঝা যায় ঠিক কোন পয়েন্টে সমস্যা হয়েছে।
.NET 10 Context (xUnit Updates): xUnit এর বেসিক কনসেপ্ট বা AAA প্যাটার্নে .NET 6 থেকে .NET 10 এ কোনো পরিবর্তন আসেনি। তবে .NET 10 এ C# 13 এর নতুন ফিচারগুলো ব্যবহার করা যায়। যেমন, C# 12/13 এর Primary Constructors ব্যবহার করে তুমি টেস্ট ক্লাসে ডিপেন্ডেন্সিগুলো আরও ক্লিনভাবে ইনজেক্ট করতে পারো।
// .NET 10 / C# 12+ Primary Constructor Example in Tests
public class UnitTest1(MyMath _mathService) // Constructor injection directly in class declaration
{
// If you are using Dependency Injection in tests (usually via IClassFixture)
[Fact]
public void ExampleTest()
{
// ... test code
}
}
(তবে বেসিক মেথড টেস্টিংয়ের ক্ষেত্রে লেকচারের পদ্ধতিটিই সবসময় ব্যবহার করা হয়। শুধুমাত্র নিশ্চিত করবে যে তোমার xunit এবং Microsoft.NET.Test.Sdk নুগেট প্যাকেজগুলো .NET 10-এর সাথে কম্প্যাটিবল লেটেস্ট ভার্সনে আপডেট করা আছে।)