Java के साथ Docker एकीकरण परीक्षण: उन्नत स्तर
\nएकीकरण परीक्षण आधुनिक Java अनुप्रयोगों के विकास में एक महत्वपूर्ण चरण है, विशेष रूप से माइक्रोसर्विस आर्किटेक्चर में। Docker का उपयोग परीक्षण वातावरण को अलग करने की अनुमति देता है, जिससे पुनरुत्पादन क्षमता और बाहरी सेवाओं से स्वतंत्रता सुनिश्चित होती है। इस लेख में, हम Docker के साथ Java अनुप्रयोगों के एकीकरण परीक्षण की उन्नत तकनीकों पर चर्चा करेंगे, जिसमें Testcontainers लाइब्रेरी के साथ काम करना, कस्टम कंटेनरों का कॉन्फ़िगरेशन, अतुल्यकालिक परिदृश्यों का परीक्षण और CI/CD पाइपलाइनों में एकीकरण शामिल है। यह सामग्री उन डेवलपर्स के लिए है जो पहले से ही JUnit और Docker की मूल बातों से परिचित हैं।
\n\nएकीकरण परीक्षण के लिए Docker क्यों महत्वपूर्ण है?
\nपारंपरिक एकीकरण परीक्षण अक्सर समस्याओं का सामना करता है: अस्थिर परीक्षण डेटाबेस, पोर्ट विरोध, मैन्युअल वातावरण सेटअप। Docker हल्के, क्षणिक कंटेनर प्रदान करके इन समस्याओं का समाधान करता है। प्रत्येक परीक्षण अपना स्वयं का डेटाबेस, संदेश ब्रोकर या कैश शुरू कर सकता है, और पूरा होने के बाद उन्हें स्वचालित रूप से नष्ट कर सकता है। यह परीक्षणों को बनाता है:
\n- \n
- पृथक: प्रत्येक परीक्षण परिदृश्य एक साफ वातावरण में काम करता है। \n
- पुनरुत्पादनीय: स्थानीय मशीन और CI में समान व्यवहार। \n
- समानांतर: डायनामिक मैपिंग के कारण कंटेनर पोर्ट पर विरोध नहीं करते हैं। \n
Java के लिए सबसे लोकप्रिय लाइब्रेरी Testcontainers है, जो परीक्षणों से कंटेनरों को प्रबंधित करने के लिए एक सरल API प्रदान करती है।
\n\nTestcontainers सेटअप: सरल से जटिल तक
\nआइए एक बुनियादी उदाहरण से शुरू करें - PostgreSQL के साथ DAO लेयर का परीक्षण। pom.xml में निर्भरता जोड़ें:
<dependency>\n <groupId>org.testcontainers</groupId>\n <artifactId>testcontainers</artifactId>\n <version>1.19.3</version>\n <scope>test</scope>\n</dependency>\n<dependency>\n <groupId>org.testcontainers</groupId>\n <artifactId>postgresql</artifactId>\n <version>1.19.3</version>\n <scope>test</scope>\n</dependency>\nअब एक परीक्षण बनाते हैं जो PostgreSQL कंटेनर का उपयोग करता है:
\nimport org.junit.jupiter.api.Test;\nimport org.testcontainers.containers.PostgreSQLContainer;\nimport org.testcontainers.junit.jupiter.Container;\nimport org.testcontainers.junit.jupiter.Testcontainers;\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.ResultSet;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\n@Testcontainers\npublic class UserRepositoryIntegrationTest {\n\n @Container\n private PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15")\n .withDatabaseName("testdb")\n .withUsername("test")\n .withPassword("test");\n\n @Test\n void shouldSaveAndFindUser() throws Exception {\n // कंटेनर से डायनामिक URL प्राप्त करें\n String jdbcUrl = postgres.getJdbcUrl();\n String username = postgres.getUsername();\n String password = postgres.getPassword();\n\n try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {\n conn.createStatement().execute("CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name VARCHAR(255))");\n conn.createStatement().execute("INSERT INTO users (name) VALUES ('Alice')");\n ResultSet rs = conn.createStatement().executeQuery("SELECT name FROM users WHERE id = 1");\n rs.next();\n assertEquals("Alice", rs.getString("name"));\n }\n }\n}\nTestcontainers स्वचालित रूप से परीक्षणों से पहले कंटेनर शुरू करता है और बाद में रोक देता है। उन्नत स्तर के लिए, कस्टम कंटेनर का उपयोग करें (उदाहरण के लिए, पूर्व-लोड किए गए डेटा के साथ)