TypeScript इंटीग्रेशन टेस्टिंग Docker के साथ: उन्नत स्तर
\n\nइंटीग्रेशन टेस्टिंग सिस्टम के विभिन्न घटकों के बीच इंटरैक्शन की जांच करने का एक महत्वपूर्ण चरण है। TypeScript एप्लिकेशन, विशेष रूप से माइक्रोसर्विसेज आर्किटेक्चर के लिए, Docker एक अपरिहार्य टूल बन जाता है। इस लेख में, हम Docker का उपयोग करके इंटीग्रेशन टेस्ट सेटअप और निष्पादन की उन्नत तकनीकों पर चर्चा करेंगे, जो आपकी डेवलपमेंट की विश्वसनीयता और गति को बढ़ाने में मदद करेंगी।
\n\n1. TypeScript इंटीग्रेशन टेस्टिंग के लिए Docker क्यों?
\nDocker टेस्ट एनवायरनमेंट को अलग करता है, जिससे उनकी पुनरुत्पादन क्षमता सुनिश्चित होती है। डेटाबेस, मैसेज क्यू और अन्य डिपेंडेंसी को मैन्युअल रूप से सेट करने के बजाय, आप उन्हें कंटेनर में चलाते हैं। यह TypeScript प्रोजेक्ट्स के लिए विशेष रूप से महत्वपूर्ण है, जहां टाइपिंग रनटाइम एरर को छिपा सकती है जो इंटीग्रेशन के दौरान ही सामने आते हैं।
\n- \n
- आइसोलेशन: प्रत्येक टेस्ट एक साफ एनवायरनमेंट में चलता है \n
- गति: कंटेनर सेकंडों में शुरू हो जाते हैं \n
- समानांतरता: एक साथ डिपेंडेंसी के विभिन्न वर्जन का परीक्षण कर सकते हैं \n
2. टेस्ट एनवायरनमेंट के लिए Docker Compose सेटअप
\nहम docker-compose.test.yml बनाएंगे जो PostgreSQL, Redis और टेस्ट के लिए एप्लिकेशन को चलाता है:
version: '3.8'\nservices:\n db-test:\n image: postgres:15-alpine\n environment:\n POSTGRES_DB: testdb\n POSTGRES_USER: test\n POSTGRES_PASSWORD: testpass\n ports:\n - "5433:5432"\n tmpfs: /var/lib/postgresql/data\n\n redis-test:\n image: redis:7-alpine\n ports:\n - "6380:6379"\n\n app-test:\n build:\n context: .\n dockerfile: Dockerfile.test\n environment:\n DATABASE_URL: postgres://test:testpass@db-test:5432/testdb\n REDIS_URL: redis://redis-test:6379\n depends_on:\n - db-test\n - redis-test\n command: ["npm", "run", "test:integration"]\nयहां हम डेटाबेस के लिए tmpfs का उपयोग कर रहे हैं ताकि डेटा रन के बीच सेव न हो, जिससे टेस्ट तेज हो जाते हैं।
3. TestContainers के साथ TypeScript टेस्ट की उन्नत सेटिंग
\ntestcontainers लाइब्रेरी आपको TypeScript कोड से सीधे कंटेनर प्रबंधित करने की अनुमति देती है। यह लचीलापन प्रदान करती है: आप केवल विशिष्ट टेस्ट सीनारियो के लिए कंटेनर चला सकते हैं।
इंस्टॉलेशन:
\nnpm install --save-dev testcontainers\nडायनामिक कंटेनर के साथ इंटीग्रेशन टेस्ट का उदाहरण:
\nimport { GenericContainer, StartedTestContainer } from 'testcontainers';\nimport { Client } from 'pg';\nimport { UserService } from './user-service';\n\nlet container: StartedTestContainer;\nlet client: Client;\n\nbeforeAll(async () => {\n // PostgreSQL कंटेनर शुरू करें\n container = await new GenericContainer('postgres:15-alpine')\n .withEnvironment({\n POSTGRES_DB: 'test',\n POSTGRES_USER: 'test',\n POSTGRES_PASSWORD: 'test'\n })\n .withExposedPorts(5432)\n .start();\n\n // टेस्ट DB से कनेक्ट करें\n const host = container.getHost();\n const port = container.getMappedPort(5432);\n client = new Client({\n host,\n port,\n database: 'test',\n user: 'test',\n password: 'test'\n });\n await client.connect();\n\n // माइग्रेशन चलाएं\n await client.query(`\n CREATE TABLE users (\n id SERIAL PRIMARY KEY,\n email VARCHAR(255) UNIQUE NOT NULL,\n name VARCHAR(255)\n )\n `);\n});\n\nafterAll(async () => {\n await client.end();\n await container.stop();\n});\n\ntest('UserService.createUser डेटाबेस में यूज़र बनाता है', async () => {\n const userService = new UserService(client);\n const user = await userService.createUser({\n email: 'test@example.com',\n name: 'Test User'\n });\n\n const result = await client.query('SELECT * FROM users WHERE email = $1', ['test@example.com']);\n expect(result.rows[0]).toMatchObject({\n email: 'test@example.com',\n