परिचय: क्यों उन्नत परीक्षण JavaScript-प्रोजेक्ट के लिए अनिवार्य है
\nNode.js पर आधुनिक विकास में, परीक्षण एक वैकल्पिक चरण नहीं रह गया है। कोड के गुणवत्तापूर्ण परीक्षण कवरेज के बिना, कोई भी रिफैक्टरिंग या नई कार्यक्षमता जोड़ना "रूसी रूलेट" में बदलने का जोखिम उठाता है। हालांकि, केवल कुछ assert लिखना पर्याप्त नहीं है। उन्नत स्तर पर, डेवलपर को तीन मुख्य परतों में महारत हासिल करनी चाहिए: यूनिट-टेस्ट (पृथक मॉड्यूल की जाँच), इंटीग्रेशन-टेस्ट (घटकों, DB, API की परस्पर क्रिया) और E2E-टेस्ट (उपयोगकर्ता क्रियाओं का अनुकरण)। इस लेख में, हम Node.js के उदाहरण के साथ आधुनिक टूल्स: Jest, Supertest और Playwright का उपयोग करके प्रत्येक परत के लिए व्यावहारिक तकनीकों पर चर्चा करेंगे।
\n\n1. यूनिट-टेस्टिंग: उन्नत स्तर पर अलगाव, मॉक और स्टब
\nयूनिट-टेस्ट बाहरी निर्भरताओं (DB, फ़ाइल सिस्टम, नेटवर्क अनुरोध) से अलग एक फ़ंक्शन या मॉड्यूल के काम की जाँच करते हैं। मुख्य कार्य इन निर्भरताओं को सही ढंग से मॉक करना है ताकि परीक्षण तेज़ और नियतात्मक हो।
\n\nJest में उन्नत मॉकिंग तकनीकें
\nएक उदाहरण पर विचार करें: एक फ़ंक्शन जो बाहरी API से डेटा लाता है और परिणाम को Redis में कैश करता है। हमें वास्तविक अनुरोध किए बिना कैशिंग लॉजिक का परीक्षण करना है।
\n// cacheService.js\nconst axios = require('axios');\nconst redis = require('redis');\n\nclass CacheService {\n constructor() {\n this.client = redis.createClient();\n }\n\n async fetchData(url) {\n const cached = await this.client.get(url);\n if (cached) return JSON.parse(cached);\n\n const response = await axios.get(url);\n await this.client.setEx(url, 3600, JSON.stringify(response.data));\n return response.data;\n }\n}\n\nmodule.exports = CacheService;\n\n\n// cacheService.test.js\nconst CacheService = require('./cacheService');\nconst axios = require('axios');\nconst redis = require('redis');\n\njest.mock('axios');\njest.mock('redis', () => ({\n createClient: jest.fn(() => ({\n get: jest.fn(),\n setEx: jest.fn()\n }))\n}));\n\ndescribe('CacheService', () => {\n let service;\n let mockRedisClient;\n\n beforeEach(() => {\n mockRedisClient = redis.createClient();\n service = new CacheService();\n });\n\n test('यदि कैश्ड डेटा मौजूद है तो उसे वापस करना चाहिए', async () => {\n const url = 'https://api.example.com/data';\n const cachedData = { id: 1, value: 'cached' };\n mockRedisClient.get.mockResolvedValue(JSON.stringify(cachedData));\n\n const result = await service.fetchData(url);\n\n expect(result).toEqual(cachedData);\n expect(axios.get).not.toHaveBeenCalled();\n });\n\n test('यदि कैश नहीं है तो डेटा लाना और कैश करना चाहिए', async () => {\n const url = 'https://api.example.com/data';\n const apiData = { id: 2, value: 'fresh' };\n mockRedisClient.get.mockResolvedValue(null);\n axios.get.mockResolvedValue({ data: apiData });\n\n const result = await service.fetchData(url);\n\n expect(result).toEqual(apiData);\n expect(mockRedisClient.setEx).toHaveBeenCalledWith(url, 3600, JSON.stringify(apiData));\n });\n});\n\nमुख्य बिंदु:
\n- \n
jest.mock('axios')स्वचालित रूप से पूरे axios मॉड्यूल को मॉक करता है। \n - Redis के लिए हम एक फ़ैक्टरी का उपयोग करते हैं जो
getऔरsetExविधियों वाला एक मॉक लौटाती है। \n - हम जाँचते हैं कि कैश होने पर बाहरी कॉल नहीं होती है। \n
2. इंटीग्रेशन-टेस्ट: वास्तविक DB और API के साथ अंतःक्रिया का परीक्षण
\nइंटीग्रेशन-टेस्ट जाँचते हैं कि सिस्टम के विभिन्न भाग एक साथ कैसे काम करते हैं। Node.js के लिए, इसका अर्थ अक्सर वास्तविक (या परीक्षण) डेटाबेस के साथ Express रूट्स का परीक्षण करना होता है। सबसे अच्छा टूल Jest के साथ Supertest है।
\n\nपरीक्षण DB और Supertest की सेटअप
\nउदाहरण: उपयोगकर्ता प्रबंधन के लिए API। हम अलगाव के लिए मेमोरी में SQLite का उपयोग करते हैं।