Kotlin के साथ Docker का इंटीग्रेशन टेस्टिंग: उन्नत स्तर
\n\nइंटीग्रेशन टेस्टिंग एप्लिकेशन घटकों के इंटरैक्शन की जांच करने का एक महत्वपूर्ण चरण है। Kotlin और Docker के पारिस्थितिकी तंत्र में, कंटेनरीकरण के कारण यह प्रक्रिया एक नए स्तर पर पहुँच जाती है। इस लेख में, हम Docker, Testcontainers और Kotlin DSL का उपयोग करके इंटीग्रेशन टेस्ट को सेटअप और निष्पादित करने की उन्नत तकनीकों पर चर्चा करेंगे।
\n\n1. मूल बातें: Kotlin DSL के साथ Testcontainers
\nTestcontainers Java/Kotlin के लिए एक लाइब्रेरी है जो टेस्ट के अंदर Docker कंटेनरों के जीवनचक्र को प्रबंधित करती है। Kotlin के लिए एक सुविधाजनक DSL उपलब्ध है जो कॉन्फ़िगरेशन को सरल बनाता है।
\n\n// build.gradle.kts\ndependencies {\n testImplementation("org.testcontainers:testcontainers:1.20.0")\n testImplementation("org.testcontainers:postgresql:1.20.0")\n testImplementation("org.jetbrains.kotlin:kotlin-test")\n}\n\n\nPostgreSQL के साथ टेस्ट का उदाहरण:
\nimport org.testcontainers.containers.PostgreSQLContainer\nimport org.testcontainers.junit.jupiter.Container\nimport org.testcontainers.junit.jupiter.Testcontainers\nimport org.junit.jupiter.api.Test\n\n@Testcontainers\nclass UserRepositoryTest {\n\n companion object {\n @Container\n val postgres = PostgreSQLContainer<Nothing>("postgres:15-alpine")\n .withDatabaseName("testdb")\n .withUsername("test")\n .withPassword("test")\n }\n\n @Test\n fun `should connect to database`() {\n val jdbcUrl = postgres.jdbcUrl\n // DataSource में jdbcUrl का उपयोग करें\n println("Connected to: $jdbcUrl")\n }\n}\n\n\n2. कंटेनरों का समानांतर रन
\nटेस्ट को गति देने के लिए, कंटेनरों को समानांतर रूप से चलाया जा सकता है। हालांकि, पोर्ट विरोध को ध्यान में रखना महत्वपूर्ण है। डायनामिक पोर्ट और GenericContainer के माध्यम से सिंक्रोनाइज़ेशन का उपयोग करें।
import org.testcontainers.containers.GenericContainer\nimport org.testcontainers.containers.Network\nimport org.testcontainers.containers.wait.strategy.Wait\nimport java.time.Duration\n\nclass ParallelContainerTest {\n\n companion object {\n private val network = Network.newNetwork()\n\n private val redis1 = GenericContainer<Nothing>("redis:7-alpine")\n .withNetwork(network)\n .withNetworkAliases("redis1")\n .withExposedPorts(6379)\n .waitingFor(Wait.forListeningPort())\n\n private val redis2 = GenericContainer<Nothing>("redis:7-alpine")\n .withNetwork(network)\n .withNetworkAliases("redis2")\n .withExposedPorts(6379)\n .waitingFor(Wait.forListeningPort())\n\n init {\n redis1.start()\n redis2.start()\n }\n }\n\n @Test\n fun `parallel containers test`() {\n val port1 = redis1.getMappedPort(6379)\n val port2 = redis2.getMappedPort(6379)\n println("Redis1 port: $port1, Redis2 port: $port2")\n }\n}\n\n\nआइसोलेशन के लिए Network और कंटेनर की तैयारी की प्रतीक्षा के लिए waitingFor का उपयोग करें।
3. टेस्ट में Docker Compose
\nजटिल परिदृश्यों (डेटाबेस + मैसेज ब्रोकर + कैश) के लिए DockerComposeContainer का उपयोग करना सुविधाजनक है। यह docker-compose.yml को लोड करता है और सभी सेवाओं का प्रबंधन करता है।
import org.testcontainers.containers.DockerComposeContainer\nimport java.io.File\n\nclass FullStackTest {\n\n companion object {\n private val compose = DockerComposeContainer<Nothing>(\n File("src/test/resources/docker-compose.yml")\n ).apply {\n withExposedService("postgres_1", 5432)\n withExposedService("redis_1", 6379)\n withLocalCompose(true)\n start()\n }\n }\n\n @Test\n fun `full integration test`() {\n val pgPort = compose.getServicePort("postgres_1", 5432)\n val redisPort = compose.getServicePort