اختبار التكامل لـ Kotlin مع Docker: المستوى المتقدم
\n\nاختبار التكامل هو مرحلة حاسمة في تطوير الخدمات المصغرة الحديثة باستخدام Kotlin. استخدام Docker يسمح بإنشاء بيئات معزولة وقابلة للتكرار، أقرب ما يكون إلى بيئة الإنتاج. في هذه المقالة، سنستعرض تقنيات متقدمة لاختبار التكامل لتطبيقات Kotlin مع Docker، بما في ذلك Testcontainers، تحسين الأداء، والتكامل مع CI/CD.
\n\n1. إعداد Testcontainers لمشروع Kotlin
\n\nTestcontainers هي مكتبة لـ JUnit تدير دورة حياة حاويات Docker مباشرة من الاختبارات. بالنسبة لـ Kotlin، توفر امتدادات DSL مريحة.
\n\n1.1. إضافة التبعيات
\n\nأضف التبعيات التالية إلى ملف build.gradle.kts:
testImplementation("org.testcontainers:testcontainers:1.19.3")\ntestImplementation("org.testcontainers:postgresql:1.19.3")\ntestImplementation("org.testcontainers:junit-jupiter:1.19.3")\ntestImplementation("org.jetbrains.kotlin:kotlin-test")\n\n1.2. مثال أساسي مع PostgreSQL
\n\nلننظر إلى اختبار لمستودع يعمل مع PostgreSQL:
\n\nimport org.junit.jupiter.api.Test\nimport org.testcontainers.containers.PostgreSQLContainer\nimport org.testcontainers.junit.jupiter.Container\nimport org.testcontainers.junit.jupiter.Testcontainers\n\n@Testcontainers\nclass UserRepositoryTest {\n\n companion object {\n @Container\n val postgres = PostgreSQLContainer<Nothing>("postgres:15-alpine").apply {\n withDatabaseName("testdb")\n withUsername("test")\n withPassword("test")\n }\n }\n\n @Test\n fun `should save and retrieve user`() {\n val dataSource = createDataSource(postgres.jdbcUrl, postgres.username, postgres.password)\n val repository = UserRepository(dataSource)\n\n val user = User(id = null, name = "Alice", email = "alice@example.com")\n val saved = repository.save(user)\n\n val found = repository.findById(saved.id!!)\n assert(found?.name == "Alice")\n }\n\n private fun createDataSource(jdbcUrl: String, username: String, password: String): DataSource {\n // HikariCP أو أي تجمع اتصالات آخر\n return HikariDataSource(HikariConfig().apply {\n this.jdbcUrl = jdbcUrl\n this.username = username\n this.password = password\n driverClassName = "org.postgresql.Driver"\n })\n }\n}\n\nيقوم Testcontainers تلقائيًا بتشغيل الحاوية قبل الاختبارات وإيقافها بعد الانتهاء. هذا يضمن نقاء بيئة الاختبار.
\n\n2. اختبار خدمات متعددة باستخدام Docker Compose
\n\nفي الخدمات المصغرة الحقيقية، غالبًا ما يكون التفاعل مع أنظمة خارجية متعددة مطلوبًا: قواعد البيانات، قوائم انتظار الرسائل، وذاكرة التخزين المؤقت. استخدم DockerComposeContainer لرفع مجموعة كاملة.
2.1. تكوين Docker Compose
\n\nأنشئ ملف docker-compose-test.yml:
version: '3.8'\nservices:\n postgres:\n image: postgres:15-alpine\n environment:\n POSTGRES_DB: testdb\n POSTGRES_USER: test\n POSTGRES_PASSWORD: test\n redis:\n image: redis:7-alpine\n rabbitmq:\n image: rabbitmq:3-management-alpine\n\n2.2. اختبار التكامل مع Docker Compose
\n\nمثال لاختبار يتحقق من تفاعل الخدمة مع قاعدة البيانات، ذاكرة التخزين المؤقت، وقائمة الانتظار:
\n\nimport org.junit.jupiter.api.Test\nimport org.testcontainers.containers.DockerComposeContainer\nimport org.testcontainers.junit.jupiter.Container\nimport org.testcontainers.junit.jupiter.Testcontainers\nimport java.io.File\n\n@Testcontainers\nclass OrderServiceIntegrationTest {\n\n companion object {\n @Container\n val environment = DockerComposeContainer(\n File("src/test/resources/docker-com