परिचय: Docker के साथ एकीकरण परीक्षण क्यों आवश्यक है?
Kotlin में आधुनिक अनुप्रयोगों, विशेष रूप से माइक्रोसर्विसेज के विकास में, यह जांचना महत्वपूर्ण है कि सिस्टम के घटक एक-दूसरे के साथ और बाहरी निर्भरताओं (डेटाबेस, संदेश कतारें, कैश) के साथ कैसे इंटरैक्ट करते हैं। यूनिट परीक्षण कोड को अलग करते हैं, लेकिन यह गारंटी नहीं देते कि एप्लिकेशन वास्तविक वातावरण में सही ढंग से काम करता है।
Docker के साथ एकीकरण परीक्षण इस समस्या का समाधान करता है। Docker आपको परीक्षण चलाने से ठीक पहले आवश्यक सेवाओं (PostgreSQL, Redis, Kafka) के साथ अलग-अलग कंटेनर बनाने और परीक्षण पूरा होने के बाद उन्हें स्वचालित रूप से नष्ट करने की अनुमति देता है। यह प्रदान करता है:
- पुनरुत्पादन क्षमता: परीक्षण हमेशा समान वातावरण में चलते हैं।
- पृथक्करण: कंटेनर डेवलपर के स्थानीय वातावरण को प्रभावित नहीं करते।
- गति: कंटेनर मिनटों के बजाय सेकंड में शुरू होते हैं।
इस लेख में, हम Docker, Testcontainers लाइब्रेरी और Docker Compose का उपयोग करके Kotlin एप्लिकेशन के लिए एकीकरण परीक्षण सेट अप करने का तरीका समझेंगे। आपको तैयार कोड उदाहरण और सर्वोत्तम अभ्यास प्राप्त होंगे।
1. एकीकरण परीक्षणों के लिए Kotlin प्रोजेक्ट सेट अप करना
1.1. build.gradle.kts में निर्भरताएँ
आरंभ करने के लिए, अपनी build.gradle.kts फ़ाइल में आवश्यक निर्भरताएँ जोड़ें। हम JUnit 5, Testcontainers और PostgreSQL के लिए ड्राइवर का उपयोग करेंगे:
dependencies { // एप्लिकेशन की मुख्य निर्भरताएँ implementation("org.jetbrains.kotlin:kotlin-stdlib") implementation("org.postgresql:postgresql:42.7.1")
// परीक्षण testImplementation("org.junit.jupiter:junit-jupiter:5.10.1") testImplementation("org.testcontainers:testcontainers:1.19.3") testImplementation("org.testcontainers:postgresql:1.19.3") testImplementation("org.testcontainers:junit-jupiter:1.19.3")}
tasks.test { useJUnitPlatform()}1.2. परीक्षण वर्ग की मूल संरचना
आइए एकीकरण परीक्षण के लिए एक सरल वर्ग बनाएं जो PostgreSQL कंटेनर को शुरू करेगा:
import org.junit.jupiter.api.Testimport org.testcontainers.containers.PostgreSQLContainerimport org.testcontainers.junit.jupiter.Containerimport org.testcontainers.junit.jupiter.Testcontainersimport java.sql.DriverManager
@Testcontainersclass UserRepositoryIntegrationTest {
companion object { @Container val postgres = PostgreSQLContainer<Nothing>("postgres:15-alpine") .withDatabaseName("testdb") .withUsername("test") .withPassword("test") }
@Test fun `should connect to database and execute query`() { val jdbcUrl = postgres.jdbcUrl val username = postgres.username val password = postgres.password
val connection = DriverManager.getConnection(jdbcUrl, username, password) val statement = connection.createStatement()
statement.execute("CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name VARCHAR(100))") statement.execute("INSERT INTO users (name) VALUES ('Alice')")
val resultSet = statement.executeQuery("SELECT COUNT(*) FROM users") resultSet.next() val count = resultSet.getInt(1)
assert(count == 1) println("परीक्षण पास: $count उपयोगकर्ता मिले") }}ध्यान दें: @Testcontainers एनोटेशन स्वचालित रूप से कंटेनर के जीवनचक्र का प्रबंधन करता है। यह वर्ग में सभी परीक्षणों से पहले शुरू होता है और उनके पूरा होने के बाद बंद हो जाता है।
2. एकाधिक कंटेनरों (Docker Compose) के साथ परीक्षण
वास्तविक परियोजनाओं में, अक्सर एक साथ कई सेवाओं की आवश्यकता होती है: डेटाबेस, Redis, Kafka। Testcontainers Docker Compose का समर्थन करता है, जो आपको एक फ़ाइल में संपूर्ण बुनियादी ढाँचे का वर्णन करने की अनुमति देता है