परिचय: परीक्षण क्यों विलासिता नहीं, बल्कि आवश्यकता है
C# (.NET) में आधुनिक विकास की दुनिया में, कोड की गुणवत्ता न केवल उत्पाद के लॉन्च की गति को निर्धारित करती है, बल्कि इसकी प्रतिष्ठा को भी प्रभावित करती है। प्रोडक्शन में त्रुटियाँ, डिपेंडेंसी अपडेट के बाद अचानक सिस्टम क्रैश, या बिज़नेस लॉजिक का गलत काम करना - ये ऐसे परिदृश्य हैं जिन्हें सही ढंग से बनाए गए परीक्षण से टाला जा सकता है।
कई डेवलपर्स, विशेषकर शुरुआती, परीक्षणों को "अतिरिक्त काम" मानते हैं। हालाँकि, व्यवहार में परीक्षण डिबगिंग और रिफैक्टरिंग के घंटों को बचाता है। इस लेख में हम C# इकोसिस्टम में परीक्षण के तीन प्रमुख स्तरों पर चर्चा करेंगे: Unit (मॉड्यूलर), Integration (इंटीग्रेशन) और E2E (End-to-End)। आप देखेंगे कि प्रत्येक स्तर अपनी समस्याओं को कैसे हल करता है, किन टूल्स का उपयोग करना है, और साफ, रखरखाव योग्य परीक्षण कैसे लिखें।
1. Unit-परीक्षण: गुणवत्ता की नींव
Unit-परीक्षण कोड के अलग-अलग ब्लॉक (आमतौर पर एक मेथड या क्लास) को बाहरी डिपेंडेंसी से अलग करके जांचते हैं। C# में यह परीक्षण का सबसे तेज़ और स्थिर स्तर है। मुख्य उद्देश्य यह सुनिश्चित करना है कि प्रत्येक फंक्शन विभिन्न इनपुट डेटा पर सही ढंग से काम करे।
C# में Unit-परीक्षण के लिए उपकरण
.NET के लिए सबसे लोकप्रिय फ्रेमवर्क xUnit (Microsoft द्वारा अनुशंसित) और NUnit हैं। डिपेंडेंसी को बदलने के लिए Moq लाइब्रेरी या .NET में निर्मित FakeItEasy का उपयोग किया जाता है।
Unit-परीक्षण का उदाहरण (xUnit + Moq)
मान लीजिए, हमारे पास डिस्काउंट गणना सेवा है जो यूज़र रिपॉजिटरी पर निर्भर करती है:
public class DiscountService{ private readonly IUserRepository _userRepo;
public DiscountService(IUserRepository userRepo) { _userRepo = userRepo; }
public decimal CalculateDiscount(int userId, decimal orderTotal) { var user = _userRepo.GetById(userId); if (user.IsVip) return orderTotal * 0.2m; // 20% छूट return orderTotal * 0.05m; // 5% छूट }}इस मेथड के लिए परीक्षण:
public class DiscountServiceTests{ [Fact] public void CalculateDiscount_WhenUserIsVip_Returns20Percent() { // Arrange var mockRepo = new Mock<IUserRepository>(); mockRepo.Setup(repo => repo.GetById(1)) .Returns(new User { Id = 1, IsVip = true }); var service = new DiscountService(mockRepo.Object);
// Act var result = service.CalculateDiscount(1, 100m);
// Assert Assert.Equal(20m, result); }}महत्वपूर्ण: Unit-परीक्षणों में हम वास्तविक डेटाबेस का उपयोग नहीं करते। हम DiscountService की लॉजिक को अलग करने के लिए mock का उपयोग करते हैं।
2. इंटीग्रेशन परीक्षण: घटकों के जुड़ाव की जाँच
इंटीग्रेशन परीक्षण कई वास्तविक घटकों के बीच परस्पर क्रिया की जाँच करते हैं: डेटाबेस, API, फ़ाइल सिस्टम। .NET में इसके लिए अक्सर WebApplicationFactory (ASP.NET Core के लिए) और टेस्ट कंटेनर (Testcontainers) का उपयोग किया जाता है।
Integration-परीक्षणों की विशेषताएँ
- Unit-परीक्षणों से धीमे — इनमें इंफ्रास्ट्रक्चर (DB, HTTP-सर्वर) को चालू करना पड़ता है।
- रखरखाव में महँगे — परीक्षण वातावरण की स्थिति को प्रबंधित करना आवश्यक है।
- मूल्य — ये कॉन्फ़िगरेशन, डेटा मैपिंग और वास्तविक DB के साथ काम करने में समस्याओं का पता लगाते हैं।
Integration-परीक्षण का उदाहरण (ASP.NET Core + xUnit)
मान लीजिए, हमारे पास ऑर्डर के लिए एक कंट्रोलर है। परीक्षण जाँचेगा कि वास्तविक API का अनुरोध सही JSON लौटाता है:
public class OrdersApiTests : IClassFixture<WebApplicationFactory<Program>>{ private readonly HttpClient _client;
public OrdersApiTests(WebApplicationFactory<Program> factory) { _client = f