C# के साथ Docker एकीकरण परीक्षण: उन्नत स्तर
\n\nएकीकरण परीक्षण C# विकास का एक महत्वपूर्ण चरण है, जो सिस्टम घटकों के वास्तविक निर्भरताओं: डेटाबेस, संदेश कतारें, बाहरी API के साथ इंटरैक्शन की जांच करने की अनुमति देता है। इस उद्देश्य के लिए Docker का उपयोग उद्योग मानक बन गया है, लेकिन उन्नत स्तर पर अलगाव, प्रदर्शन और समानांतर निष्पादन के प्रश्न उठते हैं। इस लेख में, हम Testcontainers लाइब्रेरी और उन्नत कॉन्फ़िगरेशन का उपयोग करके Docker के साथ C# एकीकरण परीक्षण की पेशेवर तकनीकों का विश्लेषण करेंगे।
\n\n1. .NET के लिए Testcontainers सेटअप: बुनियादी बुनियादी ढाँचा
\n\n.NET के लिए Testcontainers लाइब्रेरी परीक्षण वातावरण में Docker कंटेनरों को प्रोग्रामेटिक रूप से प्रबंधित करने की अनुमति देती है। मैन्युअल docker-compose चलाने के विपरीत, Testcontainers प्रत्येक परीक्षण वर्ग या मॉड्यूल के लिए स्वचालित रूप से कंटेनरों को शुरू और बंद करता है, वातावरण की शुद्धता सुनिश्चित करता है।
NuGet के माध्यम से पैकेज स्थापित करें:
\ndotnet add package Testcontainers --version 3.9.0\ndotnet add package Testcontainers.PostgreSql --version 3.9.0\ndotnet add package Testcontainers.MsSql --version 3.9.0\n\nPostgreSQL के साथ एकीकरण परीक्षणों के लिए बुनियादी वर्ग का उदाहरण:
\nusing Testcontainers.PostgreSql;\nusing Xunit;\n\npublic class DatabaseFixture : IAsyncLifetime\n{\n private readonly PostgreSqlContainer _container = new PostgreSqlBuilder()\n .WithImage("postgres:15-alpine")\n .WithDatabase("testdb")\n .WithUsername("testuser")\n .WithPassword("testpass")\n .Build();\n\n public string ConnectionString => _container.GetConnectionString();\n\n public async Task InitializeAsync()\n {\n await _container.StartAsync();\n }\n\n public async Task DisposeAsync()\n {\n await _container.StopAsync();\n }\n}\n\nअब प्रत्येक परीक्षण वर्ग डेटाबेस का एक अलग इंस्टेंस प्राप्त करने के लिए इस फिक्स्चर का उपयोग कर सकता है।
\n\n2. परीक्षण अलगाव और कंटेनर स्थिति प्रबंधन
\n\nउन्नत स्तर पर अलगाव पर सूक्ष्म नियंत्रण की आवश्यकता होती है। पूरे परीक्षण सूट के लिए एक कंटेनर के बजाय, प्रति परीक्षण वर्ग एक कंटेनर या प्रति परीक्षण भी एक कंटेनर का उपयोग करें। यह परीक्षणों के बीच डेटाबेस की "गंदी" स्थिति को रोकता है।
\n\nxUnit में Collection विशेषता के माध्यम से कार्यान्वयन:
[CollectionDefinition("Database collection")]\npublic class DatabaseCollection : ICollectionFixture<DatabaseFixture>\n{\n}\n\n[Collection("Database collection")]\npublic class UserRepositoryTests\n{\n private readonly DatabaseFixture _fixture;\n\n public UserRepositoryTests(DatabaseFixture fixture)\n {\n _fixture = fixture;\n }\n\n [Fact]\n public async Task CreateUser_ShouldPersistUser()\n {\n // Arrange\n await using var context = new AppDbContext(_fixture.ConnectionString);\n await context.Database.EnsureCreatedAsync();\n var repo = new UserRepository(context);\n\n // Act\n var user = new User { Name = "Test User" };\n await repo.CreateAsync(user);\n\n // Assert\n var savedUser = await context.Users.FindAsync(user.Id);\n Assert.NotNull(savedUser);\n }\n}\n\nपरीक्षण स्तर पर पूर्ण अलगाव के लिए ITestOutputHelper का उपयोग करें और DisposeAsync विधि के अंदर कंटेनर बनाएँ:
public class IsolatedTest : IAsyncLifetime\n{\n private PostgreSqlContainer _container;\n\n public async Task InitializeAsync()\n {\n _container = new PostgreSqlBuilder().Build();\n await _container.StartAsync();\n }\n\n public async Task DisposeAsync()\n {\n await _container.DisposeAsync();\n }\n}\n\n3. समानांतर परीक्षण निष्पादन और संसाधन प्रबंधन
\n\nमुख्य चुनौतियों में से एक