اختبار التكامل C# مع Docker: المستوى المتقدم
\nاختبار التكامل هو مرحلة أساسية لضمان الجودة في تطبيقات .NET الحديثة. استخدام Docker يسمح بإنشاء بيئات معزولة وقابلة للتكرار، أقرب ما يكون إلى بيئة الإنتاج. في هذه المقالة، سنستعرض التقنيات المتقدمة لاختبار التكامل C# مع Docker: من إعداد Testcontainers إلى تنظيم خطوط أنابيب CI/CD.
\nالمادة موجهة للمطورين الذين هم على دراية بأساسيات اختبار الوحدات والمفاهيم الأساسية لـ Docker. سنتعمق في إدارة دورة حياة الحاويات، والعمل مع خدمات متعددة، وتصحيح الأخطاء، وتحسين وقت تنفيذ الاختبارات.
\n\n1. إعداد Testcontainers لـ .NET
\nTestcontainers هي مكتبة تدير حاويات Docker من كود الاختبارات. تقوم تلقائياً بإنشاء الحاويات وتشغيلها وإيقافها، مما يضمن عزل كل اختبار.
\nللبداية، قم بتثبيت الحزمة في مشروع الاختبار الخاص بك:
\ndotnet add package Testcontainers\nمثال أساسي — اختبار مستودع مع PostgreSQL:
\nusing Testcontainers.PostgreSql;\nusing Xunit;\n\npublic class UserRepositoryTests : IAsyncLifetime\n{\n private readonly PostgreSqlContainer _postgresContainer;\n\n public UserRepositoryTests()\n {\n // إعداد الحاوية مع PostgreSQL\n _postgresContainer = new PostgreSqlBuilder()\n .WithImage("postgres:15")\n .WithDatabase("testdb")\n .WithUsername("test")\n .WithPassword("test123")\n .WithCleanUp(true)\n .Build();\n }\n\n public async Task InitializeAsync()\n {\n // تشغيل الحاوية قبل جميع الاختبارات\n await _postgresContainer.StartAsync();\n }\n\n public async Task DisposeAsync()\n {\n // إيقاف الحاوية وحذفها\n await _postgresContainer.DisposeAsync();\n }\n\n [Fact]\n public async Task AddUser_ShouldCreateUser()\n {\n // الحصول على سلسلة الاتصال بالحاوية\n var connectionString = _postgresContainer.GetConnectionString();\n var repository = new UserRepository(connectionString);\n\n await repository.AddUserAsync(new User { Name = "Test User" });\n var user = await repository.GetUserByNameAsync("Test User");\n\n Assert.NotNull(user);\n Assert.Equal("Test User", user.Name);\n }\n}\nهام: استخدم IAsyncLifetime لإدارة الحاوية. هذا يضمن أن كل فئة اختبار تحصل على نسخة جديدة من قاعدة البيانات.
2. بنية متعددة الحاويات مع Docker Compose
\nالتطبيقات الحقيقية تعتمد على خدمات متعددة: قواعد البيانات، قوائم انتظار الرسائل، التخزين المؤقت. Testcontainers تدعم Docker Compose، مما يسمح بتشغيل بنية تحتية كاملة.
\nقم بتثبيت الحزمة الإضافية:
\ndotnet add package Testcontainers.Compose\nمثال لملف docker-compose.test.yml:
version: '3.8'\nservices:\n postgres:\n image: postgres:15\n environment:\n POSTGRES_USER: test\n POSTGRES_PASSWORD: test\n POSTGRES_DB: testdb\n redis:\n image: redis:7-alpine\nالاستخدام في الاختبار:
\nusing Testcontainers.Compose;\n\npublic class OrderServiceTests\n{\n private readonly DockerComposeContainer _compose;\n\n public OrderServiceTests()\n {\n _compose = new DockerComposeContainer()\n .WithComposeFilePath("docker-compose.test.yml")\n .WithEnvironment("ASPNETCORE_ENVIRONMENT", "Testing")\n .Build();\n }\n\n [Fact]\n public async Task CreateOrder_ShouldSaveToDbAndCache()\n {\n await _compose.StartAsync();\n \n var dbConnection = _compose.GetConnectionString("postgres", 5432);\n var redisConnection = _compose.GetConnectionString("redis", 6379