परिचय: C# में परीक्षण क्यों आवश्यक है?
\nआधुनिक C# (.NET) विकास में, कोड की गुणवत्ता कोई विलासिता नहीं, बल्कि एक आवश्यकता है। परीक्षण न केवल प्रोडक्शन में जाने से पहले बग्स को पकड़ने में मदद करता है, बल्कि यह जीवंत दस्तावेज़ीकरण के रूप में भी काम करता है और रिफैक्टरिंग को गति देता है। परीक्षण के तीन मुख्य स्तर हैं जो "टेस्ट पिरामिड" बनाते हैं: Unit (मॉड्यूलर), Integration (एकीकरण) और E2E (एंड-टू-एंड)। इस लेख में, हम C# में वास्तविक कोड उदाहरणों के साथ इनमें से प्रत्येक का विश्लेषण करेंगे।
\n\n1. यूनिट टेस्टिंग: गुणवत्ता की नींव
\nयूनिट टेस्ट बाहरी निर्भरताओं (डेटाबेस, फ़ाइल सिस्टम, API) से अलग कोड के एक पृथक टुकड़े (मेथड, क्लास) की जाँच करते हैं। .NET इकोसिस्टम में तीन लोकप्रिय फ्रेमवर्क हैं: xUnit (नए प्रोजेक्ट्स के लिए अनुशंसित), NUnit और MSTest।
\n\nमुख्य सिद्धांत (FIRST)
\n- \n
- Fast — तेज़ (मिलीसेकंड में)। \n
- Isolated — पृथक (मॉक का उपयोग करें)। \n
- Repeatable — दोहराने योग्य। \n
- Self-validating — स्व-सत्यापन (Assert) के साथ। \n
- Timely — समय पर। \n
xUnit और Moq के साथ यूनिट टेस्ट का उदाहरण
\nमान लीजिए, हमारे पास छूट की गणना के लिए एक सेवा है:
\npublic interface IDiscountService\n{\n decimal CalculateDiscount(decimal price, bool isLoyaltyMember);\n}\n\npublic class DiscountService : IDiscountService\n{\n public decimal CalculateDiscount(decimal price, bool isLoyaltyMember)\n {\n if (isLoyaltyMember) return price * 0.9m; // 10% छूट\n return price;\n }\n}\nMoq (निर्भरताओं के अनुकरण के लिए) और xUnit का उपयोग करते हुए परीक्षण:
\nusing Xunit;\nusing Moq;\n\npublic class DiscountServiceTests\n{\n [Fact]\n public void CalculateDiscount_WhenLoyaltyMember_ReturnsDiscountedPrice()\n {\n // Arrange\n var service = new DiscountService();\n var price = 100m;\n\n // Act\n var result = service.CalculateDiscount(price, true);\n\n // Assert\n Assert.Equal(90m, result);\n }\n\n [Theory]\n [InlineData(100, false, 100)]\n [InlineData(200, true, 180)]\n public void CalculateDiscount_MultipleCases_ReturnsCorrectValues(decimal price, bool isLoyalty, decimal expected)\n {\n var service = new DiscountService();\n var result = service.CalculateDiscount(price, isLoyalty);\n Assert.Equal(expected, result);\n }\n}\nसुझाव: एकल परीक्षणों के लिए [Fact] एट्रिब्यूट और पैरामीटरयुक्त परीक्षणों के लिए [Theory] + [InlineData] का उपयोग करें।
2. इंटीग्रेशन टेस्टिंग: घटकों के जुड़ाव की जाँच
\nइंटीग्रेशन टेस्ट जाँचते हैं कि कई मॉड्यूल एक साथ कैसे काम करते हैं — उदाहरण के लिए, कंट्रोलर, सेवा और वास्तविक डेटाबेस (या इसका विकल्प, जैसे in-memory SQLite)। ASP.NET Core में इसके लिए WebApplicationFactory का उपयोग किया जाता है।
WebApplicationFactory की सेटअप
\nएक टेस्ट क्लास बनाएं जो टेस्ट वेब होस्ट को चालू करता है:
\nusing Microsoft.AspNetCore.Mvc.Testing;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.Extensions.DependencyInjection;\nusing MyApp.Data;\n\npublic class CustomWebApplicationFactory : WebApplicationFactory<Program>\n{\n protected override void ConfigureWebHost(IWebHostBuilder builder)\n {\n builder.ConfigureServices(services =>\n {\n // वास्तविक DbContext को हटाएं\n var descriptor = services.SingleOrDefault(\n d => d.ServiceType == typeof(DbContextOptions<AppDbContext>));\n if (descriptor != null) services.Remove(descriptor);\n\n // in-memory डेटाबेस जोड़ें\n services.AddDbContext<AppDbContext>(options =>\n